¿Hay alguna buena estructura de datos que pueda usarse para representar una molécula?
Estaba pensando que tal vez lo represento como un Gráfico al hacer que cada átomo sea un vértice, sin embargo, es común que los compuestos orgánicos tengan muchos Carbones e Hidrógenos. ¿Cómo lo numerarías? ¿Hay una buena manera de representar moléculas, pero al mismo tiempo, tener un .contains()
método eficiente ?
Uno de los usos más básicos para esto sería verificar si un compuesto contiene un grupo carbonilo, o un hidrógeno bencílico, o incluso un anillo de benceno.
data-structures
Richarizardd
fuente
fuente
Respuestas:
(Graduado en bioquímica con 30 años de experiencia en desarrollo de software)
Las moléculas no orgánicas son "relativamente" simples. Los interesantes son los que pueden unirse entre sí, por ejemplo, C, N, O, Si porque puedes obtener algunas combinaciones realmente originales. El anillo de benceno es un ejemplo muy simple. Algunas variaciones sustituyen un Nitrógeno por uno de los Carbones y se vuelve extraño rápidamente.
Comenzaría con un objeto "átomo" con los diversos tipos de átomos que heredan de él.
Cada objeto "átomo" contendría una lista de objetos atómicos para representar los diversos enlaces, por lo que Nitrógeno tendría una lista de tamaño fijo 3. Luego podría almacenar enlaces a otros tres átomos. Un doble enlace podría representarse como una entrada duplicada.
Cada átomo tendría reglas incrustadas sobre a qué puede vincularse legalmente y cómo.
Por lo tanto, puede formar moléculas razonablemente complicadas sin ambigüedades, porque el enlace 3 en el Carbono # 1 está vinculado al enlace 1 en el Hidrógeno 2, etc.
Espero que tenga sentido ...
fuente
La primera tentación con modelar esto es usar una estructura de datos de estilo de cuatro árboles. Cada átomo de carbono tiene cuatro conexiones, cada oxígeno dos y cada uno de hidrógeno. Sin embargo, no creo que esta sea la solución adecuada.
Creo que la solución adecuada ya se ha inventado. La estructura de datos a usar es una cadena.
Piensa sobre esto. Los químicos han estado modelando compuestos orgánicos durante bastante tiempo. Si le muestra a un químico CH4, inmediatamente lo reconocerán como metano. Muéstreles CH3CH2OH y lo reconocerán como etanol. Reconocen esto porque identifican la combinación CH3CH2 como un compuesto "eth" (que significa dos átomos de carbono) y el OH como un grupo "anol" o alcohol.
También tenemos una metodología preexistente para buscar e identificar subcadenas: expresiones regulares.
Entonces, para representar programáticamente un compuesto orgánico, definiría un compuesto como que contiene una cadena que representa su fórmula química y una cadena que define su nombre químico. Podría tener métodos que identificaran qué propiedades "especiales" tenía el compuesto.
Una clase de ejemplo en C #:
Obviamente, necesitaría escribir la clase nameCalculator, que calcula el nombre a partir de la fórmula. Debería crear la expresión regular que define un anillo de bencina. Defina expresiones regulares adicionales para cada uno de los grupos que desea buscar.
La ventaja de modelar los compuestos de esta manera es que está en el lenguaje que se encuentra exactamente en el dominio comercial del usuario final. Todo lo que usted, como desarrollador, necesita saber son las cadenas que debe buscar, que pueden ser proporcionadas fácilmente por un libro de texto o por un químico.
Si se requieren representaciones estructurales de estos químicos, sugiero buscar mantener representaciones de la fórmula en SONRISA.
Representaciones de la fórmula química de SMILES
fuente