有什么好的数据结构可以用来表示分子吗?
我在想,也许我把它表示成一个图,把每个原子都变成一个顶点,然而,有机化合物有很多碳和氢,这是很常见的。你要怎么编号?是否有一个很好的方法来表示分子,但同时,有一个有效的.contains()方法?
其中最基本的用途之一是检查化合物是否含有羰基,或苯氢,甚至苯环。
发布于 2015-05-07 03:11:42
(生物化学专业毕业,有30年软件开发经验)
非有机分子“相对”简单。有趣的是那些可以与自己结合的组合,比如C,N,O,Si,因为你可以得到一些非常有趣的组合。苯环是一个非常简单的例子。有些变体用氮气代替了碳,很快就变得奇怪了。
我从一个" atom“对象开始,从它继承各种类型的原子。
每个“原子”对象都包含一个原子对象列表来表示各种键,这样氮就有一个固定大小的3的列表,然后它可以存储到其他三个原子的链接。双键可以表示为重复条目。
每个原子都有关于它可以合法地与之结合的规则,以及如何结合的规则。
因此,你可以毫不含糊地合成相当复杂的分子,因为碳#1上的键3与氢2上的键1相连,等等。
希望这有意义..。
发布于 2015-05-07 01:16:34
建立模型的第一个诱惑是使用四叉树式的数据结构。每个碳原子有四个连接,每个氧气两个,每个氢一个。但我不认为这是正确的解决办法。
我认为适当的解决办法已经发明出来了。要使用的数据结构是字符串。
想想看。化学家们已经对有机化合物进行了很长时间的建模。如果你给化学家CH4看一看,他们马上就会认出那是甲烷。向他们展示CH3CH2OH,他们就会认识到这是乙醇。他们之所以认识到这一点,是因为他们将CH3CH2组合为"eth“化合物(意为两个碳原子),将OH识别为”醇“或醇基。
我们也有一个预先存在的方法来搜索和识别子字符串-正则表达式。
因此,为了编程地表示一个有机化合物,我将一个化合物定义为包含一个字符串,代表它的化学公式,一个字符串定义它的化学名称。它可以有方法来识别该化合物具有哪些“特殊”性质。
C#中的一个示例类:
public class OrganicCompound
{
private Regex benzineRingRegex;
public OrganicCompound(string formula, NameCalculator nameCalculator, Regex benzineRingRegex)
{
this.Formula = formula;
this.Name = nameCalculator.CalculateName(formula);
this.benzineRingRegex = benzineRingRegex
}
public string Formula { get; private set; }
public string Name { get; private set; }
public bool HasBenzeneRing()
{
return Regex.IsMatch(this.Formula, benzineRingRegex);
}
}显然,您需要编写nameCalculator类,它根据公式计算名称。您需要创建正则表达式,它定义了一个汽油环。为要搜索的每个组定义额外的正则表达式。
用这种方法对化合物进行建模的优点是,它的语言完全属于最终用户的业务领域。作为开发人员,您所需要知道的就是要搜索的字符串,这些字符串可以很容易地由教科书或化学家提供。
如果需要这些化学物质的结构表示法,我建议保持公式的微笑表示法。
微笑化学式表示
https://softwareengineering.stackexchange.com/questions/283143
复制相似问题