私はこのページ https://wiki.python.org/moin/TimeComplexity を見ましたが、リストのreverse()
関数がありません。 list
のreverse()
の時間と時間の複雑さはどれくらいですか?
時間をかけて行った実験では、サイズが大きい場合はO(n)
であることがわかりました。誰でも確認できますか?
サイズのリストを逆にする時間
10 .1027
100 .2347
1000 .6704
10000 6.204
20000 12.9
はい、そうです、O(n) where n-リストの長さです。詳細については、こちらをご覧ください。 https://www.ics.uci.edu/ 〜pattis/ICS-33/lectures/complexitypython.txt
reverse
メソッド here の実装を調べると、次のようになります。
_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の時間の複雑さはO(n)
(linear time complex)nはリスト内の要素の番号です。