算法导论 5.3-2

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!)。所以不能实现教授的意图。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值