- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
BoyermooreAlgorithm
Boyer-Moore字符串有哪些信誉好的足球投注网站算法是一种非常高效的字符串有哪些信誉好的足球投注网站算法。它由Bob Boyer和J Strother Moore设计于1977年,最初定义1975年就给出了基本定义,后续才给出构造算法以及算法证明。
BM算法较KMP 算法效率要高,同时也更复杂;
主要区别:
1、KMP 从左向右比较,而BM算法从右向左比较;
2、BM算法有两个跳转规则,KMP只有一个;
先假设部分定义:
1、pattern 为模式字符串,长度为patLen;
2、Text为目标查找字符串,长度为n;
2、当前不匹配字符在pattern中位置为 j(0≤ j ≤patLen -1);
3、已经匹配的长度为 m(0≤ m <patLen);
4、先假设不匹配字符在pattern中位置为 Δ(*),其中*可以是任何字符;
很多资料里面讲解原理时说的数组位置都是从1开始的,这里为了好理解code,都是从0开始;
首先来看下坏字符规则:
一、坏字符规则(bad character rule ):让不匹配字符和pattern中最右边出现的该字符对齐匹配,如果没有则全部跳过;
假设1:遇到不匹配字符,如果该字符在pattern 中不存在,有:(如下图示跳转)
字符指针右移:patLen 长度 后和 pattern 右对齐;
Pattern 右移:patLen – m;
假设2:遇到不匹配字符,如果该字符在pattern 中存在,这里也分两种情况:
a在pattern最右边出现的该字符在当前不匹配字符左边,有:(如下图示跳转)
字符指针右移:j–Δ(‘-’) +m = (j + m)–Δ(‘-’) = (patlen – 1) -Δ(‘-’) = (7-1)-2 = 4
Pattern 右移:字符指针偏移 - m = 4 – m = 2;
b在pattern中最右边出现的该字符在当前不匹配字符右边, 有:(如下图示跳转)
字符指针右移: (patlen-1) – Δ(‘T’) = (7-1) – 6 = 0
Pattern右移:字符指针偏移 – m = 0 – 2 = -2
可以看出,pattern 竟然回退比较了,这是不应该出现的,这时候直接往后移动1位就行了:
总结上面三种情况,我们定义坏字符函数delta1() 为字符指针的偏移:
Delta1($) = patLen;(不匹配字符在pattern中不存在)
= patLen – 1 -Δ(*);(不匹配字符在pattern中存在,且在pattern中最右边出现的该字符在当前不匹配字符左边)
= 1;( 不匹配字符在pattern中存在,且在pattern中最右边出现的该字符在当前不匹配字符右边)
二、好后缀规则(good suffix rule):根据已经匹配的部分字串(subpat),在pattern中寻找是否有和 subpat 全部或者部分匹配的字串,直接对齐匹配,避免无效的移动;
介绍好后缀规则前先约定几点:
1、 假设 $ 为pattern中没有出现过的字符,有pat[i] = $ 当i 0;
2、 两个序列[C1 … Cn] 和[d1… dn] 是一致的, 当且仅且cj = dj 或者 cj = $ 或者 dj = $;其中(0≤j<n)
3、 最右边可能重新出现的subpat 的位置为rpr(j), 是使[pat[j + 1] ... pat[patlen]] 和
[pat[k] ... pat[k + patlen - j – 1] ]一致的最大K值,其中k≤0 或者pat[k – 1] != pat[j].
上图写出了pattern “ABXYCDEXY” 的rpr()值计算结果:我们来解析下:
a.当j = 8 时,已经匹配字串p[j+1 … patLen-1] 为空,参照rpr()定义,可知,pattern最右边可能和空串一致的,就是p[8 ~ PatLen-1], 可知rpr(8) = 8.
b.当j = 7时,已经匹配字串subpat为”Y”, 可以看到p[3 ~ 3] = subpat , 但是此时k=30, 同时pat(k-1) == pat[j] = “X”, 所以表明该subpat只可能存在pattern头部-1位置,即rpr(7) = -1.
c.当i = 6 时,已经匹配字串subpat为”XY”, 可以看到p[2 ~ 3] = subpat, 同时满足p[k-1] != pat[j] ,可知rpr(6) = 2.
d.当I = 5 时,已经匹配字串subpat为”EXY”, pattern中没有对应字串和subpat一致,只可能存在pattern头部,可知rpr(5) = -3;
其他情况依次类推,上面的几种情况应该包含了所有
文档评论(0)