匹配——散列法

散列法在无回溯模式匹配中的应用

接前面

无回溯的模式匹配 有更快的方法:

 >>> '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

散列函数的选择

我选择和是举个例子好讲后面的碰撞的处理。散列函数有数字分析法、折叠法、中平方法、基数转换法、除法。

碰撞的处理

碰撞冲突的时候再比一下就可以了。它也有冲突的,只是我一下子找不到。一般而言,理想的负载因子应该大于1/2。而且它的代码里找到一样的散列值也要再比的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值