1 问题
假设不是将元素A[i]与子数组A[i…n]中的随机一个元素相交换,而是将它与数组任何位置上的随机元素相交换:
PERMUTE-WITH-ALL(A) 1 n <- length[A] 2 for i <- 1 to n 3 do swap A[i] <-> A[RANDOM(1, n)]
这段代码会产生均匀随机排列吗?为什么会?或为什么不会?
2 分析与解答
显然代码肯定可以产生A中元素的全排列,但是产生的排列中有一些是相同的,这样就要考察A中元素的每一个全排列的重复次数是否相同,如果相同就能产生,反之就不能。
假设A=[1, 2, 3],那么分析第2,3行的for循环,有下面的产生链:
由图可见,
| [1, 2, 3] | 4 |
| [1, 3, 2] | 5 |
| [2, 1, 3] | 5 |
| [2, 3, 1] | 5 |
| [3, 1, 2] | 4 |
| [3, 2, 1] | 4 |
296

被折叠的 条评论
为什么被折叠?



