Python中str.replace函数的大O表示法是什么?

Python中str.replace函数的大O表示法是什么?,python,Python,Python中函数的大符号是什么 总是O(n)吗 大O表示法是在最坏的情况下计算出来的,最坏情况下的Python源代码只是“找到substr的下一个位置,替换,然后再进一步”。 一个替换执行O(n)操作(复制字符串)。 根据,在最坏的情况下,一次搜索不会执行O(n*m)操作。 由于它最多可以进行n/m次替换,所以总的来说应该是O(n*n)。我编写了一个测试,我认为这是最坏的情况——一个字符串反复出现,我们用另一个字符串替换这个字符串。因为t/n随着n的增加而趋于平稳,所以从经验上看,最坏的情况可

Python中函数的大符号是什么

总是O(n)吗


大O表示法是在最坏的情况下计算出来的,最坏情况下的Python源代码只是“找到substr的下一个位置,替换,然后再进一步”。 一个替换执行O(n)操作(复制字符串)。 根据,在最坏的情况下,一次搜索不会执行O(n*m)操作。
由于它最多可以进行n/m次替换,所以总的来说应该是O(n*n)。

我编写了一个测试,我认为这是最坏的情况——一个字符串反复出现,我们用另一个字符串替换这个字符串。因为
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)])
导入时间
从matplotlib导入pyplot作为plt
x=[10]

而x[-1]是否可以低于
O(n)
?我不这么认为@我怀疑Arman,因为它必须遍历字符串。问题是它能更高吗?它怎么能更高呢?我本来想帮你的,我搜索了字符串对象的源代码。结果是一个5000行的C代码。所以我必须道歉:(也许你会想要一个.Hm。在这种情况下,搜索下一次出现的字符串将是(几乎)恒定的-因为它正好在上一次出现之后。而由于被搜索的字符串很小,那么它将是O(n)。更糟糕的情况应该是长子字符串+主字符串,子字符串“几乎”匹配。例如,在搜索123时使用L123312123。啊,逻辑。或者更糟糕的情况是,在类似
121212123
的字符串中搜索
121212123
。我测试了它,不幸的是这样做几乎没有效果影响绘图。如果有n/m个替换,你真的认为每个替换都需要nm时间吗?我认为这只是m时间。我认为总体时间复杂度是O(nm),而不仅仅是O(nn)。这种分析是错误的。首先,大O只是数学函数的一种表示法。当应用于算法时,我们可以表示最坏、平均或最佳情况。其次,最坏情况搜索可以是
O(k*m)
,其中
k
是查找下一个匹配项所用的字母数。因此,查找所有匹配项就是
O(n*m)
最坏的情况。平均值是
O(n)
。如果你使用博耶摩尔,搜索结果是
O(n/m)
(遗憾的是,unicode和博耶摩尔不是朋友。)
thwas was string example
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)])