随机化算法

作者在 2007-08-09 18:33:00 发布以下内容

随机化算法在分析某些涉及概率分析的问题上具有重要意义,因为输入的分布是我们不能预知的,我们想让分析的问题达到一个平均的状态,就得依靠随机化,把输入分布重新排列,使之成为一个脱离其他外界因数的排列,同时要保证出现这个排列的概率为1/n!。

下面,有两个常用的算法来实现输入分布的随机化,以给定的输入数组为例,我们的目标是把A[1..n]随机排列。

方法一:

为数组的每个元素A赋一个随机的优先级P,然后依据优先级对数组A中的元素进行排序。例如,数组A = {1,2,3,4},选择一个随机优先级P = {36,3,97,19},将得出数组A的排列B = {2,4,1,3},因为第2个优先级最小,其次是第4个,第1个,第3个。

这个过程称为permute_by_sorting

permute_by_sorting(A)

1 n <- length[A]

2 for i <- 1 to n

3      do P = RANDOM(1,n^3)

4 sort A,using P as sort keys

5 return A

其中第3步选择的随机数范围1--n^3是为了让产生的随机数尽可能的唯一。此过程消耗的时间将由第4步的排序决定,如果使用基于比较的排序,这个时间下界可以达到nlgn(合并排序……),其中排序的方法与普通排序一样,对P进行排序,多的只是在这个过程中将A按P的优先级排序。

方法二:

一个更好的原地排序(in place)给定的数列。过程randomize_in_place在O(n)的时间内完成。在第i次迭代时,元素A是从A到A[n]中随机选取的。第i次迭代之后,A保持不变。

randomize_in_place(A)

1 n <- length[A]

2 for i <- 1 to n

3      do swap A <-> A[RANDOM(i,n)]

 

证明这两个随机算法产生排列的概率为是均匀的即 1/n! ,需要用的概率分析的内容,这里不再验证(自己也知之甚少)。

同时,并非所有的随机化都是这个模式,这里只说明了常用的模型。例如在quick_sort中使用随机化使时间接近最优时,只需要在选择pivot时作一个随机选择。对于这个模型的具体实例,我在以后的学习中遇到将会添加。

电脑技术 | 阅读 3839 次
文章评论,共1条
zl芊芊zl
2007-08-24 20:58
1
看了一下,你的字中间是空的好远哦,你把文章在WORD里面编辑一下,再拷过来就不会有问题了
还有两个朋友回答
以下引用海啸南风在2007-8-11 15:12:00发表的评论:
你打完一行按住空格到行尾然后自动的换行就不空了。



以下引用呵呵(游客)在2007-8-23 19:13:00发表的评论:
用SHIFT+ENTER键换行就行了


试试看吧[emot]1[/emot]
游客请输入验证码