Python3のrandom.choice(list)のBig-Oの複雑さは何ですか?nはリストの要素の量ですか?Q:Python3のrandom.choice(リスト)のBig-Oの複雑さは何ですか?
編集。私に答えを与えてくれてありがとう、今私は理解する。
Python3のrandom.choice(list)のBig-Oの複雑さは何ですか?nはリストの要素の量ですか?Q:Python3のrandom.choice(リスト)のBig-Oの複雑さは何ですか?
編集。私に答えを与えてくれてありがとう、今私は理解する。
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
を使用すると、あなたが繰り返し、それからランダム要素を選択することを計画し、list
、tuple
、str
、byte
/bytearray
、array.array
とO(1)
インデックスと他のシーケンス型に固執しないでください。
"largish"定数の除数はどういう意味ですか? –
@StefanPochmann:実装の詳細はここにありますが、CPythonの 'deque'はそれぞれが[64個までの値を格納する]ブロックのリンクリストです(https://hg.python.org/cpython/file/c445746d0846/Modules/_collectionsmodule.c #l21)(左右のブロックが不完全かもしれません)。長さの稜線66まで、ルックアップはブロックトラバーサルを必要とすることがあり、最大1000個の要素までは、最大17個のブロック(索引付けのためには、その半分をトラバースする必要があります)と、Pythonインタプリタオーバーヘッドは一般に、リンクされたリスト内で8ホップを横断するような小さなCレベルのコストを抑えます。 – ShadowRanger
オハイオ州クール、私はそれがそれを行うことを知らなかった。しかし、意味があります。ありがとう、知ってよかった。 –
仕様に記載されていない場合は、おそらく実装に依存します。 – Barmar
なぜそれが 'O(1)'でないのか想像できません。 '0'から' len(list) 'に乱数' i'を選び、 'list [i]'を返すだけです。それらはすべて一定時間操作です。 – Barmar
Pythonリストがリンクリストとして実装されている場合、選択された要素にアクセスするのと同様に、リストの長さを線形にするので、 'O(n)'になります。しかし、実際には配列なので、すべてが一定です。 – Barmar