Python列表反转的时间复杂度是多少?
我看过这个页面,但没有看到列表的Python列表反转的时间复杂度是多少?,python,list,time-complexity,Python,List,Time Complexity,我看过这个页面,但没有看到列表的reverse()函数。list的reverse()的时间复杂度是多少 我的时间实验表明,对于较大的尺寸,它是O(n)。有人能证实吗 时间是反转大小列表的时间 10 .1027 100 .2347 1000 .6704 10000 6.204 20000 12.9 是的,你是对的,它是O(n),其中n是列表的长度。 查看此处以了解更多信息:如果您查看reverse方法的实现,则其如下所示: static PyObject *
reverse()
函数。list
的reverse()
的时间复杂度是多少
我的时间实验表明,对于较大的尺寸,它是O(n)
。有人能证实吗
时间是反转大小列表的时间
10 .1027
100 .2347
1000 .6704
10000 6.204
20000 12.9
是的,你是对的,它是O(n),其中n是列表的长度。
查看此处以了解更多信息:如果您查看
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;
}
因此,该操作实际上被委托给反向切片
。那么,让我们来研究一下:
static void
reverse_slice(PyObject **lo, PyObject **hi)
{
assert(lo && hi);
--hi;
while (lo < hi) {
PyObject *t = *lo;
*lo = *hi;
*hi = t;
++lo;
--hi;
}
}
然后左索引递增,右索引递减:
++lo;
--hi;
只要右索引超过左索引,循环就会继续。因此,如果列表中有
n
元素,则将执行n/2
迭代,因此时间复杂度为O(n)
,如果您看到算法很容易看到反向的时间复杂度为O(n)
(线性时间复杂度)其中n是列表中元素的编号。通过诸如reverse()之类的内置库或使用切片a=a[::-->]来反转列表将花费相同的时间,即O(n)我知道这不是最重要的答案,但这是迄今为止最彻底的答案。你是如何看待这个函数的实现的?@IkechukwuAnude当时我研究过。此外,您还可以在github上查看。我还更新了指定源文件的答案。
++lo;
--hi;