KMP算法求next数组
来源:互联网 发布:日本历史地震数据统计 编辑:程序博客网 时间:2024/05/22 01:26
前几天看了july的从头到尾彻底理解KMP,花了一晚上时间把博主关于求next数组的部分自己再理解了一遍,把next数组使用数学公式做了精确的定义,并在博主的基础上增加了两种求next数组的方法,一种根据数学定义的暴力解法,另一种是递归解法。
原文地址:https://www.zybuluo.com/wzhang1117/note/27431
KMP算法求next数组
算法
KMP
KMP算法是一种快速模式匹配算法,其中最关键的部分是根据模式串生成next数组。
next数组的含义
设模式串为
1.暴力求解
这种方法的主要思路是根据next数组的定义将k从j-1到0暴力尝试,判断是否存在对应的序列。
def ViolateGetNext(p):
plen = len(p)
n = [-1]*plen
for j in range(1,plen):
k = j - 1
while k > 0:
#如果存在长度为k的相同前缀和后缀
if p[:k] == p[j-k:j]:
break
k -= 1
#如果不存在这样的k,k此时为0
n[j] = k
return n
设模式串为
2.递归求解
暴力求解每次在计算
设模式串为
1.
2.如果
3.如果
4.
5.将
def ReGetNext(p,j):
if j == 1:#j指示字符串的长度
return [-1]
#计算p前1到j-1个字符的next数组
n = ReGetNext(p,j-1)
k = n[j-2]
while k != -1:
if p[j-2] == p[k]:
break
k = n[k]
#k+1为第j个字符next值
n.append(k+1)
return n
设模式串为
3.递归展开求解
这种方法和递归的思路类似,但是不如递归清晰。
def GetNext(p):
plen = len(p)
n = [-1]*plen
k = -1
j = 0
while j < plen -1:
if k == -1 or p[j] == p[k]:
j += 1
k += 1
n[j] = k
else:
k = n[k]
return n
三种算法比较
计算next数组的关键还是在于彻底理解其含义。通过next数组的数学定义可以很容易的得到一个暴力解法,这个方法思路最清晰,第二种递归则是利用了next数组前后的关系得到了一个效率更高的算法,第三种和第二种类似,减少了递归调用。以模式串
- KMP算法求next数组
- KMP算法 求next数组的原理
- KMP算法中怎么求next数组
- 使用KMP算法求next数组
- KMP算法求next数组的方法
- KMP算法求next数组和nextval数组
- KMP 算法 next数组
- KMP算法--next数组
- KMP算法+NEXT数组
- KMP算法next数组
- KMP算法求next数组和nextval…
- 帮你理解KMP算法以及怎么求next数组
- [学习笔记] KMP算法的Next数组怎么求
- KMP算法求next数组的一些理解
- 两道水kmp-求next数组
- KMP求next数组详解
- KMP算法的next数组
- KMP算法Next数组计算
- 关于SQL server的Update用法
- POJ 1185 炮兵阵地 (状态压缩DP)
- 指针函数与函数指针的区别
- 系统的移植小感
- Qt-时间
- KMP算法求next数组
- C++ STL相关容器详解
- Android UsageStatsService:要点解析
- Install Xilinx USB cable drivers for Ubuntu
- android-代码里使用shell命令(wifi调试)
- POJ2112 Optimal Milking 二分法+网络流
- Sql server 无法附加数据库的解决方法
- 而是如何用文化园王海燕文欢迎为何杀人后
- 【文件】文件读写基本API