数据结构论坛

首页 » 分类 » 常识 » 数据结构与算法第三十二节字符串匹配算法
TUhjnbcbe - 2021/2/19 2:33:00
中科技术让白癜风患者早绽笑容 http://news.39.net/bjzkhbzy/170920/5709508.html

新年伊始,四川交通收到一份科技“礼包”:省科技厅公布年第二批四川省工程技术研究中心认定结果,四川公路设计院申报的“四川省公路结构监测与加固工程技术研究中心”成功获批,成为四川交通运输领域年第1个省级工程技术研究中心,实现“十四五”开门红。

年底,四川公路总里程数居全国第一,其中,高速公路运营里程突破公里,实现了“市市通”。“十三五”期间,全省新增高速公路运营里程公里,高速公路往偏远山区、民族地区延伸;还建成雅康高速泸定大渡河特大桥、雀儿山隧道、新川九路等一批享誉国内外的超级工程和示范工程。

路网不断延展、精品不断呈现的背后,离不开强有力的科技创新支撑。过去5年间,四川交通科技创新平台由3个发展至10个,创新驱动发展强劲。

科技是第一生产力,从“蜀道难”到“全国第一”,科技支撑交通发展,有着怎样的创新密码?

一个支撑:引入新技术新工艺,化解建设难题

1月的阿坝县,天寒地冻,零下10余摄氏度的严寒中,久治到马尔康高速公路正在建设。这是四川到青海的第一条高速公路通道、我省首条高海拔高原高速公路,全线海拔米以上,45%的路段海拔超过米,沿线年均气温仅1.4℃,全年有效施工期仅6个月。

低氧、高寒、高海拔、施工期又短,建设面临诸多挑战。久马高速公司董事长羊勇告诉川观新闻记者,除加大人员和设备投入、延长有效施工期,还将引入新技术、新工艺,化解建设难题,比如,建几座和汶川克枯大桥同类型的桥梁。

年建成通车的汶川克枯大桥位于汶川到马尔康高速公路上,是全国首座“全桥不需要模板”的大桥。其工厂化生产率达到80%,钢结构零部件在工厂内统一生产完成,施工现场DIY组装后,再运到桥址进行安装;现场人力减少了70%,工期缩短了1/4。

“它是交通运输部和省交通运输厅的‘科研桥’。”大桥设计者、四川公路设计院总工程师牟廷敏说,桥址所在地气候恶劣、施工环境差,在汶川大地震的核心区域。他们以公路院30多年来研究推广的钢管混凝土桥梁技术积淀,经过系统化技术集成创新,建成了这一全国首座预应力钢管混凝土桁梁桥。

从规划勘察到施工建设,四川交通系统不断探索创新,积累了丰富的经验。看中四川在这方面的技术优势,去年9月19日,中国工程院院士张喜刚领衔的公路长大桥建设国家工程研究中心,也将其首个分中心设在了四川,搭建“产学研用”创新平台,进行山区桥梁的防灾减灾成套技术深度研究。

这个分中心成立第二天就迎来“实战”:因雅西高速附近山体垮塌致高速公路和国道双向中断,受省交通运输厅派遣,分中心组建专家组赶赴现场指导抢险和抢通。专家组还利用自主研发的“工程结构安全智能监测云”,构建起智能监测预警系统,为现场抢险提供全天候的安全预警,让应急抢险人员能安全施工,仅用6天就完成了排危抢险。

“修路架桥、保通保畅,科技创新都是最有力的支撑。”省交通运输厅相关负责人表示。“十三五”期间,全省新增高速公路运营里程公里,平均每公里投资达1.7亿元,是“十二五”时期的2倍,高速公路往偏远山区、民族地区延伸。源源不断的创新推动着路网不断延展,建成雅康高速泸定大渡河特大桥、雀儿山隧道、新川九路等一批享誉国内外的超级工程和示范工程。

一支队伍:科研平台集聚和培养人才,将成果运用到建设中

过去5年,四川交通科技创新最大的变化是什么?“平台的增加!”省交通运输厅科信处处长柏吉琼脱口而出。

“十三五”期间,四川省交通运输省部级科研平台由3个增加到了10个,在同类型中心崭露头角,特色优势凸显。科研平台的建设,为应用研究和成果转化提供了载体,并集聚和培养了一支人才队伍。

通过BIM(建筑信息建模)技术,让高速公路等项目在电脑上“立”起来,可以直观地看到建设进度、建设难点。仁沐新、沿江、徳会、成南高速扩容等省内多个交通项目已采用了这样的信息化手段,应用于勘察设计、施工建设、运营养护等。四川在全国交通运输行业中,是最早一批启动BIM技术研究与应用的。

年,四川交通设计院总工程师朱明组建四川交通设计院BIM中心时,BIM在交通运输领域还是新鲜事物。年,交通院BIM中心获批成为交通运输部行业研发中心,加速了BIM技术全面应用于四川高速公路、水运航道等交通重点项目,并先后引领了行业内3次技术风潮。

去年底,朱明被评为“年度交通运输行业重点科研平台15大创新人物”。但他最有成就感的,是BIM中心已从组建时的寥寥几人,发展壮大到专职研发人员近40人,组建起了一支涵盖公路、水运、计算机等多个领域的复合型专业人才队伍。“我们已做好人才储备,迎接交通建设项目产业互联网时代的到来。”他说。

深冬季节,从川主寺到九寨沟的公路沿线,已是白茫茫一片,但公路上却没有积雪,汽车仍可畅行。“我们采用了抗凝冰路面的新技术。”四川公路设计院高级工程师代*释疑。

这个新技术是公路院自主研发的。我省西部高海拔高寒地区“一山有四季,十里不同天”,冬季路面冰雪灾害频发、易发。公路院研发了根据气候条件自动调节低冰点材料释放速率的路面,可在冬季快速释放除冰剂,辅以环路热管技术,就像在路面内部埋设电热毯一样,结合公路冰雪灾害预警系统,实现了智能化控制,在冰雪来临前启动,提前融雪化冰,减少行车隐患。

四川公路设计院董事长罗玉宏告诉川观新闻记者,依托“交通运输行业公路建设与养护技术、材料及装备行业研发中心”“四川省路面结构材料及养护工程实验室”两个省部级研发平台,公路院建成被誉为“医院”的国内先进的路面专用研发场所,培养了一支“公路医生”团队,研究成果应用到了全省多公里高速公路的路面新建及养护维修设计中,“部分核心技术和研究成果,正逐步实现工程化、产业化推广。”

一个方向:围绕关键技术、重难点问题开展科研攻关

就在“四川省公路结构监测与加固工程技术研究中心”获批前夕,交通运输部下发《公路危旧桥梁改造行动方案》,明确要求,“十四五”期间要“消灭”公路上的四、五类桥梁,一、二类桥梁占比要达到90%以上。

四川公路设计院科技管理部部长姚刚对川观新闻记者说,四川公路交通网在全国规模最大,多穿越崇山峻岭或沟谷河流,长大桥隧和高边坡等工程结构比例高、规模大,要长期抵御地震、滑坡、崩塌、泥石流等自然灾害。“随着路网逐渐完善和趋于饱和,公路基础设施规模日渐庞大,公路交通行业的需求重心必然逐渐从‘建设’向‘管养’转移。”

作为我省公路基础设施领域勘察设计的主力*,四川公路设计院近5年来新增多个科研平台,形成了“国家工程研究中心、行业研发中心、博士后科研工作站、省工程技术研究中心、省工程实验室”国家与部省三个梯次多种类别的科研平台,钢管混凝土桥梁、山区桥梁防灾减灾等优势领域都成立了单独的“中心”,对关键技术、重难点问题可更为聚焦。

年,我省新增的两个交通运输行业研发中心,则聚焦智能化应用。

年5月,由四川铁投集团、徐工集团、清华大学联合开发的无人驾驶压路机机群联动作业,在攀大高速仁和区路段测试成功,这是四川基建工程智能化的重大突破。四川铁投集团又成功申报“自动化作业技术交通运输行业研发中心”,研究采用无人驾驶装备、远程施工控制、多机种多机群自主作业,实现交通工程标准化施工、集约化建造,提高西部地区基础设施建设质量和效率。

中电科集团四川天奥空天公司申报的“卫星技术交通运输行业研发中心”,将借助天空地海一体化卫星技术信息网络,运用卫星通信、导航和遥感等前沿技术,加强重要交通基础设施安全监测、运输工具位置实时监控、交通网络运行状态管理、运输数据的同步更新等。换句话说,就是借助卫星技术手段,对公路桥梁、隧道、运输车辆等实时监控,通过预警预判,确保运营安全。

“未来几年,我们的研究主要聚焦四川交通发展面临的特殊性和难点性问题。”柏吉琼表示,将以交通强国试点项目、川西高原山区公路防灾减灾、智慧交通等为重点,加大科技创新研究,建设交通强省。

来源:川观新闻

预览时标签不可点收录于话题#个上一篇下一篇
TUhjnbcbe - 2021/2/19 2:34:00
山东白癜风医院 http://baidianfeng.39.net/a_zhiliao/131226/4317323.html

BF算法(BruteForce):暴力匹配算法,如果在字符串A中查找字符串B,那字符串A就是主串,字符串B就是模式串,主串记长度作n,模式串长度记作m,nm,在主串中检查位置分别是0,1,2,3,4...n-m,一共匹配n-m+1次,也就是一共匹配n-m+1个子串。

暴力匹配过程图解:

第一步:主串和模式串匹配位置初始化

第二步:挨个匹配,判断i和j指向的字符是否相等

第三步:如果i和j指向的字符不匹配,i向后移动一位,j重新设为0

程序实现:

intBF(strings1,strings2){//第一步:i和j进行初始化操作inti=0;//主串位置intj=0;//模式串位置//第二步:挨个匹配while(is1.length()js2.length()){//第三步:如果i和j指向d嗯字符相等,那么i和j都向后移动一位,如果i和j指向的字符不相等,i减去j,然后再加1,j重新从0开始if(s1==s2[j]){i++;j++;}else{i=i-j+1//i-j:表示重新回到开始位置,然后加1,表示遇到坏字符向后挪一个位置继续匹配j=0;}}if(j==s2.length()){//j从零开始,如果等于模式串长度,说明匹配完成returni-j;}else{return-1;}}

每次遇到不匹配字符,i指针就要回溯回去,效率明显很低。是否可以利用已经匹配的部分,保持i指针不回溯,通过修改j指针,让模式串移动到一个有效位置?当某一个字符与主串不匹配时,j指针应该移动到哪?

例如,当字符C和D不匹配时:

因为在前面有相同的A匹配,所以j移动到1的位置

再举例,如图:

j移动到2的位置,因为前面已经有两个字符匹配

每一个位置都有可能发生不匹配,也就是每一个j位置都对应一个下次j指向位置k,在这里使用next数组保存,next[j]=k,表示当主串!=模式串[j]时,j指针应该指向的下一个位置值。

当j=0时,不匹配:

j已经在最左边了,不可能再移动了,此刻应该让i指针左移,j相当于减少一个位置,j从0回溯到-1,所以next[0]=-1,一种理解方式,主要为了防止出现死循环k=next[k],当出现next[0]=-1,说明要回溯到开始位置重新匹配,后面会涉及到。(模式串向右移动,j向左移动)

当j=1时,不匹配:

j指针一定是左移到0位置,前面只有这一个位置

当j=3时,不匹配:

j指针一定是左移到1位置,前面有1个A字符匹配

当j=5时,不匹配:

j指针一定是左移到2位置,前面有2字符AB匹配

规律图解:

总结:当模式串第j个字符和主串第i个字符匹配失败,j要移动到下一个位置k,k前面的字符与k之后到j之间的字符是最长公共前后缀,P是模式串,公式P[0~k-1]==P[j-k~j-1]。

证明:j为什么可以直接移动到k的位置?

当T!=P[j]时:

第一步:当T和P有公共前后缀时,T!=P[j],[T[i-j~i-1]==P[0~j-1]

第二步:当T和P有公共前后缀时,模式串P满足P[0~k-1]==P[j-k~j-1]

第三步:当j==k时,根据①②仍然满足T[i-k~i-1]==P[0~k-1]

总结:当T!=P[j]时,如果最长公共前后缀的长度为k,则下次匹配指针j可以移动到第k位,next[j]=k,这里是以下标为0作为基准。

第一种情况,next[j]数组求解:

P[j]=P[k]时,next[j]=k,则next[j+1]=k+1=next[j]+1;

第二种情况,next[j]数组求解:

P[j]!=P[k],指针k应该回溯到next[k]位置,k=next[k]

next数组实现分析:

因为需要找出最长公共前后缀,所以开始比较肯定需要错位比较,j指针控制上面的模式串p,k指针控制下面的模式串p。

换种思路理解,为什么可以把主串和模式串的比较转换成模式串和模式串的错位比较?

在匹配过程中,我们始终都是在找相同,遇到不匹配,最长公共前后缀到达极限,上面已经证明了最长公共前后缀的有效性,可以提高效率,就有匹配问题,转换成了对模式串下手,求模式串的最长匹配前后缀问题。

voidgetNext(strings1,intnext[]){intj=0;//负责上面模式串intk=-1;//负责下面模式串next[0]=-1;//j==0,k=-1,next[j]=k,意味着重新开始匹配while(js1.length()-1){if(k==-1

s1[j]==s1[k]){//如果k==-1,也就是意味着下面模式串要重新开始匹配主串(其实还是匹配自己)//算的是下一项前面的最大公共前后缀next[j+1]=k+1;//如果p[j]==p[k],next[j+1]=next[j]+1,满足上面的第一种情况推导k++;j++;}else{//如果p[j]!=p[k],k应该指向下一个位置,也就是回溯,下一个位置值又提前存储在当前k指向next[k],所以只需要把k赋值为next[k],下一次继续拿着当前k指向的next[k],去向前移动让k指向新的值,k=next[next[k]]。k=next[k];//终归来说都是在假设已经存在最长公共前后缀时,当前k和j指向的值不匹配,规律推导。}}}

next数组优化:

假设P为模式串,T为主串,当T!=P[j],会存在模式串指针j不能一次性回溯到位的情况,如下图:

按照next数组求解方法,j应该回溯到下标1的位置,但是回溯之后,仍然出现T!=P[j],因为P[j]==P[next[j]],所以应该让j直接回溯到0位置,也就是继续回溯到next[1]=0。

优化后程序:

voidgetNext(strings1,intnext[]){intj=0;//负责上面模式串intk=-1;//负责下面模式串next[0]=-1;//j==0,k=-1,next[j]=k,意味着重新开始匹配while(js1.length()-1){if(k==-1

s1[j]==s1[k]){//如果k==-1,也就是意味着下面模式串要重新开始匹配主串(其实还是匹配自己)k++;j++;if(s1[j]==s1[k]){next[j]=next[k];//k的next[k]表示多向前推进一步}else{next[j]=k;}}else{//如果p[j]!=p[k],k应该指向下一个位置,也就是回溯,下一个位置值又提前存储在当前k指向next[k],所以只需要把k赋值为next[k],下一次继续拿着当前k指向的next[k],去向前移动让k指向新的值,k=next[next[k]]。k=next[k];//终归来说都是在假设已经存在最长公共前后缀时,当前k和j指向的值不匹配,规律推导。}}}

KMP算法程序:

intKMP(strings1,strings2){inti=0;//主串的开始下标intj=0;//模式串的开始下标while(is1.length()js2.length()){if(j==-1

s1==s2[j]){//当j为-1时,要移动的是i,j也要归0i++;j++;}else{//i=i-j+1;与暴力匹配最大的不同,去就是i不需要回溯了j=next[j]//j回到指定位置}}if(j==s2.length()){returni-j;}else{return-1;}}

RK算法(Rabin-Karp):根据Rabin和Karp两位发明者的名字命名,具体思路通过哈希算法对主串的n-m+1个子串分别求哈希值,然后逐个与模式串的哈希值进行比较大小,如果某个子串的哈希值与模式串相等,说明匹配成功。

如何高效计算哈希值?

例如,10进制数字类型字符串就可以转换成10进制数值,对于26个字母类型字符串,每个字母对应26进制的一个数值,最终也可以转换为10进制数值。

如果子串比较长,那么算出来的值就相对比较大,有可能发生数据溢出,怎么办呢?

此时可以允许哈希值重复,比如可以让子串每个字符对应的26进制值相加,遇到匹配项就停下来,这种时候可能存在哈希值一样,但是实际字符串并不匹配的情况存在,所以需要比较一下字符串,查看是否可以完全匹配,这种效率相对来说还是比暴力匹配高很多。

BM(Boyer-Moore)算法:例如,在文本编辑器word中查一个单词,性能比KMP高出3到4倍。

BK和RK算法的匹配规则,如果遇到不匹配的字符,都是选择让模式串往后一次滑动一位:

主串中存在c,在模式串中是不存在的,模式串向后滑动的时候,只要与c存在重合,肯定无法匹配,可以选择把模式串移动到c的后面:

BM算法包含两部分,坏字符规则和好后缀规则:

第一种--坏字符规则:

BF和RK匹配规则,下标从左到右:

BM坏字符规则,下标从右到左:

从模式串的尾巴往前倒着匹配,当发现某个字符无法匹配的时,就把这个没有匹配的字符叫作坏字符(主串中的字符)。

坏字符c在模式串中查找,发现模式串中并不存在这个字符,向后移动3位,重新从后面向前查找。

重新匹配发现,a和d仍然不能匹配成功,但是坏字符a在模式串中可以找的到,那么再向后移动时仍然移动3位么?这种情况下只需要移动两位,让坏字符a和模式串中的a对齐,再重新从后向前匹配。

规律总结:当发生不匹配的时候,可以把坏字符对应的模式串中的字符下标赋值给si,如果坏字符在模式串中存在,可以把这个坏字符在模式串中的下标赋值给xi,如果不存在把xi赋值-1,模式串向后移动的位数为si-xi。

如果坏字符在模式串中多处出现,在计算xi的时候,选择最靠后那个,防止滑动过多,忽略本应该可以匹配的情况。

如果si-xi结果为负数怎么办?

例如,主串aaaaaaaaaaaaa,模式串baaa,此刻si为0,a为3,不会向后移动,反而变成向前移动。

引入第二种--好后缀规则:当模式串滑动到图中的位置的时,模式串和主串有2个字符是匹配的,倒数第3个字符发生了不匹配。

此时可以把已经匹配的bc叫作好后缀,记作{u},拿着好后缀在模式串中查找,如果找到了另一个跟好后缀相匹配的子串{u*},就将模式串滑动到子串{u*}与主串中{u}对齐的位置。

如果在模式串中找不到另一个等于好后缀子串{u},直接将模式串滑动到主串中{u}的后面,因为前面的任何一次往后滑动,都不会匹配主串中的{u}。

如果直接滑动到主串中{u}好后缀的后面,有可能错过最佳匹配:

当模式串滑动到本身前缀与主串中{u}的后缀有部分重合的时候,重合部分而且相等,就有可能存在完全匹配的情况。

在这里不仅要看好后缀在模式串中是否有另一个匹配的子串,还要考察好后缀的后缀子串是否存在跟模式串的前缀子串匹配。

当模式串和主串中的某个字符不匹配时,选择用好后缀规则还是坏字符规则?

计算好后缀和坏字符往后滑动的位数,然后取两个数中最大的作为模式串往后滑动的位数,避免出现根据坏字符规则得到往后滑动的位数存在负数。

一只小跃跃

1