字符串匹配的Sunday算法--性能上超过KMP和BM算法
来源:互联网 发布:linux查看文件修改时间 编辑:程序博客网 时间:2024/04/28 23:42
第一次听到Sunday算法,是大饼饼说的。在他图文并茂的解释中,我发现这个算法果然是一个又容易理解,效率又强过kmp和BM的算法。
Sunday的移动次数更少!
于是试着写了一个,果真是好东东,分享一下。
转一些概念先:
Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。
假设在发生不匹配时S[i]≠T[j],1≤i≤N,1≤j≤M。此时已经匹配的部分为u,并假设字符串u的长度为L。如图1。明显的,S[L+i+1]肯定要参加下一轮的匹配,并且T[M]至少要移动到这个位置(即模式串T至少向右移动一个字符的位置)。
图1 Sunday算法不匹配的情况
分如下两种情况:
(1) S[L+i+1]在模式串T中没有出现。这个时候模式串T[0]移动到S[T+i+1]之后的字符的位置。如图2。
图2 Sunday算法移动的第1种情况
(2)S[L+i+1]在模式串中出现。这里S[L+i+1]从模式串T的右侧,即按T[M-1]、T[M-2]、…T[0]的次序查找。如果发现S[L+i+1]和T中的某个字符相同,则记下这个位置,记为k,1≤k≤M,且T[k]=S[L+i+1]。此时,应该把模式串T向右移动M-k个字符的位置,即移动到T[k]和S[L+i+1]对齐的位置。如图3。
图3 Sunday算法移动的第2种情况
依次类推,如果完全匹配了,则匹配成功;否则,再进行下一轮的移动,直到主串S的最右端结束。该算法最坏情况下的时间复杂度为O(N*M)。对于短模式串的匹配问题,该算法执行速度较快。
Sunday算法JAVA代码:
- 字符串匹配的Sunday算法--性能上超过KMP和BM算法
- 字符串匹配的Sunday算法--性能上超过KMP和BM算法
- 字符串匹配:kmp,bm和sunday算法
- 字符串匹配算法(KMP, BM, Sunday)
- 字符串匹配算法(KMP、BM和Sunday),及Python实现
- 字符串匹配算法(KMP、BM和Sunday),及Python实现
- sunday、kmp、 bm、 horspool字符串匹配算法 code
- 字符串匹配(BF,BM,Sunday,KMP算法解析)
- 字符串匹配算法综述:BF、RK、KMP、BM、Sunday
- KMP、BM、Sunday等字符串匹配算法及实现
- 字符串的匹配 KMP、Horspool、BM和Sunday
- 字符串匹配--BM算法的改进的算法 Sunday Algorithm
- kmp bm sunday 字符串查找算法
- 字符串匹配之BM和KMP算法
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- 立此存照,万一哪天迈不过坎,回头看看
- 歌 feat featuring
- 关于'愤青'那点事
- 小学数学知识集锦
- linux也挂了
- 字符串匹配的Sunday算法--性能上超过KMP和BM算法
- RIATest Flex测试
- 小学数学基础
- 关于apt和gpg的2个常见错误
- ASP.NET前台javascript与c#后台代码调用
- 林纳斯·托瓦兹
- shell编程知识
- 图文一体化系统的实现
- PHP音乐播放程序