Можно ли выбрать M уникальных равномерно случайных элементов из массива размера N в O (M) времени?Выбор случайных чисел из массива
Решение O (N), очевидно, тривиально, например. Fisher-Yates имеет размер N массива и усекает первые M элементов.
Можно ли выбрать M уникальных равномерно случайных элементов из массива размера N в O (M) времени?Выбор случайных чисел из массива
Решение O (N), очевидно, тривиально, например. Fisher-Yates имеет размер N массива и усекает первые M элементов.
Выберите случайное число в [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]
, но разве это не уровень сложности O (n2)? –
@ s.d: Не так ли? Я предполагаю, что 'randrange' и доступ к массиву - O (1). – Ryan
oh ya, размер массива уменьшается каждый раз. Хорошо +1 –
Вам не нужен полный F-Y. Вы можете усекать F-Y shuffle после M раз через цикл. Если M очень мало по сравнению с N, вы можете также рассмотреть алгоритм Флойда. –