Python中str.replace
函数的大符号是什么?
总是O(n)吗?
str = "this is string example"
print str.replace("is", "was")
thwas was string example
答案 0 :(得分:5)
Big O表示法是在最坏情况下计算的,而最糟糕情况下的Python源代码只是“找到substr的下一个位置,替换并进一步”。 一个替换执行O(n)操作(复制字符串)。 根据{{3}}的一次搜索,在最坏的情况下进行O(n * m)操作。 而且由于它可以达到n / m替换,总的来说应该是令人惊讶的O(n * n)。
答案 1 :(得分:4)
我编写了一个测试,我认为这是最糟糕的情况 - 一遍又一遍地重复一个字符串,我们用另一个字符串替换所说的字符串。由于t/n
会因n
增加而增加,因此最糟糕的情况似乎与O(n)
一样经验。但我真的无法与@NickolayOlshevsky的帖子争论。
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)])