Algo(来源:编程访谈的元素,5.16)
您将获得n个数字以及概率
p0, p1,.., pn-1
总和为1.给定一个rand num生成器,它生成值[0,1]
统一地说,你将如何生成n个数中的一个 他们的具体概率。
实施例
如果数字是3,5,7,11,概率是
9/18, 6/18, 2/18, 1/18
,那么在程序的1000000 cals中,应该出现3 50万次,7次应出现111111次等
本书说创建间隔p0, p0 + p1, p0 + p1 + p2, etc
所以在上面的示例中间隔为[0.0, 5.0), [0.5, 0.0.8333), etc
,并且将这些间隔组合成有序的端点数组可能看起来像[1/18, 3/18, 9/18, 18/18]
。然后运行随机函数生成器,找到大于生成元素的最小元素 - 它对应的数组索引映射到给定n
数字中的索引。
这需要 O(N)预处理时间,然后 O(log N)才能二进制搜索该值。
我有一个替代解决方案需要 O(N)预处理时间和 O(1)执行时间,并且我想知道它可能有什么问题。
为什么我们不能遍历n
中的每个数字,乘以[n] * 100 * probability that matches with n
。 E.g [3] * (9/18) * 100
。连接所有这些数组,最后得到一个包含100个元素的列表,每个映射的元素数量指示它发生的可能性。然后,将随机num函数和索引运行到数组中,并返回值。
这不会比提供的解决方案更有效吗?
答案 0 :(得分:2)
您的号码100与输入无关;它取决于给定的p
值。任何依赖于输入值的幅度的参数在输入大小中都是指数,这意味着您实际上使用的是指数空间。因此,构建该数组只需要指数时间,即使它被构造为在生成随机数后允许持续查找时间。
考虑两个p
值,0.01和0.99。 100个值足以实现您的方案。现在考虑0.001和0.999。现在,您需要一个 1,000 值的数组来建模概率分布。空间量随着(我相信)最大p
值与最小值之比而增长,而不是与给定的p
值之比。
答案 1 :(得分:2)
如果你有理性概率,你可以做到这一点。而不是100,你必须使用合理比例的共同点。坚持100项不符合你指定的例子的规格,更不用说更多的恶魔了。