Есть ли хорошие структуры данных, которые можно использовать для представления молекулы?
Я подумал, может быть, я представляю его как График, превращая каждый атом в вершину, однако для органических соединений характерно наличие большого количества атомов углерода и водорода. Как бы вы это посчитали? Есть ли хороший способ для представления молекул, но в то же время, есть эффективный .contains()
метод?
Одним из самых основных применений для этого может быть проверка того, содержит ли соединение карбонильную группу, или бензиловый водород, или даже бензольное кольцо.
data-structures
Richarizardd
источник
источник
Ответы:
(Выпускник биохимии с 30-летним опытом разработки программного обеспечения)
Неорганические молекулы "относительно" просты. Интересными являются те, которые могут связываться друг с другом, например, C, N, O, Si, потому что вы можете получить действительно забавные комбинации. Бензольное кольцо - очень простой пример. Некоторые вариации заменяют азот на один из атомов углерода, и он быстро становится странным.
Я бы начал с объекта «атом» с различными типами атомов, наследуемых от него.
Каждый объект «атом» будет содержать список объектов атома для представления различных связей, поэтому у азота будет список фиксированного размера 3. Затем он может хранить ссылки на три других атома. Двойная связь может быть представлена как повторяющаяся запись.
Каждый атом будет иметь встроенные правила о том, с чем он может юридически связываться и как.
Таким образом, вы можете составить достаточно сложные молекулы однозначно - потому что связь 3 на углероде # 1 связана с связью 1 на водороде 2 и т. Д.
Надеюсь, что это имеет смысл ...
источник
Первое искушение при моделировании - это использовать структуру данных в стиле квад-дерева. Каждый атом углерода имеет четыре соединения, каждый кислород два и каждый водород один. Я не думаю, что это правильное решение, хотя.
Я думаю, что правильное решение уже придумано. Используемая структура данных - это строка.
Подумай об этом. Химики уже довольно давно моделируют органические соединения. Если вы покажете химику CH4, они сразу узнают это как метан. Покажите им CH3CH2OH, и они узнают это как этанол. Они признают это, потому что они идентифицируют комбинацию CH3CH2 как «этильное» соединение (имеется в виду два атома углерода), а ОН как «анольную» или спиртовую группу.
У нас также есть существующая методология поиска и идентификации подстрок - регулярные выражения.
Таким образом, чтобы представить программно органическое соединение, я бы определил соединение как содержащее строку, представляющую его химическую формулу, и строку, определяющую его химическое название. У него могут быть методы, которые определяют, какие «особые» свойства у соединения.
Пример класса в C #:
Очевидно, вам нужно написать класс nameCalculator, который вычисляет имя на основе формулы. Вам нужно создать регулярное выражение, которое определяет бензиновое кольцо. Определите дополнительные регулярные выражения для каждой из групп, которые вы хотите найти.
Преимущество моделирования соединений таким образом заключается в том, что он находится на языке, который находится в бизнес-сфере конечного пользователя. Все, что вам нужно знать разработчику, - это строки для поиска, которые могут быть легко предоставлены либо учебником, либо химиком.
Если требуются структурные представления этих химических веществ, я предлагаю рассмотреть возможность представления SMILES формул.
SMILES представление химической формулы
источник