BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #1381同步于 2014/7/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

[虚心求教]自己实现的kmp算法不知对不对

xiao0xiao
2014/7/1镜像同步2 回复
重新拿起数据结构书,看不懂上面的kmp,自己按思路写了个,大致思路是比较模式串的前缀和后缀,计算一个位置不匹配时模式串相对主串的位移,不知道对不对,如果对,和课本上的区别大么? def getmoveval(pattern): l=len(pattern) position=[0]*l moveval=[0]*l j=0 for i in range(0,l): if i == 0: position[i]=0 moveval[i]=1#moveval是当某位置不匹配时,模式串相对主串右移的距离 else: if pattern[i]==pattern[j]: position[i]=j+1 j=j+1 moveval[i]=i-position[i-1] else: position[i]=0 moveval[i]=i-position[i-1] j=0 return moveval def kmp(main,pattern): l = len(main) moveval = getmoveval(pattern) result = [] i = 0 #模式串相对主串位置 j = 0 #模式串游标 p = 0#主串游标 while i<l: if main[i+p]==pattern[j]:#一个位置匹配 if j == len(pattern)-1:#若已是最后一个字符 result.append(i) j = 0 i=i+1 p = 0 else: p=p+1#游标后移 j=j+1 else:#不匹配 i = i + moveval[j] #模式串右移 p = 0 #游标归零 j = 0 return result main ="BBC ABCDAB ABCDABCDABDE" pattern ="ABDE" print getmoveval(pattern) print kmp(main,pattern) 求指教
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
SinceBelieve机器人#1 · 2014/7/2
http://sincebelieve.com/p/kmp.html 换成 python 大概是这样的: import sys def kmp_preprocess(word): i = 0 j = -1 fail = [-1] * ( len(word) + 1 ) while i < len(word): while j >= 0 and word[i] != word[j]: j = fail[j] i += 1 j += 1 fail[i] = j return fail def kmp_search(text, word, fail): i = 0 j = 0 while i < len(text): while j >= 0 and text[i] != word[j]: j = fail[j] i += 1 j += 1 if j == len(word): print('Found at %d' % (i - j)) j = fail[j] if __name__ == '__main__': fail = kmp_preprocess(sys.argv[2]) kmp_search(sys.argv[1], sys.argv[2], fail) 【 在 xiao0xiao 的大作中提到: 】 : 重新拿起数据结构书,看不懂上面的kmp,自己按思路写了个,大致思路是比较模式串的前缀和后缀,计算一个位置不匹配时模式串相对主串的位移,不知道对不对,如果对,和课本上的区别大么? : def getmoveval(pattern): : l=len(pattern) : ...................
lzrak47机器人#2 · 2014/7/3
没人知道对不对,写几个单测验验。