数据结构 KMP 算法实现

KMP 算法关键是要求出next数组下面是求next数组的算法

n利用next[0]= -1,…,next[i] 求next[i+1] 的算法:

假设 k =next [i],

  1) 若pk = pi, 则 p0… pi-k…pi 中最大相同前后缀长度为next[i+1] = k+1

  2)若pk ¹ pi ,置 k=next[k] ,然后转到 第1步.

    (设 k = next[k],就是考虑前一个更短的匹配前缀,从那里继续向下检查)

  3)若 k 值(来自next)为-1,就得到p0… pi-k…pi中最大相同前后缀的长度为k = 0(即next [i+1] = 0)

对求next数组的改进

n当 pi !=  tj 时,若pi == pk, 那么一定有 pk != tj .所以模式串应再向右移 k-next[k]位,下一步用 pnext[k] 与tj比较
n对于next[i]=k 的改进:
if  (pk== pi)  next[i] = next[k];
else  next[i]=k;

  这一改进可以避免一些不必要的操作.

下面是一个例子:

 1 /*============================================================================*\
 2  *
 3  *                     数据结构基础练习
 4  *
 5  *                        KMP 算法测试
 6  *
 7  *                    2013-05-20 by 樊列龙
 8  *
 9 \*============================================================================*/
10
11 #include <iostream>
12
13 using namespace std;
14
15 void set_next(char* p, int* next)
16 {
17     int i = 0, j= -1;
18     next[0] = -1;
19
20     while(p[i])
21     {
22         while(j >= 0 && p[i] != p[j])
23         {
24             j = next[j];
25         }
26         i++,j++;
27         if(p[i] == p[j]) next[i] = next[j];
28         else next[i] = j;
29
30     }
31 }
32
33 int KMP(char* s, char* p, int *next, int n)
34 {
35     int i = 0,j = 0;
36     int count = 0;
37     while(s[i] && j < n)
38     {
39         if(j == -1 || s[i] == p[j])
40         {
41             j++,i++;
42             count++;
43         }
44         else
45         {
46             j = next[j];
47         }
48     }
49
50     if(j >= n)
51     {
52         return i-n+1;
53     }
54
55     return 0;
56 }
57
58 int main()
59 {
60     char s[] = "abaabca8934baaabaabc23abaabcaca2312";
61     char p[] = "abaabcac";//8个字符
62     int next[100];
63
64     set_next(p,next);
65     cout << KMP(s,p,next,sizeof(p)-1) << endl;
66
67     return 0;
68 }

结果:

23

  

转载于:https://www.cnblogs.com/CocoonFan/archive/2013/05/20/3087913.html

数据结构 KMP 算法实现相关推荐

  1. 数据结构--KMP算法总结

    数据结构-KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会, ...

  2. [转]数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

  3. 数据结构——KMP算法(难懂版,但还是看看吧)

    据说这个算法很难,起初看了<大话数据结构>,知道了这个算法,但是没看懂没理解,然后看其他博客,尽管博客上写着易懂,好理解,但我仍然看不懂,不理解,心里一直在口吐芬芳. 后来我看了几个版本的 ...

  4. 数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

  5. 数据结构 KMP算法中next数组与nextval如何求

    个人学习用,比较杂乱. 一.例题 二.题目(3)next解法见图 三. nextval如何求解? 3.1步骤一:画图,先求出next 3.2 位置1的数必定为0,记住即可 位置2的next为1,所以要 ...

  6. a - 数据结构实验之串一:kmp简单应用_中高级面试必备:快速入门数据结构和算法

    一 前言 1 为什么要学习算法和数据结构? 解决特定问题. 深度优化程序性能的基础. 学习一种思想:如何把现实问题转化为计算机语言表示. 2 业务开发要掌握到程度? 了解常见数据结构和算法,沟通没有障 ...

  7. 数据结构与算法之KMP算法

    数据结构与算法之KMP算法 目录 KMP算法介绍 输入字符串str1,str2,返回字符串str2是否在str1中,在的话在第几位开始 1. KMP算法介绍 在CSDN上看到一篇写的很好的关于KMP的 ...

  8. 数据结构与算法一篇帮助你吃下KMP算法

    模式匹配 什么是模式匹配,我们用一个案例来说明: 当S = "s1,s2,s3,s4 -sn" T="t1,t2,t3,t4 - tn" 在字符串S中寻找T字符 ...

  9. c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析

    以前看到数据结构中字符串的模式匹配时,花了半天的时间,才把KMP算法中的next函数整明白了,结果过了几天在看到这时,只记得next[j+1]=next[j]+1,但是有时候能套公式正确算出,有时候就 ...

  10. 数据结构 4 字符匹配-KMP算法

    第四章主要介绍的是串,但是串的实现没什么必要,最重要的知识点在于KMP算法的使用,大二时数据结构总结过一次KMP算法,大二时总结的比较细致,链接如下: https://blog.csdn.net/we ...

最新文章

  1. 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶
  2. Android RxJava 2.0中backpressure(背压)概念的理解
  3. linux网络编程常用函数详解与实例(socket--bind--listen--accept)
  4. spring-boot 入门学习
  5. CentOS 下安装xdebug
  6. 详解李兰娟团队重大抗疫药物成果:2款处方药,体外试验有奇效,已在浙江临床使用...
  7. 重读模式与架构(2)——层次划分的依据和角色职责
  8. 枚举smb共享期间出错_大量三星手机黑屏系统崩溃,客服:闰4月计算出错
  9. c语言编程GetTickCount,c语言计算时间方法---clock-GetTickCount-QueryPerformanceCounter
  10. C语言阿拉伯数字转大写汉字,阿拉伯数字转大写汉字
  11. 目前为止最靠谱的禁用windows10update易升自动更新的办法
  12. 自定义电子邮件 html_如何在Windows 10中设置和自定义电子邮件帐户
  13. Apache Zeppelin安装和启动
  14. 福州大学计算机专业排名2018,福州大学2019年排名第64位 较2018年下降3名
  15. mac电脑备份后的微信聊天记录怎么找
  16. ipmitool 配置IP地址,账户,密码
  17. OpenCL Programming Guide - OpenCL 编程指南 - 书中源代码
  18. 网络的可靠性是设计出来的
  19. java抽象方法声明_java抽象类和抽象方法
  20. SpringBoot——【thymeleaf】——为什么要使用thymeleaf

热门文章

  1. python怎么更新列表_python更新列表的方法
  2. 服务器是怎么响应服务器的细节,我怎样才能得到响应从Web服务器
  3. ant 日期组件中文_Vue3开源组件库,今天“它们”来了
  4. 【动手学深度学习】代码(持续更新)
  5. jxl java mer_导出报表出错,有没有大神懂得
  6. 计算机采用二进制码的优点
  7. linux 进程 D 状态,Linux 进程的 Uninterruptible sleep(D) 状态
  8. leetcode 125 valid-palindrome
  9. CS231n李飞飞计算机视觉 神经网络训练细节part2上
  10. 【知识图谱系列】动态时序知识图谱EvolveGCN