簡體   English   中英

Python List Reverse 的時間復雜度是多少?

[英]What is the time complexity of Python List Reverse?

我已經看過這個頁面https://wiki.python.org/moin/TimeComplexity但我沒有在列表中看到reverse()函數。 listreverse()時間復雜度是多少?

我的時間實驗表明,對於較大的尺寸,它是O(n) 任何人都可以確認嗎?

timeit 反轉大小列表的時間

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

是的,你是對的,它是 O(n),其中 n - 列表的長度。 在這里查看更多信息: https : //www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

如果您查看這里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)

通過像 reverse() 這樣的內置庫或使用切片 a=a[::--] 來反轉列表都將花費相同的時間,即 O(n)

如果你看到算法很容易看出反向的時間復雜度是O(n)線性時間復雜度),其中n是列表中元素的數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM