Apakah ada struktur data yang baik di luar sana yang dapat digunakan untuk mewakili molekul?
Saya berpikir mungkin saya menggambarkannya sebagai Grafik dengan membuat setiap atom menjadi simpul, namun, senyawa organik memiliki banyak Karbon dan Hidrogen. Bagaimana Anda menghitungnya? Adakah cara yang baik untuk merepresentasikan molekul, tetapi pada saat yang sama, memiliki .contains()
metode yang efisien ?
Salah satu kegunaan paling mendasar untuk ini adalah untuk memeriksa apakah suatu senyawa mengandung gugus karbonil, atau hidrogen benzilik, atau bahkan cincin benzen.
data-structures
Richarizardd
sumber
sumber
Jawaban:
(Lulusan biokimia dengan pengalaman pengembangan perangkat lunak 30 tahun)
Molekul non-organik adalah "relatif" sederhana. Yang menarik adalah mereka yang dapat terikat dengan diri mereka sendiri misalnya C, N, O, Si karena Anda bisa mendapatkan beberapa kombinasi yang benar-benar funky. Cincin Benzene adalah contoh yang sangat sederhana. Beberapa variasi menggantikan Nitrogen untuk salah satu Karbon dan itu menjadi aneh dengan cepat.
Saya akan mulai dengan objek "atom" dengan berbagai jenis atom yang diwarisi darinya.
Setiap "atom" objek akan berisi daftar objek atom untuk mewakili berbagai ikatan sehingga Nitrogen akan memiliki daftar ukuran tetap 3. Kemudian dapat menyimpan tautan ke tiga atom lainnya. Ikatan rangkap dapat direpresentasikan sebagai entri rangkap.
Setiap atom akan memiliki aturan yang tertanam tentang apa yang dapat mengikat secara hukum dan bagaimana.
Jadi, Anda dapat membuat molekul yang cukup rumit secara jelas - karena ikatan 3 pada Karbon # 1 terkait dengan ikatan 1 pada Hidrogen 2 dll.
Harapan itu masuk akal ...
sumber
Godaan pertama dengan pemodelan ini adalah dengan menggunakan struktur data gaya quad-tree. Setiap atom karbon memiliki empat koneksi, masing-masing oksigen dua dan masing-masing satu hidrogen. Saya tidak berpikir bahwa ini adalah solusi yang tepat.
Saya pikir solusi yang tepat telah ditemukan. Struktur data yang digunakan adalah string.
Pikirkan tentang ini. Kimiawan telah memodelkan senyawa organik untuk waktu yang cukup lama sekarang. Jika Anda menunjukkan ahli kimia CH4, mereka akan segera mengenali itu sebagai metana. Tunjukkan pada mereka CH3CH2OH dan mereka akan mengenalinya sebagai etanol. Mereka mengenali ini karena mereka mengidentifikasi kombinasi CH3CH2 sebagai senyawa "et" (artinya dua atom karbon) dan OH sebagai "anol" atau kelompok alkohol.
Kami juga memiliki metodologi yang sudah ada sebelumnya untuk mencari dan mengidentifikasi substring - ekspresi reguler.
Jadi untuk mewakili secara pemrograman suatu senyawa organik, saya akan mendefinisikan suatu senyawa sebagai mengandung string yang mewakili formula kimianya dan string yang mendefinisikan nama kimianya. Itu dapat memiliki metode yang mengidentifikasi sifat "khusus" yang dimiliki senyawa.
Contoh kelas di C #:
Tentunya Anda perlu menulis kelas nameCalculator, yang menghitung nama berdasarkan rumus. Anda harus membuat regex yang mendefinisikan cincin benzine. Tetapkan regex tambahan untuk setiap grup yang ingin Anda cari.
Keuntungan dari memodelkan senyawa dengan cara ini adalah dalam bahasa yang persis berada dalam domain bisnis pengguna akhir. Yang perlu Anda ketahui sebagai pengembang adalah string yang harus dicari, yang dapat dengan mudah disediakan oleh buku teks atau ahli kimia.
Jika representasi struktural dari bahan kimia ini diperlukan, saya sarankan untuk menjaga representasi SMILES dari formula ini.
Representasi formula kimia SMILES
sumber