三種經典的洗牌演算法

2021-09-28 06:54:00 字數 1043 閱讀 7671

主要有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個資料進行等概率隨機            抽取。如果資料集合的量特別大或者還在增長(相當於未知資料集合總量),該演算法依然可以等概率抽樣.

三種洗牌演算法shuffle

由抽牌 換牌和插牌衍生出三種洗牌演算法,其中抽牌和換牌分別對應fisher yates shuffle和knuth durstenfeld shhuffle演算法。最早提出這個洗牌方法的是 ronald a.fisher 和 frank yates,即 fisher yates shuffle,其基...

JS洗牌演算法的三種實現

function washcard1 cards return cards function washcard2 cards cards cardstmp return cards function washcard3 cards return cards var cards newarray 54...

經典演算法 約瑟夫環問題的三種解法

約瑟夫環問題,這是乙個很經典演算法,處理的關鍵是 偽鍊錶 問題描述 n個人圍成一圈,從第乙個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈 如此往復,直到所有人出圈。模擬此過程,輸出出圈的人的序號 在資料結構與演算法書上,這個是用鍊錶解決的。我感覺鍊錶使用起來很麻煩,並且這個用...