Как выбрать случайный узел от дерева

Как можно было бы пойти о выборе случайного элемента от дерева? Действительно ли необходимо знать глубину/размер дерева заранее?

10
задан Johnny 17 July 2010 в 17:10
поделиться

3 ответа

Это не так. Чтобы выбрать узел равномерно случайным образом, просто пройдитесь по дереву в любом порядке. Пусть n-й рассмотренный узел будет выбран с вероятностью 1/n. То есть, сохраните в переменной запись об узле, который вы бы вернули, и когда вы смотрите на n-й узел, замените текущий узел на n-й с вероятностью 1/n. Индукцией можно показать, что это возвращает узел равномерно случайным образом без необходимости заранее знать их количество.

14
ответ дан 3 December 2019 в 22:34
поделиться

Если вы структурировали свои листья так, чтобы они сами хранились в индексируемом типе данных, например в массиве, то вы можете легко (псевдокод):

random_leaf = leaf_pile[ random( size of leaf pile ) ]

Это хороший, освежающий O (1): -)

Конечно, здесь могут быть дыры, поэтому вам, возможно, придется повторить оттуда. Если он хранится как связанный список, вы можете выполнить итерацию.

Просто предлагаю альтернативу очевидному. Это действительно зависит от вашей структуры данных и вашего наиболее распространенного варианта использования.

2
ответ дан 3 December 2019 в 22:34
поделиться

Просто сделайте для каждого узла случайный вызов в диапазоне от 0 до (количество детей)-1 и выберите следующего ребенка после этого числа.

Повторяйте это до тех пор, пока не окажетесь в листе.

-1
ответ дан 3 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: