Cấu trúc dữ liệu nào bạn sẽ sử dụng để thể hiện một hợp chất hữu cơ?


11

Có bất kỳ cấu trúc dữ liệu tốt ngoài đó có thể được sử dụng để đại diện cho một phân tử?

Tôi đã nghĩ có lẽ tôi đại diện cho nó như một đồ thị bằng cách biến mọi nguyên tử thành một đỉnh, tuy nhiên, thông thường các hợp chất hữu cơ có nhiều Carbons và Hydrogens. Làm thế nào bạn sẽ đánh số nó? Có một cách tốt để đại diện cho các phân tử, nhưng đồng thời, có một .contains()phương pháp hiệu quả ?

Một trong những ứng dụng cơ bản nhất cho việc này là kiểm tra xem một hợp chất có chứa nhóm carbonyl, hoặc hydro benzylic hay thậm chí là vòng benzen hay không.



8
Tôi nghĩ bạn nên hỏi một nhà hóa học. Họ có thể không biết cách lập trình nó, nhưng họ chắc chắn biết cách biểu diễn các hợp chất và mặc dù có hầu hết các khả năng (ví dụ, họ đại diện cho bencene chỉ bằng một hình lục giác). Ngoài ra, có một số mức độ trừu tượng (một protein được mô tả là một chuỗi các aminoaxit, không phải là một nhóm các nguyên tử). Khi bạn hiểu cách trình bày nó trên giấy, phần lập trình sẽ khá đơn giản
SJuan76

Đây là một câu hỏi tuyệt vời. Hy vọng rằng tôi sẽ có cơ hội để thêm một vài suy nghĩ sau này.
Stephen

2
Hai điều cần nhớ: hãy nhớ rằng các nguyên tử có thể có các đồng vị khác nhau và hãy nhớ rằng một số hợp chất có cùng các nguyên tố, nhưng khác nhau do vị trí liên kết .
Telastyn

Câu trả lời:


7

(Tốt nghiệp hóa sinh với 30 năm kinh nghiệm phát triển phần mềm)

Các phân tử phi hữu cơ là "tương đối" đơn giản. Những người thú vị là những người có thể liên kết với chính họ, ví dụ C, N, O, Si vì bạn có thể nhận được một số kết hợp thực sự thú vị. Vòng Benzen là một ví dụ rất đơn giản. Một số biến thể thay thế một Nitơ cho một trong các Carbons và nó trở nên kỳ lạ nhanh chóng.

Tôi sẽ bắt đầu với một đối tượng "nguyên tử" với các loại nguyên tử khác nhau được thừa hưởng từ nó.

Mỗi đối tượng "nguyên tử" sẽ chứa một danh sách các đối tượng nguyên tử để biểu diễn các liên kết khác nhau để Nitơ có một danh sách có kích thước cố định 3. Sau đó, nó có thể lưu trữ các liên kết đến ba nguyên tử khác. Một liên kết đôi có thể được biểu diễn dưới dạng một mục trùng lặp.

Mỗi nguyên tử sẽ có các quy tắc được nhúng về những gì nó có thể liên kết hợp pháp và làm thế nào.

Vì vậy, bạn có thể tạo thành các phân tử hợp lý phức tạp một cách rõ ràng - bởi vì liên kết 3 trên Carbon # 1 được liên kết với liên kết 1 trên Hydrogen 2, v.v.

Hy vọng điều đó có ý nghĩa ...


4

Sự cám dỗ đầu tiên với việc mô hình hóa điều này là sử dụng cấu trúc dữ liệu kiểu bốn cây. Mỗi nguyên tử carbon có bốn kết nối, mỗi oxy hai và mỗi hydro một. Tôi không nghĩ rằng đây là giải pháp thích hợp.

Tôi nghĩ rằng giải pháp thích hợp đã được phát minh. Cấu trúc dữ liệu để sử dụng là một chuỗi.

Nghĩ về điều này. Các nhà hóa học đã mô hình hóa các hợp chất hữu cơ trong một thời gian dài bây giờ. Nếu bạn chỉ ra một nhà hóa học CH4, họ sẽ nhận ra ngay đó là metan. Chỉ cho họ CH3CH2OH và họ sẽ nhận ra đó là ethanol. Họ nhận ra điều này bởi vì họ xác định tổ hợp CH3CH2 là hợp chất "eth" (có nghĩa là hai nguyên tử carbon) và OH là một nhóm "anol" hoặc rượu.

Chúng tôi cũng có một phương pháp có sẵn để tìm kiếm và xác định các chuỗi con - biểu thức chính quy.

Vì vậy, để biểu diễn một cách hợp lý một hợp chất hữu cơ, tôi sẽ định nghĩa một hợp chất có chứa một chuỗi đại diện cho công thức hóa học của nó và một chuỗi xác định tên hóa học của nó. Nó có thể có các phương pháp xác định tính chất "đặc biệt" nào mà hợp chất có.

Một lớp ví dụ trong 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);
    }
}

Rõ ràng bạn sẽ cần phải viết lớp nameCalculator, tính toán tên dựa trên công thức. Bạn sẽ cần tạo regex xác định vòng benzen. Xác định các biểu thức bổ sung cho từng nhóm bạn muốn tìm kiếm.

Ưu điểm của việc mô hình hóa các hợp chất theo cách này là ngôn ngữ chính xác trong lĩnh vực kinh doanh của người dùng cuối. Tất cả những gì bạn là nhà phát triển cần biết là các chuỗi để tìm kiếm, có thể dễ dàng được cung cấp bởi một cuốn sách văn bản hoặc một nhà hóa học.

Nếu các biểu diễn cấu trúc của các hóa chất này là bắt buộc, tôi khuyên bạn nên xem xét việc duy trì các biểu diễn SMILES của công thức.

Đại diện công thức hóa học SMILES


2
Làm thế nào để bạn xử lý các đồng phân theo cách này?

Đó là một câu hỏi tuyệt vời. Nó chỉ ra rằng điều này đã được suy nghĩ về. Tôi đã thêm thông tin về đại diện công thức hóa học SMILES vào câu trả lời.
Stephen

có nhiều hệ thống tên hệ thống khác nhau cũng có thể được sử dụng tùy thuộc vào thuộc tính nào bạn thực sự muốn mô hình
jk.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.