2016-04-26 6 views
2

Pour trouver la position d'une sous-chaîne, à l'intérieur d'une chaîne, un algorithme naïf prendra O(n^2) fois. Cependant, en utilisant des algorithmes efficaces (par exemple KMP algorithm), cela peut être réalisé en O (n):python str.index temps complexité

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() 

Cependant, si nous le faisons: 'saurabh'.index('ra'), il n'utilise en interne un algorithme efficace pour calculer cela en O(n) ou il utilise un algorithme de complexité naïf O(n^2)?

+0

Vous pouvez le profil et voir si le temps croît de façon exponentielle ou linéaire; –

Répondre

2

Dans cet article, l'auteur [1] passe par le Algoritm et l'explique. Tirée de l'article:

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

Et à partir de la page wiki de l'algorithme Boyer-Moore-Horspool [2]:

The algorithm trades space for time in order to obtain an 
average-case complexity of O(N) on random text, although 
it has O(MN) in the worst case, where the length of the 
pattern is M and the length of the search string is N. 

Hope qui aide!

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

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

+0

Mais le pire des cas de KMP est toujours linéaire. Cela signifie-t-il que nous devrions implémenter notre code en utilisant l'algorithme KMP au lieu de l'index interne de python() pour les processus critiques? –

+0

Je pense que ce fil a une bonne réponse à ce sujet: http://programmers.stackexchange.com/questions/183725/which-string-search-algorithm-is-actually-the-fastest – alpert

1

Parfois, vous pouvez obtenir une réponse rapide juste en essayant

>>> 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