如果我写了这样的代码:
item_list = item_list[::-1]
这样做的空间复杂度是否为O(1)?我认为item_list[::-1]会创建一个新列表,因此可能是O(n)。在Python中,使用item_list.reverse()才是以O(1)空间反转的正确方法吗?
如果我写了这样的代码:
item_list = item_list[::-1]
这样做的空间复杂度是否为O(1)?我认为item_list[::-1]会创建一个新列表,因此可能是O(n)。在Python中,使用item_list.reverse()才是以O(1)空间反转的正确方法吗?
some_list[::-1]
会创建一个新列表,该列表将有n个“插槽”,因此需要O(n)内存。.reverse()
方法的内存使用是O(1)。实际上,如果我们查看reverse
方法的源代码 [GitHub],我们可以看到:
/*[clinic input]
list.reverse
Reverse *IN PLACE*.
[clinic start generated code]*/
static PyObject *
list_reverse_impl(PyListObject *self)
/*[clinic end generated code: output=482544fc451abea9 input=eefd4c3ae1bc9887]*/
{
if (Py_SIZE(self) > 1)
<b>reverse_slice(</b>self->ob_item, self->ob_item + Py_SIZE(self)<b>)</b>;
Py_RETURN_NONE;
}
因此,它调用一个名为reverse_slice
的函数,这个函数的实现在[Github]中:
/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
static void
reverse_slice(PyObject **lo, PyObject **hi)
{
assert(lo && hi);
--hi;
while (lo < hi) {
PyObject *t = *lo;
*lo = *hi;
*hi = t;
++lo;
--hi;
}
}
因此,它使用两个指针,一个按升序迭代,一个按降序迭代,并且这些指针将值相互“交换”,直到它们相遇在中间。
reversed()
的时间复杂度将会是O(1)。 - Olvin Roghtlist(..)
,那么你会复制一份,因此需要*O(n)*的空间。 - Willem Van Onsem