是否有任何可以用来表示分子的良好数据结构?
我当时想也许我可以通过使每个原子成为一个顶点来表示为图,但是,有机化合物通常含有大量的碳和氢。你怎么编号?是否存在代表分子的好方法,但同时又有一种有效的.contains()
方法?
最基本的用途之一是检查化合物是否含有羰基,苄基氢或什至苯环。
是否有任何可以用来表示分子的良好数据结构?
我当时想也许我可以通过使每个原子成为一个顶点来表示为图,但是,有机化合物通常含有大量的碳和氢。你怎么编号?是否存在代表分子的好方法,但同时又有一种有效的.contains()
方法?
最基本的用途之一是检查化合物是否含有羰基,苄基氢或什至苯环。
Answers:
(拥有30年软件开发经验的生物化学专业的毕业生)
非有机分子“相对”简单。有趣的是可以与自身结合的化合物,例如C,N,O,Si,因为您可以得到一些真正时髦的组合。苯环是一个非常简单的例子。有些变体用氮代替其中一种碳,并且变快很快。
我将从具有各种原子类型的“原子”对象开始。
每个“原子”对象都将包含一个原子对象列表,以表示各种键,因此氮气将具有固定大小3的列表。然后,它可以存储到其他三个原子的链接。双键可以表示为重复条目。
每个原子都将嵌入规则,规定其可以合法绑定的内容以及绑定方式。
因此,您可以明确地组成相当复杂的分子-因为碳1上的键3与氢2上的键1等相连。
希望有道理...
对此建模的第一个诱惑是使用四叉树样式的数据结构。每个碳原子有四个连接,每个氧两个,氢一个。我认为这不是正确的解决方案。
我认为适当的解决方案已经被发明出来。要使用的数据结构是字符串。
考虑一下。化学家已经对有机化合物进行建模已有很长时间了。如果显示化学家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类,该类根据公式来计算名称。您将需要创建定义汽油环的正则表达式。为您要搜索的每个组定义额外的正则表达式。
以这种方式对化合物进行建模的优势在于,它所使用的语言恰好位于最终用户的业务领域中。作为开发人员,您只需知道要搜索的字符串即可,这些字符串可以由教科书或化学家轻松提供。
如果需要这些化学物质的结构表示形式,建议您维护该公式的SMILES表示形式。