2013-09-21 5 views
1

Можно ли выбрать M уникальных равномерно случайных элементов из массива размера N в O (M) времени?Выбор случайных чисел из массива

Решение O (N), очевидно, тривиально, например. Fisher-Yates имеет размер N массива и усекает первые M элементов.

+0

Вам не нужен полный F-Y. Вы можете усекать F-Y shuffle после M раз через цикл. Если M очень мало по сравнению с N, вы можете также рассмотреть алгоритм Флойда. –

ответ

1

Выберите случайное число в [0, x) для каждого x из [n-m, n]. Для каждого случайного числа замените элемент по этому индексу на элемент в индексе верхней границы. Что-то вроде:

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

oh ya, размер массива уменьшается каждый раз. Хорошо +1 –

Смежные вопросы