概率算法 -- 从集合中选取N个不重复的元素

      这个问题见了很多,一般表述是,1到n的整数中随机选k个这k个不能重复。变一下即可以是n个元素选k个,不能重复。

 

    有不同复杂度的算法。第一个是笨办法:

(1)随机选一个数,然后判断这个数字是否已经被选过了(是否重复),不过不重复,那就就选他了,如果重复,就再随机选一个。

空间复杂度:O(1)

时间复杂度:O(k^2)

而且有一个问题,如果是100个选90个,那么最后冲突的概率很大,选一个数字要重复随机好多次才行。效率低。不要。

如果用hash来解决判重的问题:

空间:O(n)

时间:O(k)

 

(2)第二种是第一种的改进。先在1到n-k+1中随机选一个,然后把范围扩大到n-k+2,再随机选一个,如果随机选中的是之前已经选过的,那么就选择第n-k+2个元素。

比如:从1-8中选4个数字。

第一步.从1到5中随机选一个,比如选了2.

第二步。从1到6中随机选一个。如果选出的是i=1,3,4,5,6,那么就选i即可。如果选出的是2,这个时候就重复了,此时的处理方式是选择i=6。

第三步,从1到7中随机选一个数,如果跟之前的重复,那么就选那种7.

第四步从1到8中随机选一个数,如个之前的重复,就选8。

 

空间复杂度:O(1)

时间复杂度:O(k^2)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值