Sunday算法:字符串匹配算法进阶】的更多相关文章

背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法(Knuth-Morris-Pratt算法),让我们的时间复杂度降低到了\(O(m+n)\),但现代文字处理器中,却很少使用KMP算法来做字符串匹配,因为还是太慢了.现在主流的算法是BM算法(Boyer-Moore算法),成功让平均时间复杂度降低到了\(O(m/n)\),而Sunday算法,则是对B…
BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J Strother Moore提出了另一种在O(n)时间复杂度内,完成字符串匹配的算法,这个算法在单模匹配上比KMP算法还要出色 PS:其BM算法在跳转优化上的确比KMP算法要好很多,能在O(N)的上界就完成匹配了,但是不是绝对的,我们讲到后面再来说这个问题. 我们知道,KMP算法之所以能那么快,是因为他…
一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想后的优化. 所以本文重点是讲解KMP算法的核心,文章最后会有涉及一些改良过程. 二.KMP算法简介 KMP算法是字符串匹配算法的一种.它以三个发明者命名,Knuth-Morris-Pratt,起头的那个K就是著名科学家Donald Knuth. 三.KMP算法行走过程 首先我们先定义两个字符串作为示…
字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的C库函数strstr()快多少,而BM算法则往往比KMP算法快上3-5倍(未亲身实践).但是BM算法还不是最快的算法,这里介绍一种比BM算法更快一些的查找算法Sunday算法.   Sunday算法的思想和BM算法中的坏字符思想非常类似.差别只是在于Sunday算法在匹配失败之后,是取目标串中当…
背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法(Knuth-Morris-Pratt算法),让我们的时间复杂度降低到了\(O(m+n)\),但现代文字处理器中,却很少使用KMP算法来做字符串匹配,因为还是太慢了.现在主流的算法是BM算法(Boyer-Moore算法),成功让平均时间复杂度降低到了\(O(m/n)\),而Sunday算法,则是对B…
前言 上一篇我用动画的方式向大家详细说明了KMP算法(没看过的同学可以回去看看). 这次我依旧采用动画的方式向大家介绍另一个你用一次就会爱上的字符串匹配算法:Sunday算法,希望能收获你的点赞关注收藏与转发哟! KMP算法是一个里程碑似的算法,它的出现宣告了人类是找到线性时间复杂度的字符串匹配算法的.在这之后,出现了许多的字符串匹配算法,比如BM算法和Sunday算法. 这些算法在时间复杂度上都已经达到了线性时间.但是在实际应用的时候所耗费的时间却还是有所不同. BM算法在实际应用中的效率已经…
字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法(Knuth-Morris-Pratt算法),让我们的时间复杂度降低到了O(m+n),但现代文字处理器中,却很少使用KMP算法来做字符串匹配,因为还是太慢了.现在主流的算法是BM算法(Boyer-Moore算法),成功让平均时间复杂度降低到了O(m/n),而Sunday算法…
逛ACM神犇的博客的时候看到的这个神奇的算法 KMP吧,失配函数难理解,代码量长 BF吧,慢,很慢,特别慢. BM吧,我不会写... 现在看到了Sunday算法呀,眼前一亮,神清气爽啊. 字符串匹配算法的效率大概是取决于在发生失配时如何进行下一步的问题. 其他咱就不说了. 这个Sunday算法在发生失配的时候,跳过了尽可能多的字符. 假设在发生不匹配时S[i]≠T[j],1≤i≤N,1≤j≤M.此时已经匹配的部分为u,并假设字符串u的长度为L.如图1.明显的,S[L+i+1]肯定要参加下一轮的匹…
一:Brute force 从源串的第一个字符开始扫描,逐一与模式串的对应字符进行匹配,若该组字符匹配,则检测下一组字符,如遇失配,则退回到源串的第二个字符,重复上述步骤,直到整个模式串在源串中找到匹配,或者已经扫描完整个源串也没能够完成匹配为止. 缺点:假如我们从头开始匹配str1和str2,当匹配到str1[i]时,发现str2[i]!=str1[i],这时我们就回到str1起始匹配的地方,把str2右移一位,对准str1下一字符作为起点,进行匹配.由于上一次匹配到了str1[i],那么重新…
简介: Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法.其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率. 思路: Sunday 算法 与 KMP 算法 一样是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位字符的下一位字符.1.如果该字符没有在模式串中出现则直接跳过,即移动位数 = 模式串长度 + 1:2.否则,其移动位数 …