Rabin-Karp算法学习

Rabin-Karp算法

# coding: utf-8


class RabinKarp(object):
    def __init__(self, pat, txt):
        self.pat_hash = -1
        self.M = len(pat)
        self.Q = 997
        self.R = 10
        self.txt = txt
        self.pat = pat

        # RM = R^(M-1)%Q
        self.RM = 1
        for i in range(self.M-1):
            self.RM = (self.R * self.RM) % self.Q

        print 'RM: %s' % self.RM

        self.pat_hash = self.hash(pat, self.M)
        print 'pat hash: %s' % self.pat_hash

    def hash(self, key, m):
        h = 0
        for x in key[:m]:
            h = (self.R*h + int(x)) % self.Q

        return h

    def check(self, i):
        if self.txt[i:(i+self.M)] != self.pat:
            return False

        return True

    def search(self):
        N = len(self.txt)
        txt_hash = self.hash(self.txt, self.M)
        print 'txt hash: %s' % txt_hash

        if N < self.M:
            return -1

        if txt_hash == self.pat_hash and self.check(0):
            return 0

        for i in range(self.M, N):
            txt_hash = (txt_hash + self.Q - self.RM*int(self.txt[i-self.M])) % self.Q
            txt_hash = (txt_hash*self.R + int(self.txt[i])) % self.Q

            print txt_hash

            if txt_hash == self.pat_hash and self.check(i-self.M+1):
                return i - self.M + 1

        return -1


if __name__ == '__main__':
    rk = RabinKarp('26535', '3141592653589793')
    print rk.search()

运行结果:

RM: 30
pat hash: 613
txt hash: 508
201
715
971
442
929
613
6

小结

预处理字符串的时间为O(m),平均时间复杂度为线性级别O(7n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值