2011-03-03 CLRS Chapter 5 Randomized Algorithms 随机化的算法

来源:互联网 发布:数据流量控制 编辑:程序博客网 时间:2024/05/22 10:57

 

这章讲随机化的思想在算法里面的运用,讲理论的内容要多一点,核心的算法就俩,而且做的还是同一件事:将一个数组里面的数据进行一次随机排列。

  讲了两种方法,一种是产生一个随机数组(里面的每一个值都是0~len*len*len之间的一个随机数),然后将此数组作为key,对原来的数组进行一次“排序”,排序之后,就得到原来数组的一个随机排列。Java代码如下:

 

 

这种方法真正的cost在于sort(data, p)部分的cost

第二种方法就巧妙多了,效率也高多了,可以在原地、O(n)时间内完成。它的思想是:

对于每一个 i from 0 to len-1,将data[i]与在{data[i]data[i+1]data[len-1]}当中随机取一个值进行交换。这样一次循环下来,data数组就完成了一次随机排列。稍微想想,就会发现这个思想还真是正确的,当然,书上进行了严谨的数学证明。

Java代码如下:

 

除了这两个算法,书上还提到一个Hiring Problem,这个问题还是比较有趣的。另外还有一个概念:

    uniform random permutation: every permutation of the numbers 1 through n is equally likely to be produced.

 

 

原创粉丝点击