python结构索引时间复杂性

2024-09-20 03:51:47 发布

您现在位置:Python中文网/ 问答频道 /正文

对于在字符串中查找子字符串的位置,一个简单的算法将花费O(n^2)时间。然而,使用一些有效的算法(例如KMP algorithm),这可以在O(n)时间内实现:

s = 'saurabh'
w = 'au'

def get_table():
    i = 0; j = 2 
    t = []
    t.append(-1); t.append(0)
    while i < len(w):
        if w[i] == w[j-1]:
            t.append(j+1)
            j += 1
        else:
            t.append(0)
            j = 0 
        i += 1
    return t

def get_word():
    t = get_table()
    i = j = 0 
    while i+j < len(s):
        if w[j] == s[i+j]:
            if j == len(w) - 1:
                return i
            j += 1
        else:
            if t[j] > -1: 
                i = i + j - t[j]
                j = t[j]
            else:
                i += 1
    return -1

if __name__ == '__main__':
    print get_word()

但是,如果我们这样做:'saurabh'.index('ra'),它是在内部使用某种有效的算法来计算O(n),还是使用简单的复杂算法O(n^2)?在


Tags: 字符串算法getlenreturnifdef时间
3条回答

有时候你只要试一下就能得到一个快速的答案

>>> timeit.timeit('x.index("ra")', setup='x="a"*100+"ra"')
0.4658635418727499
>>> timeit.timeit('x.index("ra")', setup='x="a"*200+"ra"')
0.7199222409243475
>>> timeit.timeit('x.index("ra")', setup='x="a"*300+"ra"')
0.9555441829046458
>>> timeit.timeit('x.index("ra")', setup='x="a"*400+"ra"')
1.1994099491303132
>>> timeit.timeit('x.index("ra")', setup='x="a"*500+"ra"')
1.4850994427915793

在那篇文章[1]中,作者详细介绍了算法并对其进行了解释。来自文章:

The function “fastsearch” is called. It is a mix between 
Boyer-Moore and Horspool algorithms plus couple of neat tricks.

从Boyer-Moore-horsool算法的wiki页面来看:

^{pr2}$

希望有帮助!在

[1]http://www.laurentluce.com/posts/python-string-objects-implementation

[2]https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm

相关问题 更多 >