5.3-1
改变循环的下标,把第一次循环结果作为初始条件。
RANDOMIZE-IN-PLACE(A)
n = A.length
swap A[1] with A[Random(1, n)]
for i = 2 to n
swap A[i] with A[Random(i, n)]
初始条件变为序列 A[1…1] 以 (n−1)!n!=1n 的概率出现,其他和原算法保持不变。
5.3-2
没有,很显然它不能产生和最开始一样的排列,比如一个
[1,2,3]
的排列使用这个算法之后不可能得到
[1,2,3]
。
5.3-3
不能,因为这个算法产生的排列数为
nn
种,而
n
个元素最多产生
5.3-4
当
j≡offset+i(modn)
时,
A[i]
复制到
B[j]
。概率就是
1/n
。
这个算法类似于一个很简单凯撒密码,就是从某一个位置开始循环。
5.3-5
从
n3
个数中取
n
个元素的全排列为:
最后一个推导运用 (1−x)n≥1−nx 。
5.3-6
重新产生新的优先级,直到优先级不重复为止;
5.3-7
由于每次调用都会将
m
减 RANDOM
m
次。
然后我们证明 RANDOM-SAMPLE
返回含有
m
个元素的集合
当
m=1
时,就从
{1...n}
中返回一个数,当
m=0
时返回空集,集合中包含的每个元素的概率是
0
;
假设调用RANDOM-SAMPLE(m-1,n-1)
时返回 i=RANDOM(1,n)
之后,
i
从
令 RANDOM
返回元素
j
,概率为
同理 n∈S 来自两种情况, Rn 或者 Rj 并且 j∈S′(j<n) ,则
注:CLRS 5.4节答案略