Una forma de resolver esto es repensar cómo se construye el árbol de búsqueda binaria que contiene los totales acumulados. En lugar de construir un árbol binario de búsqueda, pensar en tener cada nodo interpretado de la siguiente manera:
- cada nodo almacena una gama de valores que se dedica al propio nodo.
- Los nodos en el subárbol izquierdo representan el muestreo de la distribución de probabilidad justo a la izquierda de ese rango.
- Los nodos en el subárbol derecho representan el muestreo de la distribución de probabilidad justo a la derecha de ese rango.
Por ejemplo, supongamos que nuestros pesos son 3, 2, 2, 2, 1 y 1 para los eventos A, B, C, D, E, F y G. Construimos este árbol binario A, B, C, D, e, F y G:
D
/ \
B F
/\ /\
A C E G
Ahora, anotar el árbol con probabilidades.Dado que A, C, E y G son todas las hojas, damos a cada uno de ellos una masa de probabilidad:
D
/ \
B F
/\ /\
A C E G
1 1 1 1
Ahora, mira el árbol de B. B tiene un peso de ser elegido 2, A tiene un peso 3 de ser elegido, y C tiene la probabilidad 2 de ser elegido. Si los normalizamos en el rango [0, 1), A representa 3/7 de la probabilidad y B y C representan cada uno 2/7s. Así tenemos el nodo para B decir que cualquier cosa en el rango [0, 3/7) va al subárbol izquierdo, cualquier cosa en el rango [3/7, 5/7) se asigna a B, y cualquier cosa en el rango [5/7, 1) se asigna al subárbol derecho:
D
/ \
B F
[0, 3/7)/\ [5/7, 1)/\
A C E G
1 1 1 1
mismo modo, vamos a procesar F. e tiene un peso 2 de ser elegido, mientras que F y G cada uno tienen un peso probabilidad 1 de ser elegido. Por lo tanto, el subárbol para E representa 1/2 de la masa de probabilidad aquí, el nodo F da cuenta de 1/4 y el subárbol de cuentas G para 1/4. Esto significa que podemos asignar probabilidades como
D
/ \
B F
[0, 3/7)/\ [5/7, 1) [0, 1/2)/\ [3/4, 1)
A C E G
1 1 1 1
Finalmente, echemos un vistazo a la raíz. El peso combinado del subárbol izquierdo es 3 + 2 + 2 = 7. El peso combinado del subárbol derecho es 2 + 1 + 1 = 4. El peso de D en sí es 2. Por lo tanto, el subárbol izquierdo tiene probabilidad 7/13 de siendo escogido, D tiene una probabilidad 2/13 de ser elegido, y el subárbol correcto tiene una probabilidad 4/13 de ser elegido. De este modo podemos finalizado las probabilidades como
D
[0, 7/13)/ \ [9/13, 1)
B F
[0, 3/7)/\ [5/7, 1) [0, 1/2)/\ [3/4, 1)
A C E G
1 1 1 1
Para generar un valor aleatorio, sería repetir lo siguiente:
- A partir de la raíz:
- Elija un valor uniforme-aleatorio en el rango [0, 1).
- Si está en el rango para el subárbol izquierdo, bajar en ella.
- Si está en el rango para el subárbol derecho, bajar en ella.
- De lo contrario, devuelva el valor correspondiente al nodo actual.
Las probabilidades sí se puede determinar de forma recursiva cuando el árbol se construye:
- El probabilidades izquierdo y derecho son 0 para cualquier nodo hoja.
- Si un mismo nodo interior tiene un peso W, su árbol de la izquierda tiene peso total W L, y su árbol de la derecha tiene peso total W R, entonces la probabilidad izquierda es (W L)/(W + W L + W R) y la probabilidad derecha es (W R)/(W + W L + W R).
La razón de que esta reformulación sea útil es que nos da una forma de actualizar las probabilidades en el tiempo O (log n) por probabilidad actualizada. En particular, pensemos en qué invariantes van a cambiar si actualizamos el peso de algún nodo en particular. Para simplificar, supongamos que el nodo es una hoja por ahora.Cuando actualizamos el peso del nodo hoja, las probabilidades siguen siendo correctas para el nodo hoja, pero son incorrectas para el nodo que está justo encima, porque el peso de uno de los subárboles de ese nodo ha cambiado. Por lo tanto, podemos (en tiempo O (1)) volver a calcular las probabilidades para el nodo padre simplemente usando la misma fórmula que la anterior. Pero entonces el padre de ese nodo ya no tiene los valores correctos porque uno de sus pesos de subárbol ha cambiado, por lo que también podemos recalcular la probabilidad allí. Este proceso se repite hasta la raíz del árbol, con nosotros haciendo O (1) cálculo por nivel para rectificar los pesos asignados a cada borde. Suponiendo que el árbol está equilibrado, por lo tanto, tenemos que hacer el trabajo total O (log n) para actualizar una probabilidad. La lógica es idéntica si el nodo no es un nodo hoja; simplemente comenzamos en algún lugar del árbol.
En resumen, esto da
tiempo
- O (n) para construir el árbol (utilizando un enfoque de abajo arriba),
- O (log n) tiempo para generar un valor aleatorio, y
- O (log n) tiempo para actualizar cualquier valor.
Espero que ayude!
¿Qué quiere decir en proporción de más tiempo O (n)? Si solo recalcula Cj ... Cn de sus matrices acumulativas, en promedio será mejor que O (n) a menos que j sea siempre 0. – biziclop
@biziclop Si en promedio vuelve a calcular 'n/2' elementos, eso no es" better "than' O (n) 'porque' O (n/2) = O (n) '. –
@Michael McGowan Por supuesto que tienes razón, realmente debería ir a dormir. – biziclop