【问题标题】:Computing the second (mis-match) table in the Boyer-Moore String Search Algorithm计算 Boyer-Moore 字符串搜索算法中的第二个(不匹配)表
【发布时间】:2009-05-08 17:36:32
【问题描述】:

要使 Boyer-Moore 算法成为最坏情况线性,失配表的计算必须是 O(m)。但是,一个简单的实现会遍历所有后缀 O(m) 以及该后缀中的所有位置都可以检查是否相等......这是 O(m3)!

下面是table building algorithm 的简单实现。所以这个问题就变成了:我怎样才能把这个算法的运行时间提高到 O(m)?

def find(s, sub, no):
    n = len(s)
    m = len(sub)

    for i in range(n, 0, -1):
        if s[max(i-m, 0): i] == sub[max(0, m-i):] and \
            (i-m < 1 or s[i-m-1] != no):
            return n-i

    return n

def table(s):
    m = len(s)
    b = [0]*m

    for i in range(m):
        b[i] = find(s, s[m-i:], s[m-i-1])

    return b

print(table('anpanman'))

为了让思想休息,这不是功课。当有人发布改进想法时,我会添加修订。

【问题讨论】:

  • 一方面,使用 xrange(n,0,-1) 和 xrange(m) 代替 range()...它可以节省一点内存
  • 其实上面的代码是Python 3。见docs.python.org/dev/py3k/library/…
  • 跟随 LiteratePrograms 的实现怎么样?似乎它的预处理较少,但我不是 Boyer-Moore 专家。 en.literateprograms.org/…
  • 忘记括号了:is.gd/xSEz
  • 该链接中的代码不是最坏情况的 O(n),它只构建第一个表(我想构建第二个)。

标签: python algorithm discrete-mathematics string-search


【解决方案1】:

this page 上“好后缀启发式的预处理”下的代码在 O(n) 时间内构建好后缀表。它还解释了代码的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2012-07-12
    • 1970-01-01
    • 2018-12-16
    • 2016-01-04
    相关资源
    最近更新 更多