Учитывая массив истинных/ложных значений, каков наиболее эффективный алгоритм для выбора индекса с истинным значением в случайном порядке.Быстрый алгоритм случайного выбора
Эскиз простой алгоритм
a <- the array
c <- 0
for i in a:
if a[i] is true: c++
e <- random number in (0, c-1)
j <- 0
for i in e:
while j is false: j++
return j
Может кто-нибудь придумать быстрый алгоритм? Может быть, есть способ только пройти через список один раз, даже если количество истинных элементов неизвестно вначале?
Любопытно узнать, в каких приложениях используются эти типы алгоритмов? Когда-то мне приходилось сталкиваться с подобным вопросом, учитывая массив бесконечного размера, первые русские места заполняются 1, остальные - нули. Теперь этот массив передается новому пользователю (который не знает значения n). Теперь найдите алгоритм, чтобы отметить место, где находится последний 1. Это я решил путем двоичного поиска. Приведите несколько примеров, где они используются. – avd
Около двух экземпляров: http://stackoverflow.com/questions/1133942/what-is-the-most-efficient-way-to-pick-a-random-card-from-a-deck-when-some-cards. В этом вопросе массив имеет размер 52, хотя это может повлиять на ответы (например, вы уверены, что arary размера 52 подходит для памяти, тогда как 'a' здесь может не подойти). –