Python List Reverse的时间复杂度是多少?

时间:2016-06-03 04:50:04

标签: python list time-complexity

我看过这个页面https://wiki.python.org/moin/TimeComplexity,但我没有看到列表中的反向函数。列表反转的时间复杂度是多少?

我的时间实验表明,对于较大的尺寸,它是O(n)。任何人都可以证实吗?

timeit反转大小列表的时间

   10    .1027
  100    .2347
 1000    .6704
10000   6.204
20000  12.9

4 个答案:

答案 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)