C++ 数据结构之kmp算法中的求Next()函数的算法

C++ 数据结构之kmp算法中的求Next()函数的算法

什么是KMP算法和Next()函数

KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,能够解决的问题是,在一个文本串S中查找一个模式串P是否出现并且返回第一次出现的位置。而Next()函数则是在KMP算法中使用的一个关键的子函数,用于计算模式串P中每个前缀的最长相同真前缀和后缀的长度,从而实现快速的模式串匹配。

如何求Next()函数

设模式串P的长度为m,对于i=1,2,...,m,我们需要求出P[0:i-1]的最长相同真前缀和后缀的长度,即Next(i)的值。具体的算法如下:

  1. 初始化Next(0)为-1,Next(1)为0。
  2. 对于i=2,3,...,m-1,计算Next(i)。
  3. 如果P[Next(i-1)]等于P[i-1],则Next(i)等于Next(i-1)+1。
  4. 否则,令j=Next(i-1),不断向前递推Next(j),例如,如果P[Next(j)]等于P[i-1],则Next(i)等于Next(j)+1,否则继续递推。当递推到j=-1时,Next(i)等于0。

以上就是Next()函数的求解过程,该算法的时间复杂度为O(m),其中m为模式串的长度。

两条示例说明

示例1

假设模式串P为“abababca”,则P的长度为8,对于i=2,3,...,7,我们依次计算Next(i)的值。

  • i=2,P[0:1]="ab",Next(1)=0。
  • i=3,P[0:2]="aba",Next(2)=0。
  • i=4,P[0:3]="abab",Next(3)=1。
  • i=5,P[0:4]="ababa",Next(4)=2。
  • i=6,P[0:5]="ababab",Next(5)=3。
  • i=7,P[0:6]="abababc",Next(6)=0。

因此,模式串P的Next()函数的值为Next={-1,0,0,1,2,3,0,1}。

示例2

假设模式串P为“abcabcabc”,则P的长度为9,对于i=2,3,...,8,我们依次计算Next(i)的值。

  • i=2,P[0:1]="ab",Next(1)=0。
  • i=3,P[0:2]="abc",Next(2)=0。
  • i=4,P[0:3]="abca",Next(3)=1。
  • i=5,P[0:4]="abcab",Next(4)=2。
  • i=6,P[0:5]="abcabc",Next(5)=3。
  • i=7,P[0:6]="abcabca",Next(6)=4。
  • i=8,P[0:7]="abcabcab",Next(7)=5。

因此,模式串P的Next()函数的值为Next={-1,0,0,1,2,3,4,5}。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 数据结构之kmp算法中的求Next()函数的算法 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C++抽象数据类型介绍

    C++抽象数据类型介绍 什么是抽象数据类型? 抽象数据类型(Abstract Data Type,ADT),是数据类型的一个数学模型。它实现了数据类型的抽象过程,将数据与操作分离,使得操作具有独立性,而数据只作为函数参数和返回值存在。 举个例子,ADT可以定义一个栈(Stack),栈的实现需要以下操作: 初始化栈 压入数据 弹出数据 获取栈顶数据 检查栈是否…

    数据结构 2023年5月17日
    00
  • C语言数据结构之堆排序的优化算法

    C语言数据结构之堆排序的优化算法攻略 堆排序简介 堆排序(HeapSort)是一种树形选择排序,在排序过程中始终保持一个最大堆,每次将堆顶元素与最后一个元素交换位置,并进行一次最大堆调整操作,直到整个序列有序为止。 堆排序的时间复杂度为O(nlogn),具有不需额外存储空间的特点,因此广泛应用于内存受限的场景。 堆排序的优化算法 1. 建堆操作的优化 将序列…

    数据结构 2023年5月17日
    00
  • C++数据结构之堆详解

    C++数据结构之堆详解 什么是堆 堆是一种完全二叉树。 堆分为大根堆和小根堆,大根堆满足每个节点的值都大于等于它的子节点,小根堆满足每个节点的值都小于等于它的子节点。 堆的实现 常见的实现堆的方式有数组和链表两种。 数组 由于二叉堆是完全二叉树,所以可以用数组来实现: 对于一个节点i,它的左子节点的下标是2 * i + 1,右子节点的下标是2 * i + 2…

    数据结构 2023年5月17日
    00
  • GPS北斗卫星时间同步系统助力电力自动化网络系统

    GPS北斗卫星时间同步系统助力电力自动化网络系统 GPS北斗卫星时间同步系统助力电力自动化网络系统 京准电子官微——ahjzsz 前言 近几年来,随着电力自动化水平的提高,在电力中计算机监控系统、微机保护装置、微机故障录波装置以及各类数据管理机得到了广泛的应用,而这些自动装置的配合工作需要有一个精确统一的时间。当电力系统发生故障时,既可实现全站各系统在统一时…

    算法与数据结构 2023年5月8日
    00
  • C利用语言实现数据结构之队列

    C语言实现队列的完整攻略 什么是队列 队列是一种线性数据结构,它有两个端点:队头和队尾。新的元素插入到队尾,每次从队头取出一个元素。这就类似于人们排队买票,新的买票者排在队尾,每当售票员完成一笔交易,队列头的买票者出队。 基本操作 队列主要有以下3个基本操作: 入队(enqueue):将一个元素添加到队列的尾部 出队(dequeue):从队列的头部移除一个元…

    数据结构 2023年5月17日
    00
  • Java数据结构常见几大排序梳理

    Java数据结构常见几大排序梳理 在Java中,数据排序是非常常见的操作。下面我们详细讲解一下Java数据结构常见几大排序的梳理。 常见几大排序 Java数据结构中常见几种排序算法包括: 冒泡排序(Bubble Sort) 快速排序(Quick Sort) 插入排序(Insertion Sort) 选择排序(Selection Sort) 希尔排序(Shel…

    数据结构 2023年5月17日
    00
  • 详解数据结构C语言实现之循环队列

    详解数据结构C语言实现之循环队列 什么是循环队列 循环队列是一种数据结构,它可以存储一组固定大小的元素,并且支持在队列尾部插入元素和在队列头部删除元素,当队列尾部没有空间时可以将队列头部空余的位置用来插入元素,实现循环的效果。循环队列的主要优点在于插入和删除元素的时间复杂度均为O(1),而不是O(n)。 如何实现循环队列 循环队列可以使用数组来实现,需要定义…

    数据结构 2023年5月17日
    00
  • C++数据结构的队列详解

    C++数据结构的队列详解 队列是什么? 队列是一种先进先出(First In First Out, FIFO)的数据结构,类似于现实生活中的排队等待服务。 队列中的数据按照先进先出的原则被处理。新的元素只能被插入在队列的末尾,而旧的元素只能从队列的开头被删除。因此,队列的末尾称为队尾,队列的开头被称为队头。 队列的实现方式 数组实现方式 队列可以使用数组实现…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部