版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学教育心理学试题及答案
- 小学教师道德与法治课程专业素养考试题目与答案
- 2025-2026学年广东广州市白云区八年级下学期期中考试历史试题(文字版含答案)
- 抗氢容器项目可行性研究报告
- 2026 年夏季小学生暑假独自在家防盗安全宣讲课堂
- 泸州港可行性研究报告
- 煤矿通信联络系统保障考核试卷
- 大数据平台项目可行性研究报告
- 2026年失智老人照护师专业知识题库及完整答案
- 2026年培训机构监管行政执法试题(含答案)
- 全媒体运营师职业技能竞赛题(附答案)
- DB65╱T 3285-2011 防雷装置检测技术规范
- 车位抵账合同协议
- 医院临床医学带教老师培训
- 人教版八年级数学上册轴对称《最短路径问题》 教学课件
- 2022年CSCO软组织肉瘤诊疗指南
- 220kV变电站电气设备常规交接试验方案
- 除艾滋病、梅毒和乙肝母婴传播评估指标解释
- 100以内两位数进位加法退位减法计算题-(直接打印版)
- (正式版)SH∕T 3541-2024 石油化工泵组施工及验收规范
- 瑞普三元流量计说明书
评论
0/150
提交评论