Подход O (log (n)) (он извлечен непосредственно из ответа на очень похожий вопрос ):
Обычная техника - преобразовать массив в массив кумулятивных сумм:
[10 60 5 25] --> [10 70 75 100]
Выберите случайное число в диапазоне от нуля до совокупной суммы (в примере: 0 <= x < 100
). Затем используйте bisection на накопительном массиве, чтобы найти индекс в исходном массиве:
Random variable x Index in the Cumulative Array Value in Original Array
----------------- ----------------------------- ----------------------
0 <= x < 10 0 10
10 <= x < 70 1 60
70 <= x < 75 2 5
75 <= x < 100 3 25
Например, если случайная величина x равна 4, разделив кумулятивный массив, вы получите индекс позиции 0, который соответствует 10 в исходном массиве.
И, если случайная величина x равна 72, деление пополам совокупного массива дает индекс позиции 2, который соответствует 5 в исходном массиве.