版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Boyer-Moore算法简介,与之前算法的比较,暴力算法 与 KMP算法 都是基于前缀比较的算法 BM算法则是基于后缀比较,而且BM算法其实上包含两个并行的算法: 坏字符算法 好后缀算法 相同点:这些算法都是对文本串从左往右分析的,朴素的思想-坏字符算法,S =“FINDINAHAYSTACKNEEDLEINA” T =“NEEDLE” FINDINAHAYSTACKNEEDLEINA NEEDLE,朴素的思想-坏字符算法,S =“FINDINAHAYSTACKNEEDLEINA” T =“NEEDLE” FINDINAHAYSTACKNEEDLEINA NEEDLE NEEDLE,朴素的思
2、想-坏字符算法,S =“FINDINAHAYSTACKNEEDLEINA” T =“NEEDLE” FINDINAHAYSTACKNEEDLEINA NEEDLE NEEDLE NEEDLE,朴素的思想-坏字符算法,S =“FINDINAHAYSTACKNEEDLEINA” T =“NEEDLE” FINDINAHAYSTACKNEEDLEINA NEEDLE NEEDLE NEEDLE NEEDLE,朴素的思想-好后缀算法,CASE 1 S= *BABCDE* T= ABCDEFGBCDE,朴素的思想-好后缀算法,CASE 1 S= *BABCDE* T= ABCDEFGBCDE T= AB
3、CDEFGBCDE,朴素的思想-好后缀算法,CASE 2 S= *BABCDE* T= CDECDEGBCDE,朴素的思想-好后缀算法,CASE 2 S= *BABCDE* T= CDECDEGBCDE T= CDECDEGBCDE,坏字符算法,FINDINAHAYSTACKNEEDLEINA NEEDLE NEEDLE NEEDLE NEEDLE 上面的N,S,N是坏字符,显然在该算法中存在两种情况: 1.坏字符不在模式串中 2.坏字符在模式串中,Case 1,坏字符不在模式串中 *TLE* NEEDLE NEEDLE Shift = strlen(模式串)-position(坏) Shif
4、t = 6 - 2,Case 2a,坏字符在模式串中 *NLE* NEEDLE NEEDLE Shift =最右的坏字符位置position(坏) Shift = 5 - 2,Case 2b,坏字符在模式串中 *ELE* NEEDLE,Case 2b,坏字符在模式串中 *ELE* NEEDLE NEEDLE 会有倒退 NEEDLE 不能预处理 上面两种设计思想都可行,各有优缺点,预处理-坏字符,Shift = bmBcSi-(m-1-i) void preBmBc(char *S, int m, int bmBc) int i; for (i = 0; i ASIZE; +i) /ASIZE=
5、256 bmBci = m; for (i = 0; i =m - 1; +i) bmBcSi = m - i - 1; ,m-i,-1,预处理-坏字符,void preBmBc(char *S, int m, int bmBc) int i; for (i = 0; i ASIZE; +i) /ASIZE=256 bmBci = m; for (i = 0; i =m - 1; +i) bmBcSi = m - i - 1; 这是会有倒退的算法设计,优点在于能够对模式串预处理,预处理-坏字符,void preBmBc(char *S, int m, int bmBc) int i; for
6、(i = 0; i ASIZE; +i) /ASIZE=256 bmBci = m; for (i = 0; i =m - 1; +i) bmBcSi = m - i - 1; 这是会有倒退的算法设计,优点在于能够对模式串预处理,O(M),思考题,为什么坏字符算法虽然倒退但是我们还是用这个算法呢? 解答: 坏字符算法虽然倒退,但是BM算法中好后缀算法是确保不后退的,我们每次移动是取两个算法的最大值。这样一结合就保证了模式串不会倒退。 而坏字符算法虽然后退但是有着能够预处理,代码实现简单,时间复杂度低的特点,所以被广为接受。在后面的SUNDAY 算法等改进算法中有的是使用了不后退的思路。,好后缀
7、算法,当好后缀在模式串中重复出现时 S= *BABCDE* T= ABCDEFGBCDE,好后缀算法,当好后缀在模式串中重复出现时 S= *BABCDE* T= ABCDEFGBCDE T= ABCDEFGBCDE,好后缀算法,模式串中没有子串匹配好后缀 S= *BABCDE* T= CDECDEGBCDE,好后缀算法,模式串中没有子串匹配好后缀 S= *BABCDE* T= CDECDEGBCDE T= CDECDEGBCDE 此时需要寻找模式串的一个最长前缀CDE,并让该前缀等于好后缀BCDE的后缀,寻找到该前缀后,让该前缀和好后缀对齐即可。,好后缀算法,模式串中没有子串匹配上好后缀,并且
8、在模式串中找不到最长前缀,让该前缀等于好后缀的后缀时 S= *BABCDE* T= AACDEFGBCDE,好后缀算法,模式串中没有子串匹配上好后缀,并且在模式串中找不到最长前缀,让该前缀等于好后缀的后缀时 S= *BABCDE* T= AACDEFGBCDE T= AACDEFGBCDE,预处理-好后缀,模式串的预处理 定义一个数组suffix,其中suffixi = s 表示以i为边界,与模式串后缀匹配的最大长度,如下图所示,用公式可以描述:满足Ti-s, i = Tm-s, m的最大长度s。,预处理-好后缀,suffixm-1=m; for (i=m-2;i=0;-i) q=i; whi
9、le(q=0 ,预处理-好后缀,void preBmGs(char *x, int m, int bmGs) int i, j, suffXSIZE; suffixes(x, m, suff); /对模式串进行预处理 for (i = 0; i = 0; -i) if (suffi = i + 1) /如果找到一个最大前缀 for (; j m - 1 - i; +j) if (bmGsj = m) bmGsj = m - 1 - i; for (i = 0; i = m - 2; +i) bmGsm - 1 - suffi = m - 1 - i; ,预处理-好后缀,void preBmGs
10、(char *x, int m, int bmGs) int i, j, suffXSIZE; suffixes(x, m, suff); /对模式串进行预处理 for (i = 0; i = 0; -i) if (suffi = i + 1) /如果找到一个最大前缀 for (; j m - 1 - i; +j) if (bmGsj = m) bmGsj = m - 1 - i; for (i = 0; i = m - 2; +i) bmGsm - 1 - suffi = m - 1 - i; ,模式串中没有子串匹配上好后缀,但找不到一个最大前缀的情况,预处理-好后缀,void preBmG
11、s(char *x, int m, int bmGs) int i, j, suffXSIZE; suffixes(x, m, suff); /对模式串进行预处理 for (i = 0; i = 0; -i) if (suffi = i + 1) /如果找到一个最大前缀 for (; j m - 1 - i; +j) if (bmGsj = m) bmGsj = m - 1 - i; for (i = 0; i = m - 2; +i) bmGsm - 1 - suffi = m - 1 - i; ,模式串中没有子串匹配上好后缀,但找不到一个最大前缀的情况,模式串中没有子串匹配上好后缀,但找得
12、到一个最大前缀的情况,预处理-好后缀,void preBmGs(char *x, int m, int bmGs) int i, j, suffXSIZE; suffixes(x, m, suff); /对模式串进行预处理 for (i = 0; i = 0; -i) if (suffi = i + 1) /如果找到一个最大前缀 for (; j m - 1 - i; +j) if (bmGsj = m) bmGsj = m - 1 - i; for (i = 0; i = m - 2; +i) bmGsm - 1 - suffi = m - 1 - i; ,模式串中没有子串匹配上好后缀,但找
13、不到一个最大前缀的情况,模式串中没有子串匹配上好后缀,但找得到一个最大前缀的情况,模式串中有子串匹配上好后缀,预处理-好后缀,void preBmGs(char *x, int m, int bmGs) int i, j, suffXSIZE; suffixes(x, m, suff); /对模式串进行预处理 for (i = 0; i = 0; -i) if (suffi = i + 1) /如果找到一个最大前缀 for (; j m - 1 - i; +j) if (bmGsj = m) bmGsj = m - 1 - i; for (i = 0; i = m - 2; +i) bmGsm - 1 - suffi = m - 1 - i; ,O(M),算法主体,Int BM_Search(char* S ,char* T) j = 0; while (j = 0 -i) if (i 0) match; else j += max(bmGsi, bmBcTi-(m-1-i); ,算法主体,Int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冶金应急预案咨询价格(3篇)
- 人员遣散n应急预案(3篇)
- 东风轻型货车营销方案(3篇)
- pta粉尘爆炸应急预案(3篇)
- 1小时活动策划方案(3篇)
- 1-1-4-1-Terphenyl-2-3-3-5-5-5-hexacarboxylic-acid-3-2-3-5-5-5-Terphenylhexacarboxylic-acid-生命科学试剂-MCE
- 南京强化地板施工方案(3篇)
- 发光冲孔板施工方案(3篇)
- 园区道路组织施工方案(3篇)
- 地表隧道施工方案范本(3篇)
- DG-TJ08-2329-2026 民用建筑可再生能源综合利用核算标准
- 风机盘管常见故障维修手册
- 髌骨骨折的护理查房
- 2026青海省交通工程咨询有限公司校园引才总笔试历年参考题库附带答案详解
- 牛场绩效考核制度
- 产品研发与质量控制规范(标准版)
- 2026年电气制造公司样机试制管控管理制度
- 人与自然关系课件
- 高中数学建模竞赛试题及答案
- 2025北京语言大学出版社有限公司招聘5人笔试历年典型考点题库附带答案详解3套试卷
- 2024-2025学年安徽省合肥市第五十中学天鹅湖校区上学期期中考试七年级数学试卷
评论
0/150
提交评论