python - Python中字符串连接的时间复杂度

标签 python string time-complexity

<分区>

我正在分析代码的复杂性。 根据我在网上找到的内容,由于字符串在 python 中是不可变的,因此字符串和字符的串联应该是 O(len(string) + 1)。

现在,这是我的一段代码(简化):

word = ""
for i in range(m):
    word = char_value + word
return word

总的时间复杂度应该是:

(0+1) + (1+1) +...+ m = m(m+1)/2 = O(m^2)

这是正确的吗?

最佳答案

是的,在您的情况下,*1 字符串连接需要复制所有字符,这是一个 O(N+M) 操作(其中 N 和 M 是输入字符串的大小)。因此,同一个词的 M 次附加将趋向于 O(M^2) 时间。

您可以使用 str.join() 来避免这种二次行为:

word = ''.join(list_of_words)

只需要 O(N)(其中 N 是输出的总长度)。或者,如果您要重复单个字符,您可以使用:

word = m * char

你在前面加上字符,但先建立一个列表,然后反转它(或使用 collections.deque() 对象来获得 O(1) 前面的行为)仍然是 O(n) 复杂度,很容易击败你的 O(N^ 2)在这里选择。


*1 从 Python 2.4 开始,CPython 实现在使用 strA += strB 时避免创建新的字符串对象。或 strA = strA + strB ,但这种优化既脆弱又不可移植。由于您使用 strA = strB + strA (前置)优化不适用。

关于python - Python中字符串连接的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37133547/

相关文章:

python - Str 对象不可调用; Python 字典循环错误

java - 具有 O(1) 时间和空间复杂度的股票统计计算

c - 以下代码的复杂度是多少?

python - 在 seaborn 中使用 Unicode 文本

c++ - 如何设置类的 char* 成员?使用 strcat 或其他东西?

Python - 无法导入本地库

c - 基于字符串比较的单词翻译程序不能正常工作

c - 需要帮助找出该算法的复杂性

python - Optparse 回调不使用参数

python - 如何在 Linux centos 中将 celeryd 作为 django 的守护进程