5.3-1
在进入循环前,先将在整个数组中随机选择一个数至于A[1]即可:
PERMUTE-IN-PLACE(A)
1 n=A.length
2 swap A[1] with A[RANDOM(1,n)]
3 for i=2 to n
4 swap A[i] with A[RANDOM(i,n)]
第二步其概率为1n,后面一样
5.3-2
不能。虽然这个算法确实不会产生恒等排列,但是不能产生除恒等排列外的任意排列。因为算法第三步使所有A[i]不能至于原来的位置。例如,当n=3时,除恒等排列外一共应该有n!−1=5个排列,但该算法只能产生3个排列。
5.3-3
不会。。。
5.3-4
对于A中每个元素
但是因为该算法只是在1−n之间取了一个数,然后将整个数组A向右平移了
5.3-5
在过程PERMUTE-BY-SORTING中,我们是在1到n3这n3个数中随机选择n个出来放在数组P中,所以对于P,其中每一个元素都唯一的概率为
由于
n3−n+1>n3−n2=n2(n−1)
所以
Pr≥[n2(n−1)]nn3n
也即
Pr≥n−1n=1−1n
5.3-6
可以对于相同的几个优先级的继续使用PERMUTE-BY-SORTING算法将其再次进行排序
5.3-7
算法实际执行的第一步为
S=RANDOM-SAMPLE(0,n-m)=∅
第二步中取第一个元素i=RANDOM(1,n−m+1),相当于在总集和的前n−m+1个元素中任选一个元素,概率为
1n−m+1
之后娶第二个元素时,总集和中的前n−m+2个元素中,第一次已经取得了一个元素,故还剩n−m+1个元素,在这n−m+1个元素中在任取一个作为第二个元素,其概率也为
1n−m+1
对于所有取得的m个元素,概率都为
故每个m子集是等可能的,且一共只取m次,故值调用RAMDOM函数