@wzhang1117
2014-08-17T05:41:07.000000Z
字数 2024
阅读 7309
算法 KMP
KMP算法是一种快速模式匹配算法,其中最关键的部分是根据模式串生成next数组。
设模式串为
这种方法的主要思路是根据next数组的定义将k从j-1到0暴力尝试,判断是否存在对应的序列。
def ViolateGetNext(p):plen = len(p)n = [-1]*plenfor j in range(1,plen):k = j - 1while k > 0:#如果存在长度为k的相同前缀和后缀if p[:k] == p[j-k:j]:breakk -= 1#如果不存在这样的k,k此时为0n[j] = kreturn n
设模式串为
暴力求解每次在计算
设模式串为
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]:breakk = n[k]#k+1为第j个字符next值n.append(k+1)return n
设模式串为
这种方法和递归的思路类似,但是不如递归清晰。
def GetNext(p):plen = len(p)n = [-1]*plenk = -1j = 0while j < plen -1:if k == -1 or p[j] == p[k]:j += 1k += 1n[j] = kelse:k = n[k]return n
计算next数组的关键还是在于彻底理解其含义。通过next数组的数学定义可以很容易的得到一个暴力解法,这个方法思路最清晰,第二种递归则是利用了next数组前后的关系得到了一个效率更高的算法,第三种和第二种类似,减少了递归调用。以模式串