2013-09-21 133 views
1

是否可以從O(M)時間的大小爲N的數組中選擇M個唯一的均勻隨機元素? O(N)解決方案顯然微不足道,例如, Fisher-Yates大小爲N的數組,並截斷到前M個元素。從數組中挑選隨機數

+0

您不需要完整的F-Y。您可以通過循環在M次後截斷F-Y隨機播放。如果M與N相比非常小,那麼您也可以考慮Floyd的算法。 –

回答

1

爲[n-m,n]中的每個x選擇[0,x)中的一個隨機數。對於每個隨機數,將該索引處的項目與上限索引處的項目交換。例如:

import random 

def random_elements(items, count): 
    length = len(items) 

    for i in range(count): 
     index = random.randrange(0, length - i) 
     yield items[index] 
     items[length - i - 1], items[index] = items[index], items[length - i - 1] 
+0

但不是這是一個O(n2)複雜度級別? –

+0

@ s.d:是嗎?我假設'randrange'和數組訪問是O(1)。 – Ryan

+0

哦,每次數組大小都在減小。良好+1 –