前言 由于需要做一个快速匹配敏感关键词的服务,为了提供一个高效,准确,低能耗的关键词匹配服务,我进行了漫长的探索.这里把过程记录成系列博客,供大家参考. 在一开始,接收到快速敏感词匹配时,我就想到了 KMP 翻译过来叫"看毛片"的算法,因为大学的时候就学过它.听说到它的效率非常高.把原本字符串匹配效率 O(n*m) 缩短到了O(n+m),把✖️变成了➕,真是了不得. 每次我回顾 KMP 算法时,都会发现自己是个小白,或者每次回顾时,都发现上次因为回顾而写的总结居然是错的!所以为了学习快…
参考:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 2016-08-22 前言:自己看<算法导论>中关于KMP算法的讲解,文字描述+插图+伪代码,但最终还是云里雾里.之后借助于上面提到的博客才有所体会.感谢博主. 对于其最核心的部分---当模板字符串中前面q个字符和源字符串中的某个子串匹配时,如果继续往下匹配,发现两个字符并不相同,那该如何移动模板字符串进行比较呢…
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现.KMP算法的关键是利用匹配失败后的信息,从错误中吸取经验,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 代码:(tex为被查找的字符串,pat为要查找的模式串) scanf("%s", tex); scanf("%s", pat); n = strlen(tex); m = strlen(pat); pi[1] = 0; int p = 0; for…
这大概是我看的最好懂的KMP算法讲解了,不过我还只弄懂了大概思想,算法实现我到时候用java实现一遍 出处:知乎 https://www.zhihu.com/question/21923021/answer/281346746 有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试着从这个思路再介绍一下.大家只需要记住一点,PMT是什么东西.然后自己临…
(作者matrix67) KMP算法是拿来处理字符串匹配的.换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串).比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串.你可以委婉地问你的MM:"假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?" 解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配.假如A串长度为n,B串长度为m,那么这…
详细理解看这里:http://kb.cnblogs.com/page/176818/ 或者这里:http://blog.csdn.net/yutianzuijin/article/details/11954939 next[]数组的意义是“除自身外的最大重复子串”. next数组计算: 理解了kmp算法的基本原理,下一步就是要获得字符串f每一个位置的最大公共长度.这个最大公共长度在算法导论里面被记为next数组.在这里要注意一点,next数组表示的是长度,下标从1开始:但是在遍历原字符串时,下标…
字符串匹配的暴力解法 给定字符串s和p,寻找字符串p在字符串s中出现的位置,暴力解法如下所示: 如果当前字符匹配成功,++i;++j,继续匹配下一字符. 如果s[i]与s[j]匹配失败,令i-=(j-1),j=0,即i转到上次首次匹配开头字符的下一位置,j从头开始. int brute_match(string s, string p) { int slen = s.size(); int plen = p.size(); int i = 0, j = 0; while (i < slen an…
1.KMP算法解决问题:对BF(Brute Force)算法优化,避免对主串进行回溯匹配(匹配不成功主串指针向后移1位,子串指针重置开始位置,两串继续匹配),效率底. 2.KMP算法原则/目的:主串不回溯即匹配指针就指在失配位置,由子串/模式串移动,由这样模式完成字符串匹配. 3.KMP算法怎样实现目的:通过子串/模式前后缀是否存在匹配情况,来决定子串/模式是否需要在失配位置前移子串/模式. 注意:子串/模式前后缀要取最长匹配,这样才能保证不会错过主串中任何一个拥有与子串开头相同的位置. 3.1…
引 入 引入 引入 " SY 和 WYX 在看毛片.(几 毛 钱买到的动作 片,毛 片) WYX 突然想回味一个片段,但是只记得台词里面有一句挺长的 " ∗ ∗ ∗ ∗ **** ∗∗∗∗ ",于是,他们找到剧本,想看 " ∗ ∗ ∗ ∗ **** ∗∗∗∗ "在剧本中出现了几次,分别是在什么地方. 他们遇到了麻烦,这样的剧本随便就是数百万单词,数千万字母,而且 " ∗ ∗ ∗ ∗ **** ∗∗∗∗ "长度也有上千万. 为了解决这个问…
和KMP相似,用于字符串的匹配,貌似平均复杂度比KMP快,也比KMP更好理解. 大概意思是: 如果串b被串a包含,那么串a此时与串b匹配的部分一定一样 所以如果从开头开始匹配到不同处时,在a串找中此时a串中对应的b串末尾下一位最靠右出现的位置,记作m 如果找不到,直接跳过这一段(显然无法在这一段里找到答案) 如果找到,就让b串中这个位置与m对齐 大概是这么一个意思: Step1:比较至第二位时发现失配,比较两个染色位置的字符,发现相同 Step2:将T字符从左往右数的第一个与S[4]相同的字符移…