日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三种经典的洗牌算法

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三种经典的洗牌算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考原文鏈接: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個數據進行等概率隨機? ? ? ? ? ? 抽取。如果數據集合的量特別大或者還在增長(相當于未知數據集合總量),該算法依然可以等概率抽樣.

總結

以上是生活随笔為你收集整理的三种经典的洗牌算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。