随机化算法在分析某些涉及概率分析的问题上具有重要意义,因为输入的分布是我们不能预知的,我们想让分析的问题达到一个平均的状态,就得依靠随机化,把输入分布重新排列,使之成为一个脱离其他外界因数的排列,同时要保证出现这个排列的概率为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时作一个随机选择。对于这个模型的具体实例,我在以后的学习中遇到将会添加。