Gegeben eine Anordnung von n
Worthäufigkeitspaaren:effizienter Algorithmus zum zufälligen Auswahl von Elementen mit frequenz
[ (w0, f0), (w1, f1), ..., (wn-1, fn-1) ]
wo wi
ist ein Wort, fi
eine ganze Zahl frequencey, und die Summe der Frequenzen ∑fi = m
,
Ich möchte mit einem Pseudozufallszahlengenerator (pRNG) p
Wörter wj0, wj1, ..., wjp-1
so wählen, dass die Wahrscheinlichkeit der Auswahl eines Wortes ist proportional zu seiner Frequenz:
P(wi = wjk) = P(i = jk) = fi/m
(Beachten Sie, ist diese Auswahl mit Ersatz, so dass das gleiche Wort kann jedes Mal gewählt werden).
Ich habe bisher mit drei Algorithmen kommen:
eine Reihe von Größe erstellen
m
, und füllen Sie es so die erstenf0
Einträge sindw0
, die nächstenf1
Einträge sindw1
, und so weiter , so die letztenfp-1
Einträge sindwp-1
.[ w0, ..., w0, w1,..., w1, ..., wp-1, ..., wp-1 ]
Dann verwenden Sie die pRNG, um Indizes im Bereich0...m-1
auszuwählen, und melden Sie die Wörter in diesen Indizes gespeichert.
Dies dauertO(n + m + p)
Arbeit, die nicht gut ist, dam
viel viel größer als n sein kann.Schritt durch die Eingangsanordnung einmal Rechen
mi = ∑h≤ifh = mi-1 + fi
undmi
nach Berechnung verwenden, um die pRNG eine Anzahlxk
im Bereich zu erzeugen0...mi-1
für jedenk
in0...p-1
und wähltwi
fürwjk
(möglicherweise den aktuellen Wert des Ersetzenwjk
) wennxk < fi
.
Dies erfordertO(n + np)
Arbeit.- Compute
mi
wie in Algorithmus 2 und erzeugen die folgende Anordnung auf n Wortfrequenz-Teilsumme Tripel:[ (w0, f0, m0), (w1, f1, m1), ..., (wn-1, fn-1, mn-1) ]
und dann für jeden k in0...p-1
, verwenden, um die pRNG eine Anzahlxk
im Bereich zu erzeugen0...m-1
dann binäre Suche auf dem Array von Tripeln, um diei
st zu findenmi-fi ≤ xk < mi
, und wählen Siewi
fürwjk
.
Dies erfordertO(n + p log n)
Arbeit.
Meine Frage ist: Gibt es einen effizienteren Algorithmus ich dafür verwenden können, oder sind diese so gut wie es geht?
dies ist OT, und bitte dafür tötet mich nicht, aber wie haben Sie sub/Super-Skripte und die Summe Gleichung Zeichen bekommen? – dassouki
Verwenden Sie einfach ... innerhalb
Blöcke (für Fullline). – rampion...
Blöcke (für Inline) oderUnd für das Summenzeichen, verwenden Sie einfach ∑ (siehe http://www.w3.org/TR/WD-entities-961125 für weitere HTML-Entitäten für Math-Sigils) – rampion