我看过这个页面https://wiki.python.org/moin/TimeComplexity,但我没有看到列表中的反向函数。列表反转的时间复杂度是多少?
我的时间实验表明,对于较大的尺寸,它是O(n)。任何人都可以证实吗?
timeit反转大小列表的时间
10 .1027
100 .2347
1000 .6704
10000 6.204
20000 12.9
答案 0 :(得分:8)
是的,你是对的,它是O(n),其中n - 列表的长度。 点击此处了解更多信息:https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
答案 1 :(得分:1)
如果您研究reverse
方法的实现,那么它看起来如下:
static PyObject *
listreverse(PyListObject *self)
{
if (Py_SIZE(self) > 1)
reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Py_RETURN_NONE;
}
因此,该操作实际上委托给了reverse_slice
。然后,让我们看一下:
static void
reverse_slice(PyObject **lo, PyObject **hi)
{
assert(lo && hi);
--hi;
while (lo < hi) {
PyObject *t = *lo;
*lo = *hi;
*hi = t;
++lo;
--hi;
}
}
因此,这里有2个索引最初设置在列表的开头和结尾。然后,在while
循环的每次迭代中,交换位于相应索引处的元素:
PyObject *t = *lo;
*lo = *hi;
*hi = t;
然后左边的索引递增,右边的索引递减:
++lo;
--hi;
只要右索引超过左索引,循环就会继续进行。因此,如果列表中有n
个元素,那么将执行n/2
个迭代,因此时间复杂度为O(n)
答案 2 :(得分:0)
如果您很容易看到该算法,则反向的时间复杂度为O(n)
( 线性时间复杂度 ),其中 n 是列表中元素的编号。
答案 3 :(得分:0)
通过内置库(如reverse())或使用切片a = a [::-]来反转列表,两者都将花费相同的时间,即O(n)