Я думаю, что вы можете сделать это со сложностью log (k), где k - количество граней в кости.
для одного конкретного узла, пусть p1, p2, ..., pk - относительные вероятности.Пусть p1 + p2, ..., + pk = p.
Построить древовидную структуру с этими относительными вероятностями в виде листьев.родитель каждого неконечного узла является суммой относительных вероятностей их потомков.Чтобы «бросить кубик», нарисуйте случайное значение от 0 до p и следуйте по нему через дерево.Если вы хотите обновить относительную вероятность поверхности кости, просто измените значение соответствующего листа и распространите его вверх по дереву.
Таким образом, вы можете выбрать случайное значение с одним случайным числом с помощью log (k) шаги, необходимые для нахождения листа, соответствующего случайному числу, и когда вы обновляете один лист, требуется время log (k) для обновления дерева.
Это очень простое описание решения, и дайте мне знать, еслиВам нужно полное описание.Я уверен, что это работает, но не уверен, что это достаточно эффективно для вас.
Подводя итог, этот алгоритм требует: 1. Только одно случайное число между 0 и p 2. O (log (k))сложность «бросить кубик» (т.е. найти следующий узел), где k - количество граней в кости 3. O (log (k)), чтобы «обновить кубик» данного узла.Если есть m ребер от исходного узла, то сложность O (log (k1)) + O (log (k2)) ... O ((km)), где k1, k2, ... km - связность смежныхузлы.
====Tree Example====
Если в кости 4 грани и относительные вероятности 1:50, 2:80, 3:20, 4:70, постройте дерево следующим образом:
220
/ \
130 90
/ \ / \
50 80 20 70
| | | |
1 2 3 4
Создайте случайное число v от 0 до 220. Если это v = 100: выберите левый маршрут (с 100 <130), а затем выберите правильный маршрут (с 100> 80) и обновите v = v-80.= 20. Так как мы находимся на листе, объявляем o / p, т.е. 2
Если v = 210: слева и v = v-130 = 80, слева v = v-70 = 10, возврат листа = 4
Если 4 изменится на 60, изменится с 70 на 60, с 90 на 80 и с 220 на 210.
==== Lazy update variation ====
При изменении весов не обновляйте дерево немедленно.Вместо этого просто пометьте его как «грязный вес», подождите, пока вам не потребуется сделать прогноз на этом конкретном узле.
Когда вам нужно сделать прогноз на конкретном узле и если некоторые из весовых коэффициентов являются грязными, либоа.обновить дерево только с грязными узлами или б.обновить все дерево.Если количество грязных весов равно t, а количество полных весов k, если t * log (k)