【发布时间】:2010-10-26 17:34:39
【问题描述】:
给定一组n 词频对:
[ (w0, f0), (w1, f1), .. ., (wn-1, fn-1) ]
其中w<sub>i</sub>是一个词,f<sub>i</sub>是一个整数频率,频率之和@987654326@,
我想使用伪随机数生成器 (pRNG) 来选择 p 单词 w<sub>j<sub>0</sub></sub>, w<sub>j<sub>1</sub></sub>, ..., w<sub>j<sub>p-1</sub></sub> 这样
选择任何单词的概率与其频率成正比:
P(wi = wjk) = P(i = jk) = f i / m
(注意,这是带替换的选择,所以每次都可以选择同一个词)。
到目前为止,我已经提出了三种算法:
-
创建一个大小为
m的数组,并填充它,使第一个f<sub>0</sub>条目是w<sub>0</sub>,下一个f<sub>1</sub>条目是w<sub>1</sub>,依此类推,所以最后一个f<sub>p-1</sub>条目是w<sub>p-1</sub>.[ w0, ..., w0, w1,..., w1, ..., wp-1, ..., wp-1 ]
然后使用 pRNG 在0...m-1范围内选择p索引,并报告存储在这些索引处的单词。
这需要O(n + m + p)工作,这不是很好,因为m可能比 n 大得多。 -
遍历输入数组一次,计算
mi = ∑h≤ifh = mi-1 + f我
在计算m<sub>i</sub>之后,使用pRNG 为0...p-1中的每个k在0...m<sub>i</sub>-1范围内生成一个数字x<sub>k</sub>如果x<sub>k</sub> < f<sub>i</sub>,则为w<sub>j<sub>k</sub></sub>选择w<sub>i</sub>(可能替换w<sub>j<sub>k</sub></sub>的当前值)。
这需要O(n + np)工作。 - 按照算法 2 计算
m<sub>i</sub>,并在 n 个词频部分和三元组上生成以下数组:[ (w0, f0 sub>, m0), (w1, f1, m1), ..., (wn-1, fn-1, mn-1) ]
然后,对于0...p-1中的每个k,使用pRNG 在0...m-1范围内生成一个数字x<sub>k</sub>,然后对三元组数组进行二进制搜索以找到is.t。m<sub>i</sub>-f<sub>i</sub> ≤ x<sub>k</sub> < m<sub>i</sub>,然后选择w<sub>i</sub>为w<sub>j<sub>k</sub></sub>。
这需要O(n + p log n)工作。
我的问题是:我可以为此使用更有效的算法吗,或者这些算法是否已经达到了最好的水平?
【问题讨论】:
-
这是OT,请不要因此而杀了我,但是您是如何获得子/超级脚本以及和等式符号的?
-
只需在
...块(用于内联)或...
块(用于全线)。 -
对于 sum 符号,只需使用 ∑ (有关数学符号的更多 html 实体,请参阅 w3.org/TR/WD-entities-961125)
-
顺便说一句,当性能无关紧要时,这里的复制和粘贴代码可以节省您输入stackoverflow.com/a/33991225/294884
-
请注意,算法 1 的效率当然要高得多,前提是您不计算开始组装阵列的时间(即,如果您在开发时只这样做一次)。