5.3-1 Marceau教授对引理5.5证明过程中使用的循环不变式表示异议。他对在第1次迭代之前循环不变式是否为真提出质疑。他得理由是人们可以容易地宣城空数组不包含0排列。因此空数组包含0排列的概率应该是0.所以在第1次迭代之前循环不变式无效。请改写过程RANDOMIZE-IN-PLACE,使其相关的循环不变式在第1次迭代之前对非空数组扔适用,并为你的过程修改引理5.5的证明。
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)]
初始化 考虑正好在第1次循环迭代之前的情况,此时i=2.由循环不变式可知,对每个可能的0排列,子数组A[1..1]包含这个1排列的概率是(n-2+1)!/n!=1/n.子数组A[1..1]是一个非空子数组,并且1排列中有1个元素A[1]。因而,A[1..1]包含1排列的概率是1/n。在第1次循环迭代以前循环不变式成立,保持和终止同原文。
5.3-2 Kelp教授决定写一个过程来随机产生除恒等排列外的任意排列。他提出了如下过程。
PERMUTE-WITHOUT-IDENTITY(A)
n=A.length
for i=1 to n-1
swap A[i]with A[RANDOM(i+1,n)]
在进行第i次迭代时,元素A[i]是从元素A[i+1]到A[n]中随机选取的。少选取了A[i]这1个元素,而在每次RANDOM时都少选取一个元素,所以必然少了一部分元素进行排列,也就是说少了一些排列方式不能包含所有排列方式。所以肯定就不能包含任意排列。
<
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)]
初始化 考虑正好在第1次循环迭代之前的情况,此时i=2.由循环不变式可知,对每个可能的0排列,子数组A[1..1]包含这个1排列的概率是(n-2+1)!/n!=1/n.子数组A[1..1]是一个非空子数组,并且1排列中有1个元素A[1]。因而,A[1..1]包含1排列的概率是1/n。在第1次循环迭代以前循环不变式成立,保持和终止同原文。
5.3-2 Kelp教授决定写一个过程来随机产生除恒等排列外的任意排列。他提出了如下过程。
PERMUTE-WITHOUT-IDENTITY(A)
n=A.length
for i=1 to n-1
swap A[i]with A[RANDOM(i+1,n)]
在进行第i次迭代时,元素A[i]是从元素A[i+1]到A[n]中随机选取的。少选取了A[i]这1个元素,而在每次RANDOM时都少选取一个元素,所以必然少了一部分元素进行排列,也就是说少了一些排列方式不能包含所有排列方式。所以肯定就不能包含任意排列。
<