1 题目
Kelp教授决定写一个过程来随机产生一个非同一排列的任意排列。他提出了如下的过程:
PERMUTE-WITHOUT-IDENTITY(A) 1 n <- length[A] 2 for i <- 1 to n-1 3 do swap A[i] <-> A[RANDOM(i+1, n)]
这段代码实现了Kelp教授的意图了吗?
2 分析与解答
随机产生非同一排列的任意排列就是产生与A不同的所有n排列。如果代码能实现Kelp教授的意图,那么就要能产生n!-1个n排列,但是代码不能产生任何一个元素在原位置的排列。也就是说代码只能生成(n-1)!个排列,第2~3行循环的循环不变式是:循环的第i次迭代开始前,A[1..i-1]可能包含的排列,是A中元素的(i-1)排列的一部分,每个可能包含的排列出现的概率是((n-1)-i+1)!/(n-1!)。所以不能实现教授的意图。