web-dev-qa-db-ja.com

Python List Reverseの時間の複雑さはどれくらいですか?

私はこのページ https://wiki.python.org/moin/TimeComplexity を見ましたが、リストのreverse()関数がありません。 listreverse()の時間と時間の複雑さはどれくらいですか?

時間をかけて行った実験では、サイズが大きい場合はO(n)であることがわかりました。誰でも確認できますか?

サイズのリストを逆にする時間

   10    .1027
  100    .2347
 1000    .6704
10000   6.204
20000  12.9
18
Fairly Nerdy

はい、そうです、O(n) where n-リストの長さです。詳細については、こちらをご覧ください。 https://www.ics.uci.edu/ 〜pattis/ICS-33/lectures/complexitypython.txt

20
Serenity

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)になります。

6
Anatolii

アルゴリズムがわかりやすい場合、reverseの時間の複雑さはO(n)linear time complexnはリスト内の要素の番号です。

0
zig razor