算法之美--3.2.3 KMP算法

不知道看了几遍的kmp,反正到现在都没有弄清楚next[j]的计算和kmp的代码实现,温故而知新,经常回来看看,相信慢慢的就回了

 1 /*!
 2  * \file KMP_算法.cpp
 3  *
 4  * \author ranjiewen
 5  * \date 2017/02/12 16:12
 6  *
 7  */
 8
 9 void preKmp(const char* pattern, int m, int kmpNext[])
10 {
11     int i, j;
12     i = 0;
13     j = kmpNext[0] = -1;
14     while (i<m)
15     {
16         while (j>-1&&pattern[i]!=pattern[j])
17         {
18             j = kmpNext[j];
19         }
20         i++;
21         j++;
22         if (pattern[i]==pattern[j])
23         {
24             kmpNext[i] = kmpNext[j];
25         }
26         else
27         {
28             kmpNext[i] = j;
29         }
30     }
31 }
32
33 #include <iostream>
34 using namespace std;
35 #include <string>
36
37 void KMP(string p, string t)
38 {
39     int m = p.length();
40     int n = t.length();
41     if (m>n)
42     {
43         cerr << "Unsuccessful match!";
44     }
45     const char* x = p.c_str();
46     const char* y = t.c_str();
47
48     int i = 0, j = 0, kmpNext[128];
49     preKmp(x, m, kmpNext);
50
51     i = j = 0;
52     while (i<n)
53     {
54         while (j>-1&&x[j]!=y[i])
55         {
56             j = kmpNext[j];
57         }
58         j++;
59         i++;
60         if (j>=m)
61         {
62             cout << "Matching index found at:" << i - j << endl;
63             j = kmpNext[j];
64         }
65     }
66 }
67
68 int main(int argc, char** argv) {
69
70     string p1 = "abcabcad";
71     string p2 = "adcadcad";
72     string p3 = "ababcaabc";
73     string t = "ctcabcabcadtcaabcabcadat";
74
75     cout << "KMP: " << endl;
76     KMP(p1, t);
77
78     //  cout<<"KMP: "<<endl;
79     //  KMP(p2, t);
80
81     //  cout<<"KMP: ";
82     //  KMP(p3, t);
83
84     return 0;
85 }
时间: 2024-08-19 17:48:52

算法之美--3.2.3 KMP算法的相关文章

串匹配模式中的BF算法和KMP算法

考研的专业课以及找工作的笔试题,对于串匹配模式都会有一定的考察,写这篇博客的目的在于进行知识的回顾与复习,方便遇见类似的题目不会纠结太多. 传统的BF算法 传统算法讲的是串与串依次一对一的比较,举例设目标串S="ababcabcacb",模式串T="abcac",利用BF算法这个过程就会表示为: 将S串理解为数组,底标从0开始,即从a开始,第一次匹配过程如下: ok,当发现T串尚未匹配结束,就开始出现了错误,S串坐标右移+1,开始从b匹配,过程如下: 出现不同,继续

KMP算法学习(详解)

kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚.在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚. kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm).kmp算法通过一个O(

KMP算法的个人理解

版权声明:转载请声明出处. 前言 自学了一段时间,刚刚准备转行做软件开发,面试过程中被指出计算机基础知识薄弱.因为是非科班出生,确实有些计算机方面的基础没有学过,也开始恶补这些方面的东西. 最近在学习数据结构与算法过程中,学到KMP算法,甚是难解.看了阮一峰的网络日志后才慢慢理解,但也发现其中的瑕疵,在此也顺带指出,至于对或不对,还请各位看客指正. 图片和例子讲解均引自阮一峰的网络日志,稍作修改,侵改. 正文 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我

类Process和KMP算法

1 类Process 和ProcessBuilder的比较 Process是一个抽象类,一般通过Runtime.exec()或ProcessBuilder.start()间接创建其实例 :ProcessBuilder是一个最终类,可以通过构造方法来直接创建ProcessBuilder的对象. Process功能相对简单.ProcessBuilder为进程提供了更多的控制,例如,设置当前工作目录.改变环境参数等. 2 KMP算法 KMP算法是一种字符串匹配算法,它可以解决字符串P是否为字符串S的子

基本算法——字符串查找之KMP算法

虽然,c++标准库中为我们提供了字符串查找函数,但我们仍需了解一种较为快捷的字符串匹配查找——KMP算法. 在时间复杂度上,KMP算法是一种较为快捷的字符串匹配方法. 实现代码如下: 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <stdexcept> 5 using namespace std; 6 7 void get(const string &

字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置.比如原字符串为"ABCDEFG",子串为"DEF",则算法返回3.常见的算法包括:BF(Brute Force,暴力检索).RK(Robin-Karp,哈希检索).KMP(教科书上最常见算法).BM(

算法 KMP算法 参考:http://blog.csdn.net/hackbuteer1/article/details/7319115

KMP算法详解: KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n). 在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀. 对于next[]数组的定义如下: 1) next[

kmp算法简明教程

在字符串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

数据结构20:KMP算法(快速模式匹配算法)详解

通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置.一次次的循环,直到匹配成功或者程序结束. "KMP"算法相比于"BF"算法,优势在于: 在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离: 并且可以在O(n+m)的时间数量级上完成对串的模式匹配操作: 故,"