[英]What is the time complexity of Python List Reverse?
我已經看過這個頁面https://wiki.python.org/moin/TimeComplexity但我沒有在列表中看到reverse()
函數。 list
的reverse()
時間復雜度是多少?
我的時間實驗表明,對於較大的尺寸,它是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.