散列法在无回溯模式匹配中的应用
接前面
无回溯的模式匹配 有更快的方法:
>>> 'aabcbabcaabcaababc'.find('abcaababc')
9
如果只是找子字符串到这里就可以结束了。
散列法
书上是在高级字典里讲散列法的。函数的选择,碰撞的处理是关键。
对比前后缀
他们都像是拿着一把尺子在比对。计算机应该发挥算数的优势。我们把匹配字符加起来求和,再看目标字符那一块加了和一样不就行了吗?
def hematch(s,t):
def he(st):
sum = 0
for char in st:
sum += ord(char)
return sum
i = len(t)
match = he(t) - he(s[:i])
while match:
i += 1
match = match - s[i-len(t)] + s[i]
print(i-len(t))
调用hematch(‘aabcbabcaabcaababc’,‘abcaababc’)输出的怎么是0
散列函数的选择
我选择和是举个例子好讲后面的碰撞的处理。散列函数有数字分析法、折叠法、中平方法、基数转换法、除法。
碰撞的处理
碰撞冲突的时候再比一下就可以了。它也有冲突的,