Q: What is Big-O complexity of random.choice(list) in Python3

巧了我就是萌 提交于 2019-12-08 19:53:30

问题


What is Big-O complexity of random.choice(list) in Python3, where n is amount of elements in a list ?

edit. Thank You all for give me the answer, now I understand.


回答1:


O(1). Or to be more precise, it's equivalent to the big-O random access time for looking up a single index in whatever sequence you pass it, and list has O(1) random access indexing (as does tuple). Simplified, all it does is seq[random.randrange(len(seq))], which is obviously equivalent to a single index lookup operation.

An example where it would be O(n) is collections.deque, where indexing in the middle of the deque is O(n) (with a largish constant divisor though, so it's not that expensive unless the deque is reaching the thousands of elements range or higher). So basically, don't use a deque if it's going to be large and you plan to select random elements from it repeatedly, stick to list, tuple, str, byte/bytearray, array.array and other sequence types with O(1) indexing.




回答2:


I think the above answer is incorrect. I empirically verified that the complexity of this operation is O(n). Here is my code and a little plot. I am not sure about the theory though.

from time import time
import numpy as np 
import matplotlib.pyplot as plt
N = np.logspace(2, 10, 40)
output = []
for i, n in enumerate(N):
    print(i)
    n = int(n)
    stats = time()
    A = np.random.choice(list(range(n)), n//2)
    output.append(time()-stats)   
plt.plot(N, output)

This is the plot I got which looks quite linear to me.




回答3:


The complexity of random.choice(list) is O(log n) where n is the number of elements in the list.

The cpython implementation uses _randbelow(len(seq)) to get a pseudo-random index and then returns the item at that index.

The bottleneck is the _randbelow() function which uses rejection sampling to generate a number in the range [0, n). The function generates k pseudo-random bits with a call to getrandbits(k) where k is ceil(log N). These bits represent a number in the range [0, 2**k). This process is repeated until the generated number is less than n. Each call to the pseudo-random number generator runs in O(k) where k is the number of bits generated which is O(log n).



来源:https://stackoverflow.com/questions/40143157/q-what-is-big-o-complexity-of-random-choicelist-in-python3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!