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

时间:2016-05-10 08:52:42

标签: 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 个答案:

答案 0 :(得分:19)

是的,在您的情况下 * 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 += strBstrA = strA + strB时创建新的字符串对象,但这种优化既脆弱又不可移植。由于您使用strA = strB + strA(前置),优化不适用。