2010-07-17 9 views

Respuesta

0

Simplemente haga para cada nodo una llamada aleatoria en el rango 0 hasta (número de hijos) -1 y seleccione el siguiente hijo después de ese número.

Repita esto hasta que esté en una hoja.

+0

Esto estará sesgado hacia los nodos en los niveles superiores del árbol. Por ejemplo, la probabilidad de seleccionar el rootNode = 1/3 (suponiendo un máximo de 2 hijos). La probabilidad de seleccionar el nodo de hoja más a la izquierda = (1/3)^k, donde k = profundidad del nodo de hoja. –

+0

esto es cierto, sin embargo, en algunos casos no importa, pero thx para señalar esto – Quonux

12

No lo es. Para elegir un nodo uniformemente al azar, simplemente itere a través del árbol en el orden que desee. Deje que el n-ésimo nodo examinado sea el elegido con probabilidad 1/n. Es decir, mantenga un registro del nodo que devolvería en una variable, y cuando mire el enésimo nodo, reemplace el nodo actual por el enésimo con probabilidad 1/n. Puede mostrar por inducción que esto devuelve un nodo uniformemente al azar sin necesidad de saber cuántos hay de antemano.

+0

Este es un buen uso de la idea en http://stackoverflow.com/questions/1133942. – momeara

+4

Para ponerle un nombre: este es un algoritmo bien conocido, conocido como [muestreo de yacimientos] (http://en.wikipedia.org/wiki/Reservoir_sampling). – Joey

2

Si ha estructurado sus hojas que se almacena a sí mismos dentro de un tipo de datos de índice de poder, como una matriz, entonces usted puede fácilmente (pseudocódigo):

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

Eso es un bonito, O refrescante (1) :-)

Por supuesto, puede haber agujeros, por lo que puede tener que repetir desde allí. Si está almacenado como una lista enlazada, entonces puedes iterar sin embargo.

Simplemente proporcionando una alternativa a lo obvio. Realmente depende de su estructura de datos y su caso de uso más común.

Cuestiones relacionadas