Gibt es gute Datenstrukturen, mit denen ein Molekül dargestellt werden kann?
Ich dachte, ich könnte es als Graph darstellen, indem ich jedes Atom zu einem Scheitelpunkt mache. Es ist jedoch üblich, dass organische Verbindungen viele Kohlenstoffe und Wasserstoff enthalten. Wie würden Sie es nummerieren? Gibt es eine gute Möglichkeit, Moleküle darzustellen und gleichzeitig eine effiziente .contains()
Methode zu haben?
Eine der grundlegendsten Anwendungen hierfür wäre die Überprüfung, ob eine Verbindung eine Carbonylgruppe oder einen benzylischen Wasserstoff oder sogar einen Benzolring enthält.
data-structures
Richarizardd
quelle
quelle
Antworten:
(Absolvent der Biochemie mit 30 Jahren Erfahrung in der Softwareentwicklung)
Nichtorganische Moleküle sind "relativ" einfach. Die interessanten sind diejenigen, die sich mit sich selbst verbinden können, z. B. C, N, O, Si, weil Sie einige wirklich funky Kombinationen erhalten können. Der Benzolring ist ein sehr einfaches Beispiel. Einige Variationen ersetzen einen der Kohlenstoffe durch Stickstoff und es wird schnell komisch.
Ich würde mit einem "Atom" -Objekt beginnen, dessen verschiedene Atomtypen von ihm erben.
Jedes "Atom" -Objekt würde eine Liste von Atomobjekten enthalten, um die verschiedenen Bindungen darzustellen, so dass Stickstoff eine Liste mit fester Größe 3 haben würde. Es könnte dann Verknüpfungen zu drei anderen Atomen speichern. Eine Doppelbindung könnte als doppelter Eintrag dargestellt werden.
In jedes Atom wären Regeln eingebettet, an was und wie es sich legal binden kann.
Sie können also einigermaßen komplizierte Moleküle eindeutig bilden - da Bindung 3 am Kohlenstoff Nr. 1 mit Bindung 1 am Wasserstoff 2 usw. verbunden ist.
Hoffe das macht Sinn ...
quelle
Die erste Versuchung bei der Modellierung besteht darin, eine Datenstruktur im Quad-Tree-Stil zu verwenden. Jedes Kohlenstoffatom hat vier Verbindungen, jeder Sauerstoff zwei und jeder Wasserstoff eins. Ich denke jedoch nicht, dass dies die richtige Lösung ist.
Ich denke, dass die richtige Lösung bereits erfunden wurde. Die zu verwendende Datenstruktur ist eine Zeichenfolge.
Denk darüber nach. Chemiker modellieren seit geraumer Zeit organische Verbindungen. Wenn Sie einen Chemiker CH4 zeigen, wird dieser sofort als Methan erkannt. Zeigen Sie ihnen CH3CH2OH und sie werden das als Ethanol erkennen. Sie erkennen dies, weil sie die CH3CH2-Kombination als "eth" -Verbindung (dh zwei Kohlenstoffatome) und das OH als "Anol" - oder Alkoholgruppe identifizieren.
Wir haben auch eine bereits vorhandene Methode zum Suchen und Identifizieren von Teilzeichenfolgen - reguläre Ausdrücke.
Um eine organische Verbindung programmatisch darzustellen, würde ich eine Verbindung so definieren, dass sie eine Zeichenfolge enthält, die ihre chemische Formel darstellt, und eine Zeichenfolge, die ihren chemischen Namen definiert. Es könnte Methoden geben, die identifizieren, welche "besonderen" Eigenschaften die Verbindung hatte.
Eine Beispielklasse in C #:
Natürlich müssten Sie die Klasse nameCalculator schreiben, die den Namen basierend auf der Formel berechnet. Sie müssten den regulären Ausdruck erstellen, der einen Benzinring definiert. Definieren Sie zusätzliche reguläre Ausdrücke für jede der Gruppen, nach denen Sie suchen möchten.
Der Vorteil der Modellierung der Verbindungen auf diese Weise liegt in der Sprache, die genau im Geschäftsbereich des Endbenutzers liegt. Alles, was Sie als Entwickler wissen müssen, sind die zu suchenden Zeichenfolgen, die entweder von einem Lehrbuch oder einem Chemiker bereitgestellt werden können.
Wenn strukturelle Darstellungen dieser Chemikalien erforderlich sind, empfehle ich, die SMILES-Darstellungen der Formel beizubehalten.
SMILES Darstellung der chemischen Formel
quelle