Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中字符串连接的时间复杂性_Python_String_Time Complexity - Fatal编程技术网

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

Python中字符串连接的时间复杂性,python,string,time-complexity,Python,String,Time Complexity,我在分析代码的复杂性。 从我在网上发现的情况来看,因为字符串在python中是不可变的,所以字符串和字符的串联应该是O(len(string)+1) 下面是我的一段代码(简化): 总时间复杂度应为: (0+1)+(1+1)+…+m=m(m+1)/2=O(m^2) 是否正确?是的,在您的情况下*1字符串串联需要复制所有字符,这是一个O(N+M)操作(其中N和M是输入字符串的大小)。同一单词的M个后缀将趋向于O(M^2)时间 通过使用str.join(),可以避免这种二次行为: 只取O(N)(其中N

我在分析代码的复杂性。 从我在网上发现的情况来看,因为字符串在python中是不可变的,所以字符串和字符的串联应该是O(len(string)+1)

下面是我的一段代码(简化):

总时间复杂度应为:

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

是否正确?

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

通过使用
str.join()
,可以避免这种二次行为:

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

word = m * char
您正在预编字符,但首先构建一个列表,然后将其反转(或使用
collections.deque()
object获得O(1)预编行为)仍然是O(n)复杂度,很容易击败您在此处的O(n^2)选择



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

您计算的是什么:时钟时间、操作次数?我怀疑
m
字符串的串联在
m
中是二次的,例如,分配一个由n个字符组成的字符串需要n个字符。为什么分配一个长度
2m
的字符串需要两倍于分配长度
m
的字符串的时间?当然,这取决于Python中字符串的实例化方式,我正在考虑分配一个由n个字符组成的数组,尽管我实际上不知道它是如何分配的done@DisplayName:因为每次都需要将字符复制到新的字符串对象中。因此,将10个字符连接到另10个字符需要20个步骤才能生成新字符串。在一个循环中这样做,你会得到二次行为。不,我不能做这两件事。正如我所说,我上面的代码是简化的,我发现的字符是不同的,把它们放在一个列表中并不会最终优化代码。@Generalbrus:把它们放在一个列表中会避免二次行为,所以这肯定会优化性能。从我访问字符的方式来看(它们在一个trie中),在加入之前,我必须反转我创建的列表,因此我认为在我的例子中,最好是在字符数组而不是字符串上操作。谢谢你的提示。@generalburs:使用
collections.deque
,然后将项目追加到前面。@generalburs:或者追加,然后反向,这仍然是O(n)。避免二次行为在这里绝对值得。
word = ''.join(list_of_words)
word = m * char