【O(N)】生成N个不重复自然数的随机置换

例如,生成{4,3,1,5,2}或者{3,1,4,2,5}是合法置换,但{5,4,1,2,1}却不是,因为1重复出现而3未出现

前提:假设存在一个随机数生成器RandInt(i, j),它以相同的概率生成i 和 j之间的一个整数

O(N) 算法
① 为该数组赋值使得A[i] = i + 1

for (int i = 1; i < N; i ++)
      swap(&A[i], &A[RandInt(0, i)]);

若使用循环来判断重复,则时间复杂度是O(N^2logN)
若使用标记数组book[N],则时间复杂度是 O(NlogN)

顺带一提,在后面两个算法中,RandInt生成一个不重复数字的数学期望是 N/(N-i)。 因为生成一个与前i个数不同的数字的概率是 (N-i)/N,所以平均进行N/(N-i)次尝试才能生成一个不重复数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值