随机算法全面总结

随机算法涉及大量概率论知识,有时候难得去仔细看推导过程,当然能够完全了解推导的过程自然是有好处的,如果不了解推导过程,至少记住结论也是必要的。本文总结最常见的一些随机算法的题目,也当作面试的准备工作吧。需要说明的是,这里用到的随机函数都假定它能随机的产生范围[a,b]内的整数,即产生每个整数的概率相等。(虽然在实际中并不一定能实现,不过,谁在乎呢?这个世界都是这么随机)


一、随机排列数组

假设给定一个数组A,它包含元素1到N,我们的目标是构造这个数组的一个随机排列。

一个常用的方法是为数组每个元素A[i]赋一个随机的优先级P[i],然后依据优先级对数组进行排序。比如我们的数组为A={1, 2, 3, 4},如果选择的优先级数组为P={36, 3, 97, 19},那么就可以得到数列B={2, 4, 1, 3},因为3的优先级最高(为97),而2的优先级最低(为3)。这个算法需要产生优先级数组,还需使用优先级数组对原数组排序,这里就不详细描述了,还有一种更好的方法可以得到随机排列数组。

产生随机排列数组的一个更好的方法是原地排列给定数组(in-place),可以在O(N)的时间内完成。伪代码如下:

RANDOMIZE-IN-PLACE ( A , n )
     for i ←1 to n
          do swap A[i] ↔A[RANDOM(i , n )]

如代码中所示,第i次迭代时,元素A[i]是从元素A[i]到A[n]中随机选取的,在第i次迭代后,我们就再也不会改变A[i]。

A[i]位于任意位置j的概率为1/n。这个是很容易推导的,比如A[1]位于位置1的概率为1/n,这个显然,因为A[1]不被1到n的元素替换的概率为1/n,而后就不会再改变A[i]了。而A[1]位于位置2的概率也是1/n,因为A[1]要想位于位置2,则必须在第一次与A[k]交换(k=2...n),同时第二次A[2]与A[k]替换,第一次与A[k]交换的概率为(n-1)/n,而第二次替换概率为1/(n-1),所以总的概率是(n-1)/n * 1/(n-1) = 1/n。同理可以推导其他情况。

当然这个条件只能是随机排列数组的一个必要条件,也就是说,满足元素A[i]位于位置j的概率为1/n不一定就能说明这可以产生随机排列数组。因为它可能产生的排列数目少于n!,尽管概率相等,但是排列数目没有达到要求,算法导论上面有一个这样的反例。

算法RANDOMIZE-IN-PLACE可以产生均匀随机排列,它的证明过程如下:

首先给出k排列的概念,所谓k排列就是从n个元素中选取k个元素的排列,那么它一共有n!/(n-k)!个k排列。

循环不变式:for循环第i次迭代前,对于每个可能的i-1排列,子数组A[1...i-1]包含该i-1排列的概率为(n-i+1)! / n!。

  • 1
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值