2016-02-23 7 views

Antwort

4

Big O-Notation ist im Worst-Case-Szenario berechnet, und Python Quellen für den ungünstigsten Fall kann nur 'nächste Position von substr, ersetzen und gehen weiter finden'. Eine Ersetzung führt O (n) -Operationen durch (Kopieren der Zeichenfolge). Eine Suche, nach http://effbot.org/zone/stringlib.htm, im Worst-Case-Szenario funktioniert O (n * m). Und da es bis zu n/m Ersatz sein kann, sollte insgesamt O (n * n) überraschend sein.

2

Ich habe einen Test für das, was ich glaube, ist der Worst-Case-Szenario - eine Zeichenfolge wiederholt und wiederholt, und wir ersetzen diese Zeichenfolge durch eine andere Zeichenfolge. Da sich t/n als n erhöht, scheint Worst-Case-Szenario empirisch wie es O(n) sein kann. Aber ich kann wirklich nicht mit @NickolayOlschevsky's Beitrag argumentieren.

import time 
from matplotlib import pyplot as plt 

x=[10] 
while x[-1]<10**8: 
    x.append(int(x[len(x)-1]*1.5)) 

y = [0]*len(x) 

nst = 'abcd' 
sst = 'abcd' 

for ix,i in enumerate(x): 
    s = ''.join([nst]*i) 
    t = time.time() 
    s = s.replace(sst,'efgh') 
    y[ix] = time.time()-t 

x = [a*len(nst) for a in x] 

%matplotlib inline 
fig, (ax1,ax2) = plt.subplots(2, sharex=True) 
fig.set_size_inches(8, 6) 
ax1.set_xscale('log') 
ax1.set_yscale('log') 
ax1.set_xlabel('n') 
ax1.set_ylabel('t') 
ax1.plot(x,y) 
ax2.set_xscale('log') 
ax2.set_yscale('log') 
ax2.set_xlabel('n') 
ax2.set_ylabel('t/n') 
ax2.plot(x,[a/b for a,b in zip(x,y)]) 

n vs t

+0

Hm. In einem solchen Szenario Suche nach dem nächsten Das Auftreten des Strings wird (fast) konstant sein - da es direkt nach dem vorherigen auftritt. Und da die gesuchte Zeichenfolge klein ist, wäre es O (n). Schlimmeres Szenario sollte mit langer Teilzeichenkette + Hauptstring mit Teilzeichenketten sein. fast "zusammenpassen. Ie l123121212121212123 bei der Suche nach 123. –

+0

Ah, logisch. Oder noch schlimmer potenziell, Suche nach' 12121212123' in einer Zeichenfolge wie '12121212121212121212123'. Ich habe es ausprobiert, und dies zu tun hat leider wenig bis keine Wirkung auf die Handlung. –

Verwandte Themen