数据结构在有机化学中的应用.docx
- 文档编号:10160586
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:19
- 大小:288.90KB
数据结构在有机化学中的应用.docx
《数据结构在有机化学中的应用.docx》由会员分享,可在线阅读,更多相关《数据结构在有机化学中的应用.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构在有机化学中的应用
数据结构在有机化学中的应用
TheApplicationofDataStructuretoOrganicChemistry
南京市金陵中学
高二(13)班祝云篪
ABSTRACT:
Therapiddevelopmentofcomputerscienceandtechnologyhasinfluencedmanydisciplines,includingorganicchemistry.Theobjectiveofthisstudyistoexploretheusesandefficiencyofdatastructure,animportantcomponentofcomputerscience,whichiswidelyusedinorganicchemistry.Thisstudyfocusesontheapplicationtothestorageofchemicalstructuresoforganiccompoundsandrelevantcalculation.Thefindingsofthestudyincludethefollowing:
1.Stringsapplywelltotheinputofstructureformula;2.Linearstructuresareusefulforchemicalcalculating;3.Treeandgraphstructuresmakeitconvenienttostorechemicalstructures.
一.研究背景
2013年10月9日,2013年诺贝尔化学奖在瑞典揭晓,犹太裔美国理论化学家马丁·卡普拉斯(MartinKarplus)、美国斯坦福大学生物物理学家迈克尔·莱维特(MichaelLevitt)和南加州大学化学家亚利耶·瓦谢尔(AriehWarshel)因给复杂化学体系设计了多尺度模型而分享奖项。
诺贝尔化学奖评选委员会说,卡普拉斯、莱维特和瓦谢尔研究的开创性在于,他们让经典物理学与迥然不同的量子物理学在化学研究中“并肩作战”。
以前,化学家必须二选其一。
依靠用塑料棒和杆创建模型的经典物理学方法的优势在于计算简单且能为大分子建模,但其无法模拟化学反应。
而如果化学家选择使用量子物理学计算化学反应过程,但巨大的计算量使得其只能应付小分子。
为此,在20世纪70年代,这三位科学家设计出这种多尺度模型,让传统的化学实验走上了信息化的快车道。
多尺度复杂化学系统模型的出现无疑翻开了化学史的“新篇章”。
化学反应发生的速度堪比光速。
刹那间,电子就从一个原子核跳到另一个原子核,以前,对化学反应的每个步骤进行追踪几乎是不可能完成的任务。
而在由这三位科学家研发出的多尺度模型的辅助下,化学家们让计算机做“做帮手”来揭示化学过程。
例如,在模拟药物如何同身体内的目标蛋白耦合时,计算机会对目标蛋白中与药物相互作用的原子执行量子理论计算;而使用要求不那么高的经典物理学来模拟其余的大蛋白,从而精确掌握药物发生作用的全过程。
诺贝尔化学奖评选委员会在当天发表的声明中说,对化学家来说,计算机是同试管一样重要的工具,计算机对真实生命的模拟已为化学领域大部分研究成果的取得立下了“汗马功劳”。
通过模拟,化学家能更快获得比传统实验更精准的预测结果。
以上为2013年诺贝尔化学奖的颁奖情况。
今天,以计算机及其网络深入到社会的各个层面为标志的数字化新世纪已经到来,也将使传统化学发生深刻的变化。
化学已由只实验不计算,演变为先实验再计算,也必将逐步演变为先计算再实验;计算机化学和计算化学的结合已开始孕育一个新的更带数字化色彩的学科方向-ModelChemistry(模型化学,Pople语);基于web技术的化学应用软件已经出现。
这些都表明数字化化学将与数字化社会一起到来。
计算机化学(Computerchemistry)是应用计算机研究化学反应和物质变化的科学。
以计算机为技术手段,建立化学化工信息资源化和智能化处理的理论和方法,认识物质、改造物质、创造新物质和认识反应、控制反应过程和创造新反应、新过程是计算机化学研究的主体。
它的兴起与发展是与计算机技术的发展和计算机的普及紧密联系的。
目前计算机化学覆盖的领域主要有:
1.化学数据挖掘(Datamining);
2.化学结构与化学反应的计算机处理技术;
3.计算机辅助分子设计;
4.计算机辅助合成路线设计;
5.计算机辅助化学过程综合与开发;
6.化学中的人工智能方法等。
本篇论文即是对领域2中的有机物化学结构计算机处理技术进行研究。
有机化学又称为碳化合物的化学,是研究有机化合物的组成、结构、性质、制备方法与应用的科学,是化学中极重要的一个分支【1】。
和无机物相比,有机物数目众多,可达几千万种。
而无机物目却只发现数十万种,因为有机化合物的碳原子的结合能力非常强,可以互相结合成碳链或碳环。
碳原子数量可以是1、2个,也可以是几千、几万个,许多有机高分子化合物(聚合物)甚至可以有几十万个碳原子。
此外,有机化合物中同分异构现象非常普遍,这也是有机化合物数目繁多的原因之一。
而当今世界,计算机技术快速发展,存储功能强大、运算速度极快的计算机便可以方便的处理种类复杂、结构繁多的有机物化学结构,以便未来的研究工作。
二.研究意义
1.高二即将系统学习有机化学,此研究有利于当前的预习工作与将来的化学学习。
2.高一下学期信息竞赛辅导主讲数据结构,此研究过程将是一个极好的实战演练机会;
3.研究过程中,通过查阅资料,可获取大量与计算机、化学乃至数学、物理等其他学科有关的知识,有利于将来的职业选择;
4.研究过程中编写的程序可供同学们使用,一方面可有助于他们的化学学习,另一方面可引起他们对计算机科学的关注,培养他们的计算机思维。
三.研究方法
研究方法主要有查阅资料和实战编程。
资料分计算机和化学两部分。
计算机方面看数据结构和算法,主要有《算法导论》《图论》;有机化学则是邢其毅《基础有机化学》、胡弘纹《有机化学》。
实战编程,主要运用作者最熟悉的PASCAL语言。
四.研究过程
1.线性结构
线性表【2】是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
一般地,一个线性表可以表示成一个线性序列:
k1,k2,…,kn,其中k1是开始结点,kn是终端结点。
在实际应用中,线性表都是以栈、队列、字符串、数组等特殊线性表的形式来使用的。
下面来看其具体运用
(1)字符串:
读入
如图4-1,这是一个2-羟基丙醛的结构简式,若将其写在一个输入行之内,根据规范,应写成CH3C(OH)HCHO。
由此,可以发现改写结构简式中,单键被省略,支链用括号表示,化学式中只留下数字、括号和字母,因此,可以由线性的字符串输入。
在此总结三条规律:
图4-1
①使用结构简式,一行输入
②用括号代替价键表示支链
③正常大小数字(这点是由于计算机本身的限制)
图4-2
根据以上原则,输入2-羟基丙醛的化学式应为:
(2)栈:
计算
图4-3
栈(stack)又名堆栈,它是一种运算受限的线性表。
其限制是仅允许在表的一端进行插入和删除运算。
这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
此项性质,有利于对化学物质中的元素进行统计工作。
案例I不饱和度
不饱和度(英文名称:
Degreeofunsaturation),又称缺氢指数或者环加双键指数(indexofhydrogendeficiency(IHD)orringsplusdoublebonds)是有机物分子不饱和程度的量化标志,用希腊字母Ω表示,在有机化学中用来帮助画化学结构,在推断有机化合物结构时很有用,可以帮助使用者确定要画的化合物有多少个环、双键、和叁键。
公式:
Ω=1+1/2∑Ni(Vi-2)
其中,Vi代表某元素的化合价,Ni代表该种元素原子的数目,
∑代表总和。
这种方法适用于复杂的化合物。
Ω=C+1-(H-N)/2
其中,C代表碳原子的数目,H代表氢和卤素原子的总数,N
表氮原子的数目,氧和其他二价原子对不饱和度计算没有贡献,故不需要考虑氧原子数。
这种方法只适用于含碳、氢、单价卤素、氮和氧的化合物。
这里以第二种方法为例。
算法简述
①设立两个栈,元素栈(符号栈)与数字栈;
②将化学式以字符串形式读入,具体要求之前已明确;
③读入同时判断所读字符为数字还是元素符号,两栈使用同一top指针,若为元素,则top→top+1;
④将字符分别压入相应栈;
⑤扫描元素栈,统计碳数、氢数、氮数、卤素数;
⑥代入公式求解,输出。
源代码
1.vars,n:
array[1..100]ofstring;
2.ch:
char;
3.w,ans,c,h,x,i,top:
integer;
4.begin
5.top:
=0;ans:
=0;c:
=0;h:
=0;
6.whilenoteolndo
7.begin
8.read(ch);
9.if(ord(ch)>=65)and(ord(ch)<=90)then
10.begininc(top);s[top]:
=s[top]+ch;end
11.elseif(ord(ch)>=97)and(ord(ch)<=122)then
12.s[top]:
=s[top]+chelse
13.n[top]:
=n[top]+ch;
14.end;
15.fori:
=1totopdo
16.begin
17.ifn[i]=''thenn[i]:
='1';
18.ifs[i]='C'thenbeginval(n[i],x,w);c:
=c+x;end
19.elseifs[i]='H'thenbeginval(n[i],x,w);h:
=h+x;end
20.elseif(s[i]='F')or(s[i]='Cl')
21.or(s[i]='Br')or(s[i]='I')thenbeginval(n[i],x,w);ans:
=ans-x;end
22.elseifs[i]='N'thenbeginval(n[i],x,w);ans:
=ans+x;end;
23.end;
24.ans:
=(c*2+2-h+ans)div2;
25.writeln('?
',ans);
26.readln(x);
27.end.
以下是部分测试结果。
图4-4
图4-5
图4-6
2.树形结构
树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。
把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:
每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。
树又分为有序树和无序树。
图4-8
图4-7
如图4-7,这是一个乙基的示意图。
可以把端基看作树根,将其建成一棵三叉树(图4-8):
由上可知,有机基团可看为三叉有序树,有机物本身便是三叉无序树。
因此,我们可以利用树的存储,来存储化学物质。
树的存储输入可用广义表或前序遍历形式。
这里采用后者。
例:
-CH3
转化为:
-CH###H###H###
其中“#”表示无节点。
然后就可以建树存储了。
案例II集团次序比较
次序规则内容【3】:
图4-9次序规则的使用
(1)原子:
原子序数大的排在前面,同位素质量数大的优先。
几种常见原子的优先次序为:
I>Br>Cl>S>P>O>N>C>H
(2)饱和基团:
如果第一个原子序数相同,则比较第二个原子的原子序数,依次类推。
常见的烃基优先次序为:
(CH3)3C->(CH3)2CH->CH3CH2->CH3-
(3)不饱和基团:
可看作是与两个或三个相同的原子相连。
不饱和烃基的优先次序为:
-C≡CH>-CH=CH2>(CH3)2CH-
(4)若与双键碳原子相连的基团互为顺反异构时,Z型先于E型。
次序规则主要应用于烷烃的系统命名和烯烃中几何异构体的命名。
此案例不包含第四条。
算法简述
①字符串读入两个化学式,将其转化为前序遍历形式;
②建三叉树;
③逐层各原子排序,逐一比较;
④输出。
源代码
1.usesmath;
2.typetree=array[1..300]ofstring;
3.max=array[0..300]oflongint;
4.conste:
array[0..15]ofstring=
5.('','H','D','T','Li','B','C','N','O','F','Si','P','S','Cl','Br','I');
6.vart1,t2:
tree;
7.max1,max2:
max;
8.s1,s2,s3,s4:
string;
9.i,j,k,l,n:
longint;
10.procedureswap(vara,b:
longint);
11.vart:
longint;
12.begin
13.t:
=a;
14.a:
=b;
15.b:
=t;
16.end;
17.
18.procedurechange(varst:
string);
19.vari,j,k,l,n:
longint;
20.s:
string;
21.begin
22.delete(st,1,1);
23.i:
=0;//branch
24.whilei 25.begin 26.inc(i); 27.ifst[i]=')'then 28.forj: =i-1downto1do 29.ifst[j]='('then 30.begin 31.s: =copy(st,j+1,i-j-1); 32.iford(st[i+1])>=65then 33.begink: =1;delete(st,j,i-j+1);endelse 34.begink: =ord(st[i+1])-48;delete(st,j,i-j+2);end; 35.forl: =1tokdoinsert(s,st,j); 36.end; 37.end; 38.i: =0;//valencebond 39.whilei 40.begin 41.inc(i); 42.casest[i]of 43.'=': begin 44.delete(st,i,1); 45.st: =st+'#'; 46.n: =length(st); 47.s: =copy(st,i,n-i+1); 48.insert(s,st,n+1); 49.end; 50.'? : begin 51.delete(st,i,1); 52.st: =st+'##'; 53.n: =length(st); 54.s: =copy(st,i,n-i+1); 55.insert(s,st,n+1); 56.n: =length(st); 57.insert(s,st,n+1); 58.end; 59.end; 60.end; 61.i: =0;//element 62.whilei 63.begininc(i); 64.ifst[i+1]<>'#'thenbegin 65.if(ord(st[i+1])>=65)and(ord(st[i+1])<97)thenj: =1else 66.begin 67.iford(st[i+1])>=97then 68.begin 69.s: =st[i]+st[i+1]; 70.iford(st[i+2])>=65thenj: =1 71.elsebeginj: =ord(st[i+2])-48; 72.delete(st,i+2,1);end; 73.fork: =1toj-1do 74.insert(s,st,i); 75.endelse 76.begin 77.s: =st[i]; 78.j: =ord(st[i+1])-48; 79.delete(st,i+1,1); 80.fork: =1toj-1do 81.insert(s,st,i); 82.end; 83.end; 84.end;end; 85.i: =0; 86.whilei 87.if(ord(st[i+1])<90)and(ord(st[i])<95)then 88.casest[i]of 89.'H': insert('###',st,i+1); 90.'D': insert('###',st,i+1); 91.'T': insert('###',st,i+1); 92.'F': insert('###',st,i+1); 93.'I': insert('###',st,i+1); 94.'O': if(st[i-1]='C')or(st[i-5]='C')then 95.begin 96.insert('###O###',st,i+1); 97.i: =i+7; 98.endelseinsert('##',st,i+1); 99.'S': if(st[i-1]='C')or(st[i-5]='C')then 100.begin 101.insert('###S###',st,i+1); 102.i: =i+7; 103.endelseinsert('##',st,i+1); 104.'N': insert('#',st,i+1); 105.'P': insert('#',st,i+1); 106.'B': insert('#',st,i+1); 107.endelseif(st[i]<>'#')and(ord(st[i])<95)theninsert('###',st,i+2); 108.end; 109.end; 110. 111.procedurecreate(i: longint;vart: tree;varst: string); 112.begin 113.inc(j); 114.ifst[j]='#'thent[i]: ='' 115.else 116.begin 117.iford(st[j+1])<95thent[i]: =st[j] 118.elsebegint[i]: =st[j]+st[j+1];delete(st,j+1,1);end; 119.create(3*i-1,t,st); 120.create(3*i,t,st); 121.create(3*i+1,t,st); 122.end; 123.end; 124. 125.procedurecompare(i: longint); 126.varj,k1,K2,l1,l2: longint; 127.begin 128.ifs3=s4thenbeginwriteln(s3,'=',s4);exit;end; 129.fillchar(max1,sizeof(max1),0); 130.fillchar(max2,sizeof(max2),0); 131.k1: =0;K2: =0; 132.begin 133.forj: =((trunc(power(3,i-1))-1)div2+1)to((trunc(power(3,i))-1)div2)do 134.begin 135.forl1: =0to15doife[l1]=t1[j]thenbreak; 136.inc(k1);max1[k1]: =l1; 137.forl2: =0to15doife[l2]=t2[j]thenbreak; 138.inc(k2);max2[k2]: =l2; 139.end; 140.forl1: =1tok1-1do 141.forl2: =l1+1tok1do 142.ifmax1[l1] 143.forl1: =1tok2-1do 144.forl2: =l1+1tok2do 145.ifmax2[l1] 146.forj: =1tok1do 147.ifmax1[j]>max2[j]thenbeginwriteln(s3,'>',s4);exit;endelse 148.ifmax1[j] 149.end;compare(i+1); 150.end; 151. 152.procedureinit; 153.begin 154.fillchar(t1,sizeof(t1),0); 155.fillchar(t2,sizeof(t2),0); 156.readln(s1);s3: =s1;change(s1); 157.j: =0;whilej 158.readln(s2);s4: =s2;change(s2); 159.j: =0;whilej 160.end; 161. 162.begin{main} 163.init; 164.compare (1); 165.readln; 166.end. 本程序可根据次序规则用于比较两个有机基团的次序。 支持的元素: HDTLiBCNOFSiPSClBrI 以下是部分测试结果。 图4-10 图4-11 图4-12 图4-13 3.树形结构拓展 以上解决了各种链状化合物的问题,那么,若是环状化合物呢? 此时,便可引入图的概念【4】。 图G是一个有序二元组(V,E),其中V称为顶集(VerticesSet),E称为边集(Edgesset),E与V不相交。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 有机化学 中的 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)