无回溯的模式匹配

KMP前缀和BM后缀算法比较

KMP

    def f(t):#find every letter's pattern r in t
        assert t != ''
        len_t = len(t)
        r = [-1] * len_t
        r[0] = -1#i之前的最长相等前后缀
        j = -1
        i = 0
        global matchtimes
        matchtimes = 0
        while (i < len_t - 1):#计算next[i+1]
            matchtimes += 1
            while j >= 0 and t[i] != t[j]:
                matchtimes += 1
                j = r[j]
            j += 1
            i += 1
            if t[i] == t[j]:
                r[i] = r[j]
            r[i] = j       
        print(r)
        return r
    
    def knuthMatch(t, p):
        next = f(p)
        i, j = 0, 0
        global matchtimes
        #matchtimes = 0
        while(i<len(p) and j<len(t)):
            matchtimes += 1
            if -1==i or p[i]==t[j]:
                i += 1
                j += 1
            else:
                i = next[i]
        if i >= len(p):
            print(j-len(p))
        else:
            print('No parttern')

BM

    def boyer_moore(text, pattern):        
        global matchtimes
        matchtimes = 0
        skip = {}
        for i in range(len(pattern) - 1):
            matchtimes += 1
            skip[pattern[i]] = len(pattern) - i - 1
        print(skip)
        i = len(pattern) - 1
        while i < len(text):
            matchtimes += 1
            match = True
            for j in range(len(pattern)):
                matchtimes += 1
                if text[i - j] != pattern[len(pattern) - 1 - j]:
                    match = False
                    break
            if match:
                print(i - len(pattern) + 1)
                break
            if text[i] in skip:
                i += skip[text[i]]
            else:
                i += len(pattern)

比较

在while和for下添加matchtimes计数。BM更少。在待匹配字符串前后加长字符串,BM的表现都更好。
[-1, 0, 0, 0, 1, 1, 2, 1, 2]是KMP的next数组。{‘a’: 2, ‘b’: 1, ‘c’: 6} 是BM中各字符到尾部的距离。

knuthMatch(‘aabcbabcaabcaababc’,‘abcaababc’)
[-1, 0, 0, 0, 1, 1, 2, 1, 2]
9
matchtimes
34
boyer_moore(‘aabcbabcaabcaababc’,‘abcaababc’)
{‘a’: 2, ‘b’: 1, ‘c’: 6}
9
matchtimes
27

<算法与数据结构>KMP

在这里插入图片描述

BM应用滑动窗口

窗口宽度为匹配字符串的长度。操作时从窗口的后往前比较,如果不匹配窗口向后滑。滑动距离为当前字符到尾部的距离。

后话

使用哈希的rabin_karp_matching匹配算法。

更新

1,添加滑动窗口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值