CLRS 5.3随机算法

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[11] (n1)!n!=1n 的概率出现,其他和原算法保持不变。

5.3-2
没有,很显然它不能产生和最开始一样的排列,比如一个 [1,2,3] 的排列使用这个算法之后不可能得到 [1,2,3]

5.3-3
不能,因为这个算法产生的排列数为 nn 种,而 n 个元素最多产生 n! 种排列,所以此算法产生了一些重复的排列,当 nn 不能被 n! 整除时,说明有的排列数多,有的则少,则产生的排列不均匀。

5.3-4
joffset+i(modn) 时, A[i] 复制到 B[j] 。概率就是 1/n
这个算法类似于一个很简单凯撒密码,就是从某一个位置开始循环。

5.3-5
n3 个数中取 n 个元素的全排列为:Ann3=n3!(n3n)!,总共有 (n3)n 种,所以全部不同的概率:

P(U)=Ann3(n3)n=n3!(n3n)!(n3)n=n3(n31)(n3n+1)(n3n)!(n3n)!(n3)n(n3n)(n3n)(n3n)(n3)n=(n3nn3)n=(11n2)n11n

最后一个推导运用 (1x)n1nx

5.3-6
重新产生新的优先级,直到优先级不重复为止;

5.3-7
由于每次调用都会将 m 1,很显然会调用且只调用 RANDOM m 次。
然后我们证明 1...n 中的每个元素出现在 S 中的概率是 mn。采用数学归纳法证明,归纳假设就是RANDOM-SAMPLE返回含有 m 个元素的集合 S,集合中每个元素出现的概率是 mn
m=1 时,就从 {1...n} 中返回一个数,当 m=0 时返回空集,集合中包含的每个元素的概率是 0
假设调用RANDOM-SAMPLE(m-1,n-1)时返回 m1 个元素的集合 S ,其中 m1 个元素来自 {1...n1} ,概率是 m1n1 。在代码第四行 i=RANDOM(1,n)之后, i {1...n} 中返回一个数,然后分别考虑集合 S 中包含 n 和不包含 n 的情况。
Rj 表示调用 RANDOM返回元素 j ,概率为 Pr{Rj}=1/n。显然要 jS 来自两种情况, jS 或者 jS 并且 Rj ,则

Pr{jS}=Pr{jS}+Pr{jS and Rj}=m1n1+(1m1n1)1n=mn

同理 nS 来自两种情况, Rn 或者 Rj 并且 jS(j<n) ,则
Pr{nS}=Pr{Rn}+Pr{Rj and jS}=1n+n1nm1n1=mn

注:CLRS 5.4节答案略

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值