两种方法实现KMP算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
两种方法实现KMP算法
方法一:暴力匹配法
暴力匹配法是KMP算法的一种简单实现方式,其思路是遍历主串和模式串,逐个字符进行比较。如果匹配失败,则将模式串右移一位,继续与主串进行匹配。
首先,我们需要理解KMP算法中的next数组的含义。next数组用于记录模式串中出现不匹配时,下一步模式串应该移动到的位置。具体求解next数组的方法有多种,其中最简单的方法是通过递归实现。
以下是一个使用暴力匹配法实现KMP算法的示例代码:
```python
def kmp(text, pattern):
n = len(text)
m = len(pattern)
next = getNext(pattern)
i=0
j=0
while i < n and j < m:
if text[i] == pattern[j]:
i+=1
j+=1
else:
if j == 0:
i+=1
else:
j = next[j-1] + 1
if j == m:
return i - m
else:
return -1
def getNext(pattern):
n = len(pattern)
next = [-1] * n
for i in range(1, n):
j = next[i-1]
while pattern[i] != pattern[j+1] and j >= 0: j = next[j]
if pattern[i] == pattern[j+1]:
next[i] = j + 1
else:
next[i] = -1
return next
```
在上述代码中,kmp函数接收两个参数text和pattern,分别表示主串和模式串。函数中先获取模式串的next数组,然后利用while循环进行暴力匹配。如果匹配成功,返回主串中模式串的起始索引;否则,返回-1
通过该方法实现KMP算法的时间复杂度为O(n*m),其中n为主串的长度,m为模式串的长度。
方法二:优化方法(KMP算法)
KMP算法通过空间换时间的方式优化了匹配过程,使得时间复杂度为O(n+m),其中n为主串的长度,m为模式串的长度。
以下是KMP算法的实现代码:
```python
def kmp(text, pattern):
n = len(text)
m = len(pattern)
next = getNext(pattern)
i=0
j=0
while i < n and j < m:
if text[i] == pattern[j]: i+=1
j+=1
else:
if j == 0:
i+=1
else:
j = next[j-1]
if j == m:
return i - m
else:
return -1
def getNext(pattern):
n = len(pattern)
next = [-1] * n
i=0
j=-1
while i < n - 1:
if j == -1 or pattern[i] == pattern[j]:
i+=1
j+=1
next[i] = j
else:
j = next[j]
return next
```
在上述代码中,kmp函数和getNext函数的实现与前面的方法一相同。不同之处在于,在KMP算法中,模式串移动的位置可以根据next数组直
接获取,无需进行额外的判断。
通过这种优化,KMP算法的时间复杂度得以优化为O(n+m)。
总结:
KMP算法通过next数组记录了模式串的失配情况,从而避免了重复
比较已经匹配过的字符串。通过对next数组的计算和优化,使得匹配过
程变得更加高效。以上给出的两种方法分别是通过暴力匹配和KMP算法两
种方式实现的,其中KMP算法的优化方法相对更高效。