我正在分析我的代码复杂度。根据我在网上找到的信息,由于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)
这正确吗?
我正在分析我的代码复杂度。根据我在网上找到的信息,由于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
时避免创建新的字符串对象,但这种优化既脆弱又不可移植。由于您使用的是strB + strA
(前置),因此该优化不适用。
collections.deque
,然后将项目添加到前面。 - Martijn PietersM
表示字符数和追加次数。只有当单词长度等于追加次数时,复杂度才为O(M^3),但这里并非如此。将追加文本的长度保持不变,因为它是一个固定值(平均追加长度),只需考虑追加次数即可。 - Martijn Pieters
m
个字符串连接起来的复杂度是二次的。 - user55470252m
的字符串所需的时间是分配长度为m
的字符串所需时间的两倍? - user5547025