它的时间和空间复杂度是多少?
我还没能在网络的其他地方找到权威的答案。
另外,不确定原因,但StackOverflow不允许我发布此问题,直到我在此框中写下更多文字。
答案 0 :(得分:4)
l += other_thing
大致相当于
l.extend(other_thing)
或
for thing in other_thing:
l.append(thing)
在引擎盖下,列表存储了一个指向其元素的指针数组,通常在末尾有额外的空间以容纳未来的元素。如果列表具有空间,则追加元素包括指针副本和引用计数更新;如果列表超出了空间,则首先将数组复制到乘法较大的数组中。
+=
操作的平均时间和摊销时间复杂度为O(len(other_thing))
;最坏情况下的时间复杂度为O(len(l) + len(other_thing))
。各个元素的大小无关紧要。该操作可能需要O(len(l) + len(other_thing))
空间来调整大小,尽管它使用的大部分空间都是l
的一部分。
答案 1 :(得分:3)
python的源代码可以在github上免费获取,所以你可以随时查看它
static PyObject *
list_inplace_concat(PyListObject *self, PyObject *other)
{
PyObject *result;
result = listextend(self, other);
if (result == NULL)
return result;
Py_DECREF(result);
Py_INCREF(self);
return (PyObject *)self;
}
你可以看到它只是调用了listextend,你可以看到https://wiki.python.org/moin/TimeComplexity的复杂性