给定一个n
词频对数组:
[ (w 0 , f 0 ), (w 1 , f 1 ), ..., (w n-1 , f n-1 ) ]
其中是一个词,是一个整数频率,频率之和,wi
fi
∑fi = m
我想使用伪随机数生成器 (pRNG) 来选择p
单词,以便选择任何单词的概率与其频率成正比:wj0, wj1, ..., wjp-1
P(w i = w j k ) = P(i = j k ) = f i / m
(注意,这是带替换的选择,所以每次都可以选择同一个词)。
到目前为止,我已经提出了三种算法:
创建一个大小为 的数组
m
,并将其填充为第一个条目是,下一个条目是,依此类推,所以最后一个条目是。f0
w0
f1
w1
fp-1
wp-1
[ w 0 , ..., w 0 , w 1 ,..., w 1 , ..., w p-1 , ..., w p-1 ]
然后使用 pRNG 选择p
range 中的索引0...m-1
,并报告存储在这些索引处的单词。
这需要O(n + m + p)
工作,这不是很好,因为m
它可能比 n 大得多。遍历输入数组一次,计算
m i = ∑ h≤i f h = m i-1 + f i
在计算 之后,使用 pRNG为每个in生成一个范围内的数字, 并选择for (可能替换 的当前值) if 。 这需要工作。mi
xk
0...mi-1
k
0...p-1
wi
wjk
wjk
xk < fi
O(n + np)
- 按照算法 2 进行计算,并在 n 个词频部分和三元组上生成以下数组:
mi
[ (w 0 , f 0 , m 0 ), (w 1 , f 1 , m 1 ), ..., (w n-1 , f n-1 , m n-1 ) ]
然后,对于每个 k in ,使用 pRNG在范围内0...p-1
生成一个数字,然后对三元组数组进行二进制搜索以找到st ,然后选择for 。 这需要工作。xk
0...m-1
i
mi-fi ≤ xk < mi
wi
wjk
O(n + p log n)
我的问题是:有没有更有效的算法可以用于此,或者这些算法是否尽可能好?