2016-10-19 4 views
0

Python3のrandom.choice(list)のBig-Oの複雑さは何ですか?nはリストの要素の量ですか?Q:Python3のrandom.choice(リスト)のBig-Oの複雑さは何ですか?

編集。私に答えを与えてくれてありがとう、今私は理解する。

+0

仕様に記載されていない場合は、おそらく実装に依存します。 – Barmar

+1

なぜそれが 'O(1)'でないのか想像できません。 '0'から' len(list) 'に乱数' i'を選び、 'list [i]'を返すだけです。それらはすべて一定時間操作です。 – Barmar

+0

Pythonリストがリンクリストとして実装されている場合、選択された要素にアクセスするのと同様に、リストの長さを線形にするので、 'O(n)'になります。しかし、実際には配列なので、すべてが一定です。 – Barmar

答えて

1

O(1)。または、より正確には、で1つのインデックスを参照する場合のbig-Oランダムアクセス時間に相当します。listはのようにO(1)ランダムアクセスインデックスを持っています(tuple)。それはO(n)あろうSimplified, all it does is seq[random.randrange(len(seq))], which is obviously equivalent to a single index lookup operation.

例はdequeの中央にインデクシングはしかし大きめ定数除数と(O(n)ので、deque、要素の数千に到達されていない限り、それは高価ではない範囲で以上collections.deque、あります)。だから、基本的には、大きなことになるだろう場合dequeを使用すると、あなたが繰り返し、それからランダム要素を選択することを計画し、listtuplestrbyte/bytearrayarray.arrayO(1)インデックスと他のシーケンス型に固執しないでください。

+0

"largish"定数の除数はどういう意味ですか? –

+0

@StefanPochmann:実装の詳細はここにありますが、CPythonの 'deque'はそれぞれが[64個までの値を格納する]ブロックのリンクリストです(https://hg.python.org/cpython/file/c445746d0846/Modules/_collectionsmodule.c #l21)(左右のブロックが不完全かもしれません)。長さの稜線66まで、ルックアップはブロックトラバーサルを必要とすることがあり、最大1000個の要素までは、最大17個のブロック(索引付けのためには、その半分をトラバースする必要があります)と、Pythonインタプリタオーバーヘッドは一般に、リンクされたリスト内で8ホップを横断するような小さなCレベルのコストを抑えます。 – ShadowRanger

+0

オハイオ州クール、私はそれがそれを行うことを知らなかった。しかし、意味があります。ありがとう、知ってよかった。 –

関連する問題