Existem boas estruturas de dados por aí que podem ser usadas para representar uma molécula?
Eu estava pensando que talvez eu o represente como um gráfico, transformando cada átomo em um vértice; no entanto, é comum que compostos orgânicos tenham muitos carbonos e hidrogênios. Como você o numeraria? Existe uma boa maneira de representar moléculas, mas ao mesmo tempo, ter um .contains()
método eficiente ?
Um dos usos mais básicos para isso seria verificar se um composto contém um grupo carbonil, ou um hidrogênio benzílico, ou mesmo um anel benzeno.
data-structures
Richarizardd
fonte
fonte
Respostas:
(Graduado em Bioquímica com 30 anos de experiência em desenvolvimento de software)
Moléculas não orgânicas são "relativamente" simples. Os interessantes são os que podem se unir, por exemplo, C, N, O, Si, porque você pode obter algumas combinações realmente divertidas. O anel benzeno é um exemplo muito simples. Algumas variações substituem um nitrogênio por um dos carbonos e fica estranho rapidamente.
Eu começaria com um objeto "átomo" com os vários tipos de átomos herdados dele.
Cada objeto "átomo" conteria uma lista de objetos átomos para representar as várias ligações, de modo que o nitrogênio teria uma lista de tamanho fixo 3. Ele poderia então armazenar links para outros três átomos. Uma ligação dupla pode ser representada como uma entrada duplicada.
Cada átomo teria regras embutidas sobre o que pode legalmente se vincular e como.
Assim, você pode criar moléculas razoavelmente complicadas sem ambiguidade - porque a ligação 3 no carbono nº 1 está ligada à ligação 1 no hidrogênio 2, etc.
Espero que faça sentido ...
fonte
A primeira tentação de modelar isso é usar uma estrutura de dados no estilo de quatro árvores. Cada átomo de carbono tem quatro conexões, cada oxigênio dois e cada hidrogênio um. Eu não acho que essa seja a solução adequada.
Eu acho que a solução adequada já foi inventada. A estrutura de dados a ser usada é uma sequência.
Pense sobre isso. Os químicos vêm modelando compostos orgânicos há bastante tempo. Se você mostrar um químico CH4, eles o reconhecerão imediatamente como metano. Mostre a eles CH3CH2OH e eles reconhecerão isso como etanol. Eles reconhecem isso porque identificam a combinação CH3CH2 como um composto "eth" (significando dois átomos de carbono) e o OH como um grupo "anol" ou álcool.
Também temos uma metodologia pré-existente para pesquisar e identificar substrings - expressões regulares.
Então, para representar programaticamente um composto orgânico, eu definiria um composto como contendo uma cadeia que representa sua fórmula química e uma cadeia que define seu nome químico. Poderia ter métodos que identificassem quais propriedades "especiais" o composto possuía.
Um exemplo de classe em C #:
Obviamente, você precisaria escrever a classe nameCalculator, que calcula o nome com base na fórmula. Você precisaria criar o regex que define um anel de benzina. Defina regexes extras para cada um dos grupos que você deseja pesquisar.
A vantagem de modelar os compostos dessa maneira é a linguagem exatamente no domínio comercial do usuário final. Tudo que você, como desenvolvedor, precisa saber são as sequências a serem pesquisadas, que podem ser facilmente fornecidas por um livro de texto ou por um químico.
Se forem necessárias representações estruturais desses produtos químicos, sugiro procurar manter as representações SMILES da fórmula.
Representação da fórmula química SMILES
fonte