洗牌算法

普通的洗牌算法:

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

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)

你可能感兴趣的:(算法)