Dada una matriz de n
pares de palabras de frecuencia:algoritmo eficiente para seleccionar aleatoriamente elementos con frecuencia
[ (w0, f0), (w1, f1), ..., (wn-1, fn-1) ]
donde wi
es una palabra, fi
es un frequencey número entero, y la suma de las frecuencias ∑fi = m
,
Quiero usar un generador de números pseudoaleatorios (pRNG) para seleccionar p
palabras de modo que la probabilidad de seleccionar cualquier palabra sea proporcional a su frecuencia:
P(wi = wjk) = P(i = jk) = fi/m
(Nota: esto es la selección con el reemplazo, por lo que la misma palabra podría ser elegido cada vez).
Yo he llegado con tres algoritmos hasta ahora:
crear una matriz de tamaño
m
, y rellenarla por lo que las primeras entradas sonf0
w0
, los próximosf1
entradas sonw1
, etc. , por lo que las últimas entradasfp-1
sonwp-1
.[ w0, ..., w0, w1,..., w1, ..., wp-1, ..., wp-1 ]
Luego use el pRNG para seleccionar los índicesp
en el rango0...m-1
, e informe las palabras almacenadas en esos índices.
Esto tomaO(n + m + p)
trabajo, que no es genial, ya quem
puede ser mucho más grande que n.Paso a través de la matriz de entrada una vez, el cálculo de
mi = ∑h≤ifh = mi-1 + fi
y después de calcularmi
, utilice el PRNG para generar un númeroxk
en el intervalo0...mi-1
para cadak
en0...p-1
y seleccionewi
parawjk
(posiblemente sustituir el valor actual dewjk
) sixk < fi
.
Esto requiereO(n + np)
trabajo.- Compute
mi
como en el algoritmo 2, y generar la siguiente matriz en n palabra de frecuencia parcial de suma triplica:[ (w0, f0, m0), (w1, f1, m1), ..., (wn-1, fn-1, mn-1) ]
y luego, para cada k en0...p-1
, utilice el PRNG para generar un númeroxk
en el intervalo0...m-1
luego haz una búsqueda binaria en la matriz de tripletas para encontrar eli
stmi-fi ≤ xk < mi
, y seleccionewi
parawjk
.
Esto requiereO(n + p log n)
trabajo.
Mi pregunta es: ¿Existe un algoritmo más eficiente que puedo utilizar para esto, o se trata tan bueno como se pone?
esto es OT, y por favor no me mate por esto, pero ¿cómo llegaste sub/scripts súper, y las señales suma ecuación? – dassouki
Solo use ... dentro de
bloques (para fullline). – rampion...
bloques (para en línea) oY para el signo de suma, solo use ∑ (vea http://www.w3.org/TR/WD-entities-961125 para más entidades html para sigils matemáticos) – rampion