Dato un array di n
coppie word frequenza:algoritmo efficiente per selezionare casualmente oggetti con frequenza
[ (w0, f0), (w1, f1), ..., (wn-1, fn-1) ]
dove wi
è una parola, fi
è un frequencey intero, e la somma delle frequenze ∑fi = m
,
Desidero utilizzare un generatore di numeri pseudo casuali (pRNG) per selezionare p
parole wj0, wj1, ..., wjp-1
tali che la probabilità di selezionare qualsiasi parola sia proporzionale alla sua frequenza:
P(wi = wjk) = P(i = jk) = fi/m
(nota, questa è la selezione con sostituzione, per cui la stessa parola potrebbe essere scelto ogni volta).
mi è venuta in mente tre algoritmi finora:
creare un array di dimensioni
m
, e popolare così le prime voci sonof0
w0
, i prossimif1
voci sonow1
, e così via , quindi le ultime vocifp-1
sonowp-1
.[ w0, ..., w0, w1,..., w1, ..., wp-1, ..., wp-1 ]
Quindi utilizzare il pRNG per selezionare gli indicip
nell'intervallo0...m-1
e segnalare le parole memorizzate in tali indici.
Questo richiede lavoroO(n + m + p)
, che non è eccezionale, dal momento chem
può essere molto più grande di n.ciclo attraverso l'array di input volta, calcolando
mi = ∑h≤ifh = mi-1 + fi
e dopo aver calcolatomi
, utilizzare il PRNG per generare un numeroxk
nell'intervallo0...mi-1
per ognik
in0...p-1
e selezionarewi
perwjk
(eventualmente sostituendo il valore corrente diwjk
) sexk < fi
.
Ciò richiede il lavoroO(n + np)
.- Compute
mi
come nell'algoritmo 2, e generare il seguente matrice su n word-frequenza parziale somma triplica:[ (w0, f0, m0), (w1, f1, m1), ..., (wn-1, fn-1, mn-1) ]
e quindi, per ogni k in0...p-1
, utilizzare il PRNG per generare un numeroxk
nell'intervallo0...m-1
quindi fai una ricerca binaria sulla serie di triple per trovare ili
stmi-fi ≤ xk < mi
e selezionarewi
perwjk
.
Ciò richiede il lavoroO(n + p log n)
.
La mia domanda è: Esiste un algoritmo più efficiente posso usare per questo, o sono questi Qualcosa è cambiato?
questo è OT, e per favore non uccidermi per questo, ma come sei arrivato sub/scripts super, e le indicazioni equazione somma? – dassouki
Basta usare ... all'interno di blocchi
(per linea intera). – rampion...
(per inline) oE per il segno di somma, usa solo ∑ (vedi http://www.w3.org/TR/WD-entities-961125 per altre entità html per i sigilli matematici) – rampion