用字符串

匹配字符串
,即判断
是否包含
表示字符串
个字符

next数组本身也是一个记录下标的数组,所以会受到我们对于匹配项编码排序的影响,理论上不连续编码也是可以的,甚至不用数字编码都可行,但是为了编程方便,所以我们才采用了连续的整数进行编码

本文采用如下编码方式,这种编码可以避免出现负数,(可以认为0位置的值为和任意字符都可以匹配的值,所以如果当前位置为0,那就需要j和i都要往前移一位)

假如数组next中,第j个元素的值5,则代表当j位置发生不匹配时,要移动

,直到编码为5的元素对准发生不匹配的位置。(这个是整个算法的核心思想)

由于字符串

每个位置都有可能发生不匹配,所以next的

元素个数刚好等于字符串

的长度。

对于任意字符串

的头两个元素发生不匹配时,都有固定的值,即0,1(与编码方式有关,按本文的编码方式就是0,1)与之匹配,即对于任意数组next其头两个元素都是0和1。

在计算next数组时,我们是逐步将编码变大的,这里将编码记为

逐步变大的过程中,最长公共前后缀子串的增大也

只能是逐步增大的,但是是可以突然减小的,因为可能在

逐步增大过程出现一个前面都没出现过的新字符,这时next会突然降为1

结合这特点,我们设计代码的思路就是:

递增,利用
回溯

计算第

个next值,只需要判断
的值是否和
相等
  1. 相等则

  2. 不相等:则利用
    往回溯,找到相等的元素或者当
    时直接令

注:

代表在上一个位置发生不匹配时的最长前缀中的第一个不匹配元素(文字描述有点困难,有机会做个视频解释下)

具体实现代码,主要要考虑的一点就是python中列表的第一个元素下标为0

def 

改进后的KMP

可以看到上面的算法在计算next时其实是不考虑

的值的,都是考虑从
的值,这其实是有可能导致重复计算的,因为假如
,而
所以应该将0移到该位置,但是上述算法在不考虑
取值的情况下,将1移到该位置,也就是
,所以改进算法就是在计算next时考虑当前值

在讲上面KMP算法时,我强调假如数组next中,第j个元素的值5,则代表当j位置发生不匹配时,要移动

,直到编码为5的元素对准发生不匹配的位置。(这个是整个算法的核心思想)

所以和

比较的永远时当前小标为
的值即
,如果

两值相等则该

的nextval就指向
的nextval值,如果

不等,则该

的nextval值就是它自己
的next的值。

注意:是nextval值指向nextval,因为当

相等时,代表
往后(包括j)共
项,和从首项(包括首项)开始往后的
项相等,这时就可以借用之前在计算前几项确定的nextval值,直接表现就是,如果

两值相等则该

的nextval就指向
的nextval值
#改进kmp

确定号next数组之后就是匹配了

def 

kmp算法next计算方法_【数据结构——串】KMP算法——next数组Python的实现方式相关推荐

  1. 数据结构 串 KMP 模式匹配详解 通俗易懂

    KMP 模式匹配详解通俗易懂 KMP 模式匹配是解决字符串匹配的问题 一.原始的字符串暴力匹配 要点:子串的第一个字符匹配成功主串的字符后就依次匹配子串后面的字符,直到子串匹配结束 代码: publi ...

  2. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  3. a*算法的时间复杂度_数据结构(1)——算法和时间复杂度

    Data Structure 1 算法和时间复杂度 01.什么是数据结构? 程序设计 = 数据结构 + 算法 数据结构是关系,是数据元素相互之间存在的一种或多种特定关系的集合. 数据结构和算法凌驾于任 ...

  4. 名词解释 算法的有限性_数据结构复习之【数据结构和算法概念】

    一.概念 数据结构就像是一个催化剂,如果没有原料是无用的,单是有了算法就能帮算法更快的实现任务: 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合,简单地说是数据之间的各种关系的集合. 程 ...

  5. 银行家算法是什么_什么是银行家算法?

    银行家算法是什么 Banker's algorithm is a deadlock avoidance algorithm. It is named so because this algorithm ...

  6. 蚁群算法java实现_简单蚁群算法 + JAVA实现蚁群算法

    一 引言 蚁群算法(ant colony optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术.它由Marco Dorigo于1992年在他的博士论文中引入,其灵 ...

  7. labuladong的算法小抄_学会了回溯算法,我终于会做数独了

    经常拿回溯算法来说事儿的,无非就是八皇后问题和数独问题了.那我们今天就通过实际且有趣的例子来讲一下如何用回溯算法来解决数独问题. 一.直观感受 说实话我小的时候也尝试过玩数独游戏,但从来都没有完成过一 ...

  8. python贝叶斯算法的论文_朴素贝叶斯算法从入门到Python实践

    1,前言 很久不发文章,整理些干货,希望相互学习吧.进入主题,本文主要时说的为朴素贝叶斯分类算法.与逻辑回归,决策树一样,是较为广泛使用的有监督分类算法,简单且易于理解(号称十大数据挖掘算法中最简单的 ...

  9. 数据结构-串-KMP算法详解(Next数组计算)(简单易懂)

    文章目录 KMP介绍 一.求Next数组 前后缀表 求最长公共前后缀 最长相等前后缀表转Next数组 二.使用Next数组来匹配字符串 总结 本文章就专讲kmp,暴力匹配就不讲了(我相信能搜索kmp的 ...

  10. 数据结构排序算法实验报告_数据结构与算法-堆排序

    堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn).( ...

最新文章

  1. 更换XP SN的vbs
  2. 什么是正确的JSON内容类型?
  3. HighNewTech之QAB:重新温读张首晟教授2018年8月演讲PPT《量子计算, 人工智能与区块链》
  4. 软件开发重要性_在软件开发中考虑时间的重要性
  5. ARM中ROM,RAM,FLASH区别
  6. mysql where非常规用法_MySQL where 条件的这个坑你碰到过没
  7. asp 文件上传 代码
  8. 如何使打印出手写字体
  9. DHTMLX-Grid
  10. Type-C PD充电简介
  11. 操作系统、体系结构和传奇船长的泰坦级超级旗舰
  12. 谁为「滑板底盘」买单
  13. MySQL中级优化教程(一)——SQL常用优化工具及explain语句的使用
  14. 牛津英语字典pdf下载_除了long time no see,你知道还有这些中式英语也进入了牛津字典吗...
  15. The container name XXX is already in use by container
  16. 2021 5G AIoT年度创新成果!发布!
  17. java毕业生设计校园易购二手交易平台计算机源码+系统+mysql+调试部署+lw
  18. 认识物联网,你可以从这个角度入手
  19. Raspberry Pi的Mjpg-streamer配置
  20. 如何使用mysql binlog 恢复数据

热门文章

  1. Linux内核线程(一)
  2. SylixOS armv8 任务切换
  3. php管理系统模板,自定义模块后台模板
  4. 【图论】Bellman_Ford算法求有步数限制的最短路(图文详解)
  5. java dao模式的优缺点_Java入门:浅谈DAO模式
  6. python version 3_VIM设置python3支持和检测python version
  7. endnotex9下载安装_endnote x9怎么和word关联?Word中用EndNote X9教程
  8. 可道云 docker 群晖_【curl】校园网群晖DS120j自动认证
  9. 电脑芯片和服务器芯片,王思聪的服务器和我们的电脑有什么区别?
  10. 125w短波通信距离_短波通信在消防应急救援通信中的应用探讨