โครงสร้างข้อมูลใดที่คุณจะใช้เพื่อเป็นตัวแทนสารประกอบอินทรีย์


11

มีโครงสร้างข้อมูลที่ดีที่สามารถนำมาใช้เป็นตัวแทนของโมเลกุลได้หรือไม่?

ฉันคิดว่าบางทีฉันอาจแสดงเป็นกราฟโดยทำให้ทุกอะตอมเป็นจุดสุดยอด แต่เป็นเรื่องปกติที่สารประกอบอินทรีย์จะมีคาร์บอนและไฮโดรเจนจำนวนมาก คุณจะหมายเลขมันได้อย่างไร มีวิธีที่ดีในการแสดงโมเลกุล แต่ในเวลาเดียวกันมี.contains()วิธีที่มีประสิทธิภาพหรือไม่?

หนึ่งในการใช้งานพื้นฐานที่สุดสำหรับสิ่งนี้คือการตรวจสอบว่าสารประกอบมีกลุ่มคาร์บอนิลหรือไฮโดรเจนเบ็นซิลิกหรือแม้แต่วงแหวนเบนซีน


ที่เกี่ยวข้อง: scicomp.stackexchange.com/q/2081
scriptin

8
ฉันคิดว่าคุณควรถามนักเคมี พวกเขาอาจไม่รู้ว่าจะเขียนโปรแกรมอย่างไร แต่พวกเขารู้วิธีนำสารประกอบมาใช้และมีความเป็นไปได้เกือบทั้งหมด นอกจากนี้ยังมีบางระดับที่เป็นนามธรรม (โปรตีนถูกอธิบายว่าเป็นลำดับของอะมิโนอะซิดไม่ใช่กลุ่มของอะตอม) เมื่อคุณเข้าใจวิธีนำเสนอในกระดาษส่วนการเขียนโปรแกรมควรตรงไปตรงมามาก
SJuan76

นี่เป็นคำถามที่ยอดเยี่ยม หวังว่าฉันจะมีโอกาสเพิ่มความคิดสักหน่อยในภายหลัง
สตีเฟ่น

2
สองสิ่งที่ต้องจำไว้: จำไว้ว่าอะตอมสามารถมีไอโซโทปที่แตกต่างกันและจำไว้ว่าสารบางอย่างมีองค์ประกอบเดียวกัน แต่จะแตกต่างกันเพราะทำเลที่ตั้งพันธะ
Telastyn

คำตอบ:


7

(จบการศึกษาด้านชีวเคมีด้วยประสบการณ์ 30 ปีในการพัฒนาซอฟต์แวร์)

โมเลกุลที่ไม่ใช่สารอินทรีย์นั้นค่อนข้างง่าย สิ่งที่น่าสนใจคือสิ่งที่สามารถผูกมัดตัวเองได้เช่น C, N, O, Si เพราะคุณจะได้ชุดที่น่าสนใจ แหวนเบนซีนเป็นตัวอย่างที่ง่ายมาก รูปแบบบางอย่างแทนไนโตรเจนสำหรับหนึ่งในคาร์บอนและมันได้รับอย่างรวดเร็วแปลก

ฉันจะเริ่มต้นด้วยวัตถุ "อะตอม" ด้วยอะตอมประเภทต่าง ๆ ที่สืบทอดมาจากมัน

วัตถุ "อะตอม" แต่ละอันจะมีรายการวัตถุอะตอมเพื่อเป็นตัวแทนของพันธะต่างๆดังนั้นไนโตรเจนจะมีรายการขนาดคงที่ 3 จากนั้นสามารถจัดเก็บลิงก์ไปยังอะตอมอื่นได้อีกสามตัว พันธะคู่สามารถแสดงเป็นรายการที่ซ้ำกัน

แต่ละอะตอมจะมีกฎเกณฑ์ที่ฝังอยู่เกี่ยวกับสิ่งที่มันสามารถผูกพันและถูกต้องตามกฎหมาย

ดังนั้นคุณสามารถสร้างโมเลกุลที่ซับซ้อนพอสมควรได้เนื่องจากพันธะ 3 ในคาร์บอน # 1 เชื่อมโยงกับพันธะ 1 ในไฮโดรเจน 2 เป็นต้น

หวังว่าจะทำให้รู้สึก ...


4

สิ่งล่อใจแรกกับการสร้างแบบจำลองนี้คือการใช้โครงสร้างข้อมูลแบบต้นไม้สี่ อะตอมของคาร์บอนแต่ละอันมีจุดเชื่อมต่อสี่จุดแต่ละแห่งมีออกซิเจนสองแห่ง ฉันไม่คิดว่านี่เป็นวิธีแก้ปัญหาที่เหมาะสม

ฉันคิดว่าวิธีแก้ปัญหาที่เหมาะสมได้ถูกคิดค้นขึ้นแล้ว โครงสร้างข้อมูลที่ใช้เป็นสตริง

คิดเกี่ยวกับสิ่งนี้. นักเคมีได้ทำการสร้างแบบจำลองสารประกอบอินทรีย์มาเป็นเวลานานแล้ว หากคุณแสดงนักเคมี CH4 พวกเขาจะรับรู้ทันทีว่ามีเทน แสดงให้พวกเขา CH3CH2OH และพวกเขาจะรับรู้ว่าเป็นเอทานอล พวกเขารับรู้สิ่งนี้เพราะพวกเขาระบุการรวมกันของ CH3CH2 เป็นสารประกอบ "eth" (หมายถึงอะตอมคาร์บอนสองอัน) และ OH เป็นกลุ่ม "anol" หรือแอลกอฮอล์

นอกจากนี้เรายังมีวิธีการที่มีอยู่แล้วสำหรับการค้นหาและการระบุ substrings - การแสดงออกปกติ

ดังนั้นเพื่อเป็นตัวแทนสารประกอบอินทรีย์โดยทางโปรแกรมฉันจะกำหนดสารประกอบที่มีสตริงซึ่งแสดงถึงสูตรทางเคมีและสตริงที่กำหนดชื่อทางเคมีของมัน มันอาจมีวิธีการที่ระบุคุณสมบัติ "พิเศษ" ของสารประกอบ

ตัวอย่างคลาสใน C #:

public class OrganicCompound
{
    private Regex benzineRingRegex;

    public OrganicCompound(string formula, NameCalculator nameCalculator, Regex benzineRingRegex)
    {
        this.Formula = formula;
        this.Name = nameCalculator.CalculateName(formula);
        this.benzineRingRegex = benzineRingRegex
    }

    public string Formula { get; private set; }

    public string Name { get; private set; }

    public bool HasBenzeneRing() 
    { 
        return Regex.IsMatch(this.Formula, benzineRingRegex);
    }
}

เห็นได้ชัดว่าคุณจะต้องเขียน classCalculator ซึ่งจะคำนวณชื่อตามสูตร คุณจะต้องสร้าง regex ที่กำหนดแหวนเบนซิน กำหนด regexes พิเศษสำหรับแต่ละกลุ่มที่คุณต้องการค้นหา

ข้อดีของการสร้างแบบจำลองสารประกอบด้วยวิธีนี้คือในภาษาที่อยู่ในโดเมนธุรกิจของผู้ใช้ปลายทาง สิ่งที่คุณเป็นนักพัฒนาจำเป็นต้องรู้คือสายการค้นหาซึ่งสามารถให้ได้อย่างง่ายดายโดยหนังสือหรือนักเคมี

หากจำเป็นต้องมีการแสดงโครงสร้างของสารเคมีเหล่านี้ฉันขอแนะนำให้มองหาการคงไว้ซึ่งการแสดงสูตรของ SMILES

การแสดงสูตรทางเคมีของ SMILES


2
คุณจะจัดการกับผู้ที่เป็นแบบนี้ได้อย่างไร?

นั่นเป็นคำถามที่ดี ปรากฎว่าสิ่งนี้ได้รับการคิดเกี่ยวกับ ฉันได้เพิ่มข้อมูลเกี่ยวกับการแสดงสูตรทางเคมีของ SMILES ในคำตอบ
สตีเฟ่น

มีระบบชื่อที่เป็นระบบต่าง ๆ ที่สามารถนำมาใช้ได้ทั้งนี้ขึ้นอยู่กับคุณสมบัติที่คุณต้องการสร้างแบบจำลอง
jk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.