数组[:: - 1]的时间复杂度和空间复杂度是多少?

时间:2017-07-26 14:32:17

标签: python time-complexity space-complexity

当反转Python中的列表时,我通常使用数组[:: - 1]进行反转,我知道更常见的方式可能会从列表的两边进行交换。但我不确定这两种解决方案之间的区别,如时间复杂度和空间复杂度。

以下两种方法的代码:

def reverse(array):
    array[:] = array[::-1]


def reverse(array):
    start, end = 0, len(array)-1
    while start < end:
        array[start], array[end] = array[end], array[start]
        start += 1
        end -= 1

2 个答案:

答案 0 :(得分:4)

在C python中,假设array是一个列表,表达式array[::-1]触发函数list_subscript()中的以下算法 源文件listobject.c

        result = PyList_New(slicelength);
        if (!result) return NULL;

        src = self->ob_item;
        dest = ((PyListObject *)result)->ob_item;
        for (cur = start, i = 0; i < slicelength;
             cur += (size_t)step, i++) {
            it = src[cur];
            Py_INCREF(it);
            dest[i] = it;
        }

这段代码的时间和空间复杂度都是O(n),其中n是列表的长度。当然,这里没有任何意外。

您的功能reverse()也有O(n)时间复杂度,不同之处在于它不使用临时列表。

内置C函数比纯python循环要快得多(对于100个元素列表,我的计算机上大约10倍)。

答案 1 :(得分:0)

我在Jupyter上使用%%timeit进行了实验,数组大小分别为100、1000和10000。array[::-1]reverse(array)(从列表的两端交换)花费的时间保持不变几乎呈线性增长。但是,Python内置的reversed函数所花费的时间几乎保持不变,因此我认为这将是最佳选择。

Time Comparison