2010-07-17 4 views

Répondre

0

Il suffit de faire pour chaque nœud un appel aléatoire dans l'intervalle 0 jusqu'à (nombre d'enfants) -1 et sélectionner l'enfant suivant après ce nombre. Répétez ceci jusqu'à ce que vous soyez dans une feuille.

+0

Ceci sera biaisé vers les nœuds aux niveaux supérieurs de l'arbre. Par exemple, la probabilité de sélectionner le rootNode = 1/3 (en supposant un maximum de 2 enfants). La probabilité de sélectionner le nœud foliaire le plus à gauche = (1/3)^k, où k = profondeur du nœud foliaire. –

+0

c'est vrai, cependant, dans certains cas, cela n'a pas d'importance mais merci de le signaler – Quonux

12

Ce n'est pas le cas. Pour choisir un nœud uniformément au hasard, il suffit de parcourir l'arbre dans l'ordre que vous voulez. Soit le nième nœud examiné avec la probabilité 1/n. C'est-à-dire, conservez un enregistrement du nœud que vous retourneriez dans une variable, et lorsque vous regardez le nième nœud, remplacez le nœud actuel par le nième avec la probabilité 1/n. Vous pouvez montrer par induction que cela retourne un nœud uniformément au hasard sans avoir besoin de savoir combien il y a d'avance.

+0

Ceci est une bonne utilisation de l'idée dans http://stackoverflow.com/questions/1133942. – momeara

+4

Pour y mettre un nom: C'est un algorithme bien connu, connu sous le nom de [Reservoir sampling] (http://en.wikipedia.org/wiki/Reservoir_sampling). – Joey

2

Si vous avez structuré vos feuilles à se stockés dans un type de données en mesure index, comme un tableau, vous pouvez facilement (pseudo-code):

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

C'est une belle O rafraîchissante (1) :-)

Bien sûr, il peut y avoir des trous, donc vous devrez peut-être recommencer à partir de là. Si elle est stockée en tant que liste liée, vous pouvez itérer cependant.

Juste fournir une alternative à l'évidence. Cela dépend vraiment de votre structure de données et de votre cas d'utilisation le plus courant.

Questions connexes