切片Python字符串的时间复杂度是多少?鉴于Python字符串是不可变的,我可以想象将它们切片为O(1)或者O(n)取决于切片的实现方式.
我需要编写一个迭代一个(可能很大)字符串的所有后缀的函数.我可以通过将后缀表示为整个字符串的元组加上一个开始读取字符的索引来避免切片,但这很难看.如果相反,我天真地写这样的函数:
def do_something_on_all_suffixes(big_string):
for i in range(len(big_string)):
suffix = big_string[i:]
some_constant_time_operation(suffix)
Run Code Online (Sandbox Code Playgroud)
... ...将其时间复杂度是O(n)或,其中是?O(n2)nlen(big_string)
为什么使用切片对列表进行浅层复制比使用list内置更快?
In [1]: x = range(10)
In [2]: timeit x_ = x[:]
10000000 loops, best of 3: 83.2 ns per loop
In [3]: timeit x_ = list(x)
10000000 loops, best of 3: 147 ns per loop
Run Code Online (Sandbox Code Playgroud)
通常当我看到这样奇怪的事情时,它们在python3中被修复 - 但这种差异仍然存在:
In [1]: x = list(range(10))
In [2]: timeit x_ = x[:]
10000000 loops, best of 3: 100 ns per loop
In [3]: timeit x_ = list(x)
10000000 loops, best of 3: 178 ns per loop
Run Code Online (Sandbox Code Playgroud) std::string::substr成员函数的复杂度是多少?它是由标准定义的还是由实现定义的?