子串搜索

时间:2011-04-03 16:46:27

标签: algorithm substring

我最近一直在尝试调查子串搜索的各种方法,并偶然发现了以下文章http://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_string_search_algorithm。我想知道是否有任何其他常见/有效的算法,任何人都可以建议/显示?

非常感谢

3 个答案:

答案 0 :(得分:1)

最明显的是Boyer-Moore或某些变种,如Boyer-Moore-Horspool。在某些情况下,也值得考虑Knuth-Morris-Pratt。

答案 1 :(得分:0)

如果文本很小,KMP算法在子字符串搜索中是有效的。 复杂度O(n)。 为了便于理解 http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/

答案 2 :(得分:0)

在我看来,目前最容易理解的是Robin Karp Algorithm

这是一个简单的python实现

def computeHash(p):
    return sum ([ value*10**index for (index,value) in enumerate(p[::-1]) ])

def getPosition(string,subString):
    kh=computeHash(subString)
    lk=len(subString)
    ans=[]
    for i in enumerate(string):
        if len(string[i[0]:i[0]+lk])<lk:
            break
        else:
            if computeHash(string[i[0]:i[0]+lk])==kh:
                ans.append((i[0],i[0]+lk))
    return ans

def main():

    s="hello world" #string
    ss="wor" #sub string

    print getPosition(map(ord,s),map(ord,ss))



if __name__=="__main__":
    main()