如何将分子存储在内存中?

4

我想要将分子存储在内存中。这些可以是简单的分子:

Methane (CH4)
C-H bond-length: 108.7 pm
H-H angle: 109 degrees

还有更复杂的分子,比如扑热息痛(C8H9NO2):
Paracetamol

我该如何将分子及其所有键长和角度存储在内存中?


将原子结构存储在数组中是一个好主意吗?还是有更好的方法?


你能用英语描述各种分子吗?如果可以,那么你应该能够想出一个在Objective C中描述相同分子的模型。 - Tim Robinson
@Robinson 实际上,人们应该能够自己绘制分子。我需要将它们缓冲到内存中以便于绘制,并将它们序列化以进行保存。 - user142019
所有分子都有固定数量的场吗?还是键长和角度的计数随着分子复杂性的增加而变化? - naivnomore
我明白了。用语言(就像我在回答中所做的那样)解释问题,然后将其转换为代码会有所帮助。 - Tim Robinson
5个回答

9
看起来像是一种图数据结构:
- 分子有一组原子 - 原子通过化学键连接:
- 化学键可以是双键、单键或三键 - 化学键有长度 - 化学键有角度
- 它是一个循环图(例如,问题中的示例具有交替单键和双键的环) - 它不是一个有向图(如果两个原子被化学键连接,从哪一端接近化学键都没有关系)
通常,您会将图存储为节点(原子)数组和边(化学键)数组。节点和边都将是指向结构体的指针。
节点(原子)将存储元素。
边(化学键)将存储以下字段:
- 一对指向节点的指针 - 化学键类型(双/单) - 化学键长度和角度
由于它不是一个有向图,因此您的数据结构将认为A和B之间的边与B和A之间的边等效。也就是说,对于给定的一对原子,您希望您的边数组包含从A到B的边,而从不包含从B到A的边。

一个分子不是一个环形图,但它可以是一个环形图。 - rano
1
@rano,没错;这不是一个无环图。任何操作分子图的代码都需要处理循环。 - Tim Robinson
@property (nonatomic, retain) NSArray *atoms; 非原子性的原子?嘿嘿 - user142019
这取决于单个分子。你怎么能从一开始就确定它是环状的还是非环状的呢?(因此,你是正确的,你应该能够处理循环,但当你对图表无法再说更多时,你总会面临这种情况)。 - rano
三键?那一定是我上学时化学还没发明出来的东西。 - Tim Robinson
@Tim:疑似最大键级为6;三键在自然界中可能不常见,但它们确实存在于实验室之外;快速搜索没有找到三键首次表征的日期,但对于四键,维基百科建议1964年。 - Christoph

0

考虑到您正在建模一个链接结构,似乎使用链接数据结构是最合适的表示方法。但我不太懂化学,无法猜测每个项目需要存储哪些有趣的数据。

一开始听起来很像通常存储图形的非常略微修改版本--节点和链接,每个都有关联的数据。在图形中,与链接相关的典型数据是该链接的“成本”,但在这种情况下,听起来您将存储一个向量(角度和长度)。


为什么使用向量而不是结构体呢?: P - rano
1
@rano:抱歉,我使用“向量”这个词是按照物理学的定义,而不是编程中的定义。无论您使用结构体、vector还是其他什么来存储它,都是完全不同的问题。 - Jerry Coffin
@rano:向量也是一个数学术语,表示角度和长度。 - Paul Nathan
@Paul Nathan 对不起,我的错,我太快得出了结论 ^^ - rano

0
也许你应该看看 Brad Larson 的 Molecules,这是一个超级好用的开源应用程序,适用于 iPhone/iPod/iPad,已经启发了许多程序员。我猜他使用了一种标准的分子数据格式,可以为你提供灵感。

0

你会对这些分子进行任何计算,还是只是绘制它们?如果你有任何严格计算的意图,那么我不建议使用Objective C。为了获得最佳性能,你应该将角度、长度和连接存储在普通数组中,并进行所有必要的记账以跟踪每个元素。如果涉及大量计算,那么使用高级数据结构等来保存分子信息的这些类型的应用程序运行非常缓慢。


0
您发布的分子是一个描述符,类似于具体分子实例的模板(具有不同的笛卡尔坐标)。因此,您只需要一个“分子”来表示每种可能的分子类型实例。然后,您需要一个坐标数组,从中可以提取哪些坐标给出一个分子。对于这个单一的描述符,您应该创建数据结构,以便以最佳方式访问值。也许使用键合的(a,b,r,type)结构的向量作为键合的数据结构,(a,b,c,w,type)的向量作为角度的数据结构等。
谢谢
rbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接