时间复杂度O()与KMP算法】的更多相关文章

要得到某个结果,可以有很多种方式,算法就是为了寻找一条最快的方式. 而评判其好坏的标准就是时间复杂度. O(1): 我们把执行一次的时间复杂度定义为O(1) sum = a +b; cout << sum <<endl; O(n): for(int i = 0; i < n ;++n) { //do something. } O(n2): for(int i = 0; i < n ;++n) { for(int j = 0; j < n ;++n) { //do…
作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解说KMP算法的时候,言语磕磕碰碰,我想,原因有二:1.博客内的东西不常回想,忘了不少:2.便是我对KMP算法的理解还不够彻底,自不用说解说自如,运用自如了.所以,特再写本篇文章.因为此前,个人已经写过关于KMP算法的两篇文章,所以,本文名为:KMP算法之总结篇. 本文分为例如以下六个部分: 第一部分…
字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺术>的作者!! KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题.说简单点就是我们平时常说的关键字搜索. KMP算法是用来求一个较长字符串是否包含另一个较短字符串的算法. 模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则…
KMP算法是用来做字符串匹配的.关于字符串匹配,最简单最容易想到的方法是暴利查找,使用双重for循环处理. 该方法的时间复杂度为O((n-m+1)*m) (n为目标串T长度,m为模式串P长度, 从T中寻找是否有P串存在). 暴利的问题是在匹配中没有利用之前比较的信息.而这些信息可能是非常有用的.所以是可以进行优化以降低时间复杂度. 而KMP算法就是一个利用模式串来构造计算不匹配时计算模式串和目标串比较的位置,避免回溯. KMP的思想为利用字符串的后缀串信息. 对于某个字符串y,如果有字符串w,满…
一.什么是 KMP 算法 KMP 算法是一种改进的字符串匹配算法,用于判断一个字符串是否是另一个字符串的子串 二.KMP 算法的时间复杂度 O(m+n) 三.Next 数组 - KMP 算法的核心 KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是通过一个 next() 实现 1.next 数组: 长度与字符串长度一致,每个位置存储对应字符的最长匹配长度 2.next 数组通过遍历子字符串中"前缀"和"后缀"的最…
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说程序实现,思想很简单). 模式匹配的经典应用:从一个字符串中找到模式字串的位置.如“abcdef”中“cde”出现在原串第三个位置.从基础看起 朴素的模式匹配算法 A:abcdefg  B:cde 首先B从A的第一位开始比较,B++==A++,如果全部成立,返回即可:如果不成立,跳出,从A的第二位开…
之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹…
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果. BF算法实现: int BF(char S[],char T[],int pos) {//c从第pos位开始搜索匹配 ; while(S[i+j]!='\0'&&T[j]!='\0') { if(S[i+j]==T[j]) j…
前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比较流行的做法是实现一个next()函数,函数本身包含了模式串的局部匹配信息.由于next函数理解起来不太容易,本文同样是基于空间换时间的做法,但将采用另一种代码实现,希望可以更方便读者理解! 测试数据 aseeesatba esat as330kdwejjl_8 jjl_ faw4etoesting…
1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth(<计算机程序设计艺术>的作者). 2 KMP算法 这个算法不太容易理解,网上有很多解释,但…
KMP算法是一个很精妙的字符串算法,个人认为这个算法十分符合编程美学:十分简洁,而又极难理解.笔者算法学的很烂,所以接触到这个算法的时候也是一头雾水,去网上看各种帖子,发现写着各种KMP算法详解的转载帖子上面基本都会附上一句:“我也看的头晕”——这种诉苦声一片的错觉仿佛人生苦旅中找到知音,让我几乎放弃了这个算法的理解,准备把它直接记在脑海里了事. 但是后来在背了忘忘了背的反复过程中发现一个真理:任何对于算法的直接记忆都是徒劳无功的,基本上忘得比记的要快.后来看到刘未鹏先生的这篇文章:知其所以然(…
1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模式串为\(P[0 \dots p-1]\),则主串与模式串的长度各为\(n\)与\(p\). 暴力匹配 暴力匹配方法的思想非常朴素: 依次从主串的首字符开始,与模式串逐一进行匹配: 遇到失配时,则移到主串的第二个字符,将其与模式串首字符比较,逐一进行匹配: 重复上述步骤,直至能匹配上,或剩下主串的长…
//串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstring> using namespace std; //-----串的定长顺序存储结构----- #define MAXLEN 255 //串的最大长度 typedef struct { ]; //存储串的一维数组 int length; //串的当前长度 }SString; ]; ]; int Inde…
前言: 纠结于KMP已经两天了,相较于本人之前博客中提到的几篇博文,本人感觉这篇文章更清楚地说明了KMP算法的来龙去脉. http://www.cnblogs.com/goagent/archive/2013/05/16/3068442.html 1.传统的字符串匹配算法 /* * 从s中第sIndex位置开始匹配p * 若匹配成功,返回s中模式串p的起始index * 若匹配失败,返回-1 */ int index(const std::string &s, const std::string…
// 此博文为迁移而来,写于2015年5月24日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1iw.html 1.前言        好吧我得承认这东西应该是早就要会了的...虽然感觉上用的不多,但是当我开始接触AC自动机的时候,发现这是一个很必要的知识点,所以今天来讲一讲.        然而有一个问题了——为什么我一直没有搞懂就是因为许多许多次我看网上的一些文章就发现总是弄得很复杂,所以我推荐大家直接看代码,…
按照学习计划和TimeMachine学长的推荐,学习了一下KMP算法. 昨晚晚自习下课前粗略的看了看,发现根本理解不了高端的next数组啊有木有,不过好在在今天系统的学习了之后感觉是有很大提升的了,起码能打出模板了...(无奈) KMP算法是一种字符串匹配算法,能够最坏在线性时间跑出答案的算法,时间复杂度为O(n+m) 对于字符串匹配,原始的套路在于两个串直接枚举起来.当要被查询的串T[]与查询串P[]的首字母匹配时便依次比较下去,一旦失配后T[]串的下标+1继续找,直到找到为止 KMP算法的做…
今天又看了一遍KMP,感觉真的懂了...就来这儿发一下心得吧. KMP算法其实就是暴力的改进版.让我们看看暴力的匹配. Original string: ababababcbbababababc Pattern string:  abababc 步骤: ababababcbbababababc abababc....中间一些步骤ababababcbbababababcabababc这里a和c匹配不了了,传统的作法会从第二个字符`b'开始匹配.明显不行又跳出.即:ababababcbbababab…
>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>几个优化的字符串匹配算法 (1)Boyer-Moore算法 (2)R…
1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 package com.alice.dataStructe5.bf; /** * 返回子串t在主串s中第pos个字符之后的位置,若不存在,则返回-1 * @author Administrator * */ public class BF { public int index(String s,St…
一.问题 咱们先不管什么KMP,来看看怎么匹配两个字符串. 问题:给定两个字符串,求第二个字符串是否包含于第一个字符串中. 为了具体化,我们以 ABCAXABCABCABX 与 ABCABCABX为例. 正所谓:暴力出奇迹,枚举是真知.(大雾)先把代码敲出来再说,后面的事后面再考虑. 暴力/朴素匹配:时间复杂度O(N*M) 虽然能够得到结果,但是速(bi)度(ge)太低.多看几遍就觉得这里出现了太多无用的计算,每次匹配失败就移动一格,实在挤牙膏. 如果我们在每次匹配失败时多移动几位? 二.加速…
浅析KMP算法 KMP算法是一种线性字符串的匹配算法,将主串S与模式串T匹配. 首先朴素算法大家都会,就是直接从S的每一个位置开始,枚举比较,时间效率为O(nm),现在要想到一种化简的方式,使得时间复杂度得以减少,不考虑其他古怪的时间复杂度,那么必然要求是线性的. 观察串S="aaaaab",T="aaab",现在进行朴素的算法,看看有什么可化简的地方. 观察S匹配到第3位,T匹配到第3位的时候,发现下一位不能再匹配,此时说明S[1..3]=T[1..3],所以S[…
感觉写的很好,尤其是底下的公式,易懂,链接:http://www.cnblogs.com/mypride/p/4950245.html 举个例子 模式串S:a s d a s d a s d f a s d 匹配串T:a s d a s d f 如果使用朴素匹配算法—— 1 2 3 4 5 6 7 8 9 a s d a s d a s d f a s d a s d a s d f 1 2 3 4 5 6 此时,匹配到了S7和T7了,S7为a而T7为f,不匹配那么朴素的匹配算法会这么做—— 1…
在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a b p = a b a a b j = 0 1 2 3 4 在kmp算法发明之前.人们使用这种算法: ''' 原始的求子串位置算法,O( m * n ) ''' def string_index_of( pstr, pattern, pos = 0 ): str_index = pos patte…
KMP代码: int KmpSearch(char* s, char* p) { ; ; int sLen = strlen(s); int pLen = strlen(p); while (i < sLen && j < pLen) { //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ || s[i] == p[j]) { i++; j++; } else { //②如果j != -1,且当前字符匹配失败(即S[i] != P[j…
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串).比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串.…
KMP算法是众多优秀的模式串匹配算法中较早诞生的一个,也是相对最为人所知的一个. 算法实现简单,运行效率高,时间复杂度为O(n+m)(n和m分别为目标串和模式串的长度) 当字符串长度和字符集大小的比值很大时,KMP算法相对蛮力有着很大的优势 理解KMP算法,关键是理解其中的精髓——next[]数组. (统一起见,下文将目标字符串记作obj,将模式字符串记作pattern,这与后面的程序代码是一致的) 我们给一个字符串S定义一个next值,记作next(S),next(S)=n表示: (1)S的前…
http://www-igm.univ-mlv.fr/~lecroq/string/node19.html 首先看普通的串的模式匹配算法开始讲起,才能更深入的了解KMP算法及其优点. 1. 普通的串的模式匹配算法是怎么进行比较: 主串 (S) a b a b c a b c a c b a b 子串 (T) a b c a c       (子串又被称为模式串) 第一趟(详细过程) ab a b c a b c a c b a bab c a c aba b c a b c a c b a ba…
KMP串匹配算法是一个经典的算法. 传统BF算法是传统的字符串匹配算法.很好理解.叶实现.但时间复杂度太高. 本文将从字符串模式字符串被称为.为了匹配字符串被称为主弦. KMP配时能够少移动从串的位置,从而保持主串的索引不移动. 1 原理 如上图所看到的,假设在从串中有A=B,然后在匹配的时候,发现B后面的字符与X后面的字符不匹配,又因为B=X,因此,就有X=A,那么.在下次比較的时候就不用回溯了,直接比較X后面的字符与A后面的字符. 这样就行使遍历主串的索引不移动,仅仅移动从串的索引.因此.时…
/**  * Java实现KMP算法  *   * 思想:每当一趟匹配过程中出现字符比较不等,不需要回溯i指针,   * 而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远   * 的一段距离后,继续进行比较.  *   * 时间复杂度O(n+m)  *   */  public class KMP { //通过计算返回字串t的next数组    public int[] get_next(char[] t){        int lengthT = t.length;      …
参考:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 2016-08-22 前言:自己看<算法导论>中关于KMP算法的讲解,文字描述+插图+伪代码,但最终还是云里雾里.之后借助于上面提到的博客才有所体会.感谢博主. 对于其最核心的部分---当模板字符串中前面q个字符和源字符串中的某个子串匹配时,如果继续往下匹配,发现两个字符并不相同,那该如何移动模板字符串进行比较呢…