三种经典的洗牌算法
參考原文鏈接:https://blog.csdn.net/qq_25026989/article/details/89512769
問題描述:洗牌算法是將原來的數組進行打散,使原數組的某個數在打散后的數組中的每個位置上等概率的出現。
主要有3中經典的洗牌算法:
1.抽牌:
? ? ? ? ? ? 1.初始化原始數組和新數組,原始數組長度為n(已知);
? ? ? ? ? ? 2.從還沒處理的數組(假如還剩k個)中,隨機產生一個[0, k)之間的數字p(假設數組從0開始);
? ? ? ? ? ? 3.從剩下的k個數中把第p個數取出;
? ? ? ? ? ? 4.重復步驟2和3直到數字全部取完;
? ? ? ? ? ? 5.從步驟3取出的數字序列便是一個打亂了的數列。
? ? ? ? ? ?時間復雜度為O(n*n),空間復雜度為O(n).
2.換牌(原地打亂順序):
? ? ? ? ? ? ?1. 建立一個數組大小為 n 的數組 arr,分別存放 1 到 n 的數值;
? ? ? ? ? ? ?2. 生成一個從 0 到 n - 1 的隨機數 x;
? ? ? ? ? ? ?3. 輸出 arr 下標為 x 的數值,即為第一個隨機數;
? ? ? ? ? ? ?4. 將 arr 的尾元素和下標為 x 的元素互換;
? ? ? ? ? ? ?5. 同2,生成一個從 0 到 n - 2 的隨機數 x;
? ? ? ? ? ? ?6. 輸出 arr 下標為 x 的數值,為第二個隨機數;
? ? ? ? ? ? ?7. 將 arr 的倒數第二個元素和下標為 x 的元素互換;
? ? ? ? ? ? ? ? ……
? ? ? ? ? ? ?如上,直到輸出 m 個數為止
? ? ? ? ? ? ?時間復雜度為O(n),空間復雜度為O(1)
? ? ? ? ? ? 缺點必須知道數組長度n.原始數組被修改了,這是一個原地打亂順序的算法,算法時間復雜度也從Fisher算法的 O(n2)提? ? ? ? ? ? ? 升到了O(n)。由于是從后往前掃描,無法處理不知道長度或動態增長的數組。
3.插牌(蓄水池抽樣):??
? ? ? ? ? 1.先選中第1到k個元素,作為被選中的元素。然后依次對第k+1至第N個元素做如下操作:
? ? ? ? ? 2.每個元素都有k/x的概率被選中,然后等概率的(1/k)替換掉被選中的元素。其中x是元素的序號。
? ? ? ? ??從N個元素中隨機等概率取出k個元素(洗牌發牌可以認為k=1),N長度未知。在o(n)時間內對n個數據進行等概率隨機? ? ? ? ? ? 抽取。如果數據集合的量特別大或者還在增長(相當于未知數據集合總量),該算法依然可以等概率抽樣.
總結
- 上一篇: 招行信用卡对比 YOUNG卡与标准信用卡
- 下一篇: Apollo进阶课程㉝丨Apollo R