`
java-mans
  • 浏览: 11412227 次
文章分类
社区版块
存档分类
最新评论

KMP算法;学习严蔚敏;大概理解;

 
阅读更多
  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. usingnamespacestd;
  5. strings;//主串
  6. stringt;//模式串
  7. vector<int>next;//next函数值
  8. vector<int>nextval;//next修正函数值
  9. voidget_next()
  10. {
  11. inti=1;
  12. intj=0;
  13. next[1]=0;
  14. while(i<(int)t.size()-1)
  15. {
  16. if(j==0||t[i]==t[j])//i指针不回溯
  17. {
  18. ++i;
  19. ++j;
  20. next[i]=j;
  21. }
  22. else//如果不相等,则j根据已求next回溯,或者找到t[i]==t[j]且j不能再大,则next[++i]=next[++j],或者j==0,则没有能匹配相等的,则++i,++j
  23. {
  24. j=next[j];
  25. }
  26. }
  27. }
  28. voidget_nextval()
  29. {
  30. inti=1;
  31. intj=0;
  32. nextval[1]=0;
  33. while(i<(int)t.size()-1)
  34. {
  35. if(j==0||t[i]==t[j])
  36. {
  37. ++i;
  38. ++j;
  39. if(t[i]!=t[j])
  40. {
  41. nextval[i]=j;
  42. }
  43. else
  44. {
  45. nextval[i]=nextval[j];
  46. }
  47. }
  48. else
  49. {
  50. j=nextval[j];
  51. }
  52. }
  53. }
  54. intindex_kmp(intpos)
  55. {
  56. inti=pos;
  57. intj=1;
  58. while(i<=(int)s.size()-1&&j<=(int)t.size()-1)
  59. {
  60. if(j==0||s[i]==t[j])
  61. {
  62. ++i;
  63. ++j;
  64. }
  65. else
  66. {
  67. j=nextval[j];
  68. }
  69. }
  70. if(j>(int)t.size()-1)
  71. {
  72. returni-((int)t.size()-1);
  73. }
  74. else
  75. {
  76. return0;
  77. }
  78. }
  79. intmain()
  80. {
  81. stringtemp;
  82. s.push_back('#');
  83. t.push_back('#');
  84. cout<<"输入主串:";
  85. getline(cin,temp);
  86. s+=temp;
  87. cout<<"输入模式串:";
  88. getline(cin,temp);
  89. t+=temp;
  90. next.assign(t.size()+1,0);
  91. nextval.assign(t.size()+1,0);
  92. //以上为输入部分
  93. get_nextval();
  94. cout<<index_kmp(1)<<endl;
  95. }

以下i表示主串位置,j表示模式串位置,s为主串,t为模式串.

KMP算法的牛逼之处就是免去i的回溯, 否则普通的扫描扫着扫着不相等,i又回溯到之前的起始位置的下一个位置,j也回溯到1,又开始匹配.

而KMP则是i一直向前走,一旦遇到不匹配的字符,j回溯到一个可以用来比较的位置,而j之前的t部分串与s串i之前的部分是最大匹配的,然后检测s[i],t[j]是否相等,相等则i可以+1,j+1,继续检测,此时i能够后移的原因是,i之前的部分串已最长的匹配t串,这种理解只可意会,不可言传....

next的作用: 当扫描过程中,如果s[i]!=t[j],那么j=next[j],然后比较s[i]与t[j],此时.....s[i-1]与......t[j-1]是最长匹配的,如果s[i]==t[j],那么++i,++j,继续扫描下一位,如果不相等,那么继续j=next[j],再找一个次长的匹配,比较s[i]与s[j],如果一直到j==0都没有匹配i位的字符,那么说明整个模式串与s[i]以及之前的一段都没有匹配,则++i,++j, 即继续从j=1,i=i+1比较。

next怎么求的:这个非常飘渺, next只与模式串有关,因为在s与t匹配过程中一旦遇到一个字符不匹配,那么就应该尝试用已经匹配的那一段t与已经匹配的s的部分去匹配,然后比较t的部分匹配的下一个位置与s[i]是否相等. 所以求next就相当于t与t进行匹配的过程, 与KMP算法非常类似的,首先令i=1,j=0,next[1]=0,表示如果t[1]与主串的字符不匹配,那么应该去和t[0]比较且t[0]之前部分匹配,但是t[0]没有字符,所以if j==0, ++i,++j, 这一位t[i]已经没法匹配了。 如果t[i]与t[j],则++i,++j,并且++i,++j之前的i,j之前的段属于匹配的,所以++i,++j以后的next[i]=j,即如果s[某一位]与t[i]不相等,那么就可以根据next[i]找到j,用s[某一位]与t[j]比较看是否相等.

nextval怎么求:这个是next的升级版,思想是建立在next之上的,但是并不是说要先求next才能求nextval, nextval只是在next的思想上进一步优化了。 如果求next的过程中,t[i]==t[j],那么本来可以直接写 next[++i]=++j; 但是这时候有一些问题,如果t[++i]与主串s[某位]不相等的时候,我们用next[++i],结果t[next[++i]]与t[++i]又相等,虽然i之前的t串与s串某一位之前完全匹配,但是这样的比较是没有意义的,因为既然匹配过程中已不相等,根据next滑动t串后的比较位与t之前的比较位一样,肯定也不匹配,所以这时候我们就非常需要nextval发挥作用了。 所以如果求next的过程中,t[++i]==t[++j],那么我们应该让j回溯到nextval[j]以找到一个不相等的位匹配,这样就最终求得了nextval的所有情况.

的确是只可意会不可言传,权当自己的思路笔记了。。。。。。。。。。不指望别人能读懂

分享到:
评论

相关推荐

    jedis示例代码压缩包

    jedis示例代码

    高分课程设计 QT5.7+Sqllite数据库小系统源码+部署文档+全部数据资料

    【资源说明】 高分课程设计 QT5.7+Sqllite数据库小系统源码+部署文档+全部数据资料 可实现数据库的可视化操作:增、删、改、查.zip 【备注】 1、该项目是高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过mac/window10/11/linux测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    中文文本分类 传统机器学习+深度学习.zip

    中文文本分类 传统机器学习+深度学习

    Linux学习笔记4-点亮LED灯(汇编裸机)程序

    Linux学习笔记4---点亮LED灯(汇编裸机)程序

    英特尔杯软创大赛RCDancer项目组工程文件夹.zip

    英特尔杯软创大赛RCDancer项目组工程文件夹

    0011后台管理模板AdobeXD源码下载设计素材UI设计.xd

    0011后台管理模板AdobeXD源码下载设计素材UI设计

    高分毕业设计 基于Spark2.x新闻网大数据实时分析可视化系统项目源码+部署文档+全部数据资料.zip

    【资源说明】 高分毕业设计 基于Spark2.x新闻网大数据实时分析可视化系统项目源码+部署文档+全部数据资料.zip高分毕业设计 基于Spark2.x新闻网大数据实时分析可视化系统项目源码+部署文档+全部数据资料.zip 【备注】 1、该项目是高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过mac/window10/11/linux测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    Netty实现大文件分块传输详解.pdf

    java Netty实现大文件分块传输详解

    Hotel_Responsive_Landing_PageAdobeXD源码下载设计素材UI设计.xd

    Hotel_Responsive_Landing_PageAdobeXD源码下载设计素材UI设计

    公司年会各种总结发言稿样稿范文word版本资料

    +公司年会总结发言 年会总结 年总结发言 年终总结发言稿 总结发言 龙总结发言 公司年会总结发言 +年会发言稿样稿 年会发言稿样稿01.doc 年会发言稿样稿02 年会发言稿样稿03 年会发言稿样稿04 \年会各种发言稿范文 主持人台词、主持人开场白、主持人串词大全 企业年会领导致辞范文(很经典) 优秀员工代表公司年会发言稿(幽默) 供应商代表年会发言稿 公司年会主持串词 公司年会主持人串词 公司年会主持台词 公司年会主持稿大全 公司年会主持词开始及结束语 公司年会总经理致词范文 公司年会领导讲话稿 员工代表年会发言稿 年会串词(最终版) 年会主持词 年会优秀发言稿结尾 年会游戏主持稿 年会董事长或总经理发言稿 总经理年会发言稿范文 新员工代表公司年会发言稿(范文) 最新公司年会发言稿 科技公司年会主持词串词 经销商年会公司领导发言稿(范文) 董事长年会致辞(简短有力)

    导航主页模板 html模板.zip

    导航主页模板 html模板

    理财管理(Spring boot+thymeleaf)

    该毕业设计使用了当前较为流行的spring boot,spring,spring mvc,mybatis,shiro框架分页处理使用了pagehelper进行操作 前台使用了模板语言thymeleaf,界面较为炫酷,适合年轻朋友。 开发工具采用的是IDEA。 该系统主要解决了理财中的一些问题,包含功能: 1. 权限管理 2.用户信息管理 3.理财产品管理等内容。

    SQL详细介绍资料.zip

    sql,SQL(Structured Query Language,结构化查询语言)是一种标准化的语言,用于在关系数据库管理系统(RDBMS)中存取和操作数据。SQL 使得用户能够访问和操作数据库中的数据,包括数据的查询、插入、更新和删除,以及数据库结构的创建和修改。

    基于海思3519DV500的网页无插件视频播放方案

    基于海思3519DV500的网页无插件视频播放方案

    windows-win32-direct3d12.pdf

    This programming guide contains information about how to use the Direct3D 12 programmable pipeline to create a customized graphics engine. The Direct3D 12 headers and libraries are part of the Windows 10 SDK. There is no separate download or installation required to use Direct3D 12

    网络安全课本资源.zip

    网络安全课本资源.zip

    stm32zet6使用TFTLCD事项亮屏

    stm32zet6使用TFTLCD事项亮屏

    [精品] todo_appAdobeXD源码下载设计素材UI设计.xd

    [精品] todo_appAdobeXD源码下载设计素材UI设计

    Company_Responsive_Landing_PageAdobeXD源码下载设计素材UI设计.xd

    Company_Responsive_Landing_PageAdobeXD源码下载设计素材UI设计

    HTML27-创意官网模板官网落地页APP主页产品宣传页源码 landing静态页面.zip

    HTML27-创意官网模板官网落地页APP主页产品宣传页源码 landing静态页面

Global site tag (gtag.js) - Google Analytics