洗牌算法

本文深入解析了普通与高级洗牌算法的工作原理,包括其流程、时间及空间复杂度。普通洗牌算法通过创建新数组实现数据打乱,而高级算法则在原数组上操作,节省空间。文章详细介绍了两种算法的具体步骤,帮助读者理解洗牌算法的核心概念。

普通的洗牌算法:

基本思想就是从原始数组中随机取一个之前没有取过的数字到一个新的数组中

python中的random中的sample就是洗牌算法

流程:

  1. 初始化原始数组和新数组,假设长度为n
  2. 从还没处理的数组(假设还剩k个)中,随机产生一个[0,k)之间的数字p
  3. 从剩下的k个数中把第p个数字取出来
  4. 重复第二步和第三步直到所有数字全部取完
  5. 从步骤三去除的数字序列便是一个打乱的序列

普通的洗牌算法时间复杂度为O(n^2),空间复杂度为O(n)

高级的洗牌算法:假设取m个数字

基本思想和普通的洗牌算法一样,但是不需要额外的空间,直接在原数组进行

每次从未处理的数据中随机取出一个数字,然后把该数字放在数组尾部,尾部存放的是已经

处理过的数据

流程:

  1. 建立一个大小为n的数组,存放1到n的数值
  2. 生成[0,n-1)的随机数x
  3. 输出数组下标为x的数据,也就是第一个随机数
  4. 将数组的尾元素和下标为x的元素互换
  5. 同第二步,生成[0,n-2)的随机数x
  6. 输出数组下标为x的数据,为第二个随机数
  7. 将数组倒数第二个元素和下标为x的元素互换
  8. ......

直到输出m个数字为止

时间复杂度为O(n),空间复杂度为O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值