Fisher-Yates洗牌算法!來自算法理論的創始人!

2021-01-19 騰訊網

引言

首先看一道題目:有一個大小為100的數組,裡面的元素是從 1 到 100,隨機從數組中選擇50個不重複數。

用 Math.random() * 100 ,就可以拿到一個 0 到 99 的隨機數,是不是重複50次就可以了?

當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出50個不重複的數的話,隨機次數遠遠大於50,因為越到後面隨機到的數與前面選出的數重複的概率越大。

怎麼解決呢?大家都玩過或見過發牌,54張牌,發一張牌,發牌人手裡就少一張,直至將所有牌都發完。

同樣上面的問題也可以這樣解決,第一次隨機到一個數後,將這個數取出來,再從剩下的99個數字裡隨機取出第二個數,這樣隨機50次取出的書就不會重複,這就是今天的主題:洗牌算法

洗牌算法

Fisher-Yates洗牌算法是由 Ronald A.Fisher和Frank Yates於1938年發明的,後來被Knuth在書中介紹,很多人直接稱Knuth洗牌算法, Knuth大家應該比較熟悉,《The Art of Computer Programming》作者,算法理論的創始人。

我們現在所使用的各種算法複雜度分析的符號,就是他發明的。

等概率:洗牌算法有些人也稱等概率洗牌算法,其實發牌的過程和我們抽籤一樣的,大學概率論講過抽籤是等概率的,同樣洗牌算法選中每個元素是等概率的。

用洗牌算法思路從1、2、3、4、5這5個數中,隨機取一個數

第一次隨機抽取到4這個元素

4被抽中的概率是1/5

第二次隨機抽取到5這個元素

5被抽中的概率是1/4*4/5=1/5

第三次隨機抽取到2這個元素

2被抽中的概率是1/3*3/4*4/5=1/5

第四次隨機抽取到1這個元素

1被抽中的概率是1/2*1/3*3/4*4/5=1/5

第五次隨機抽取到3這個元素

3被抽中的概率是1*1/2*1/3*3/4*4/5=1/5

時間複雜度為O(n*n),空間複雜度為O(n)

算法思路:

在上面的介紹的發牌過程中, Knuth 和 Durstenfeld 在Fisher 等人的基礎上對算法進行了改進,在原始數組上對數字進行交互,省去了額外O(n)的空間。

該算法的基本思想和 Fisher 類似,每次從未處理的數據中隨機取出一個數字,然後把該數字放在數組的尾部,即數組尾部存放的是已經處理過的數字。

在54張牌中隨機選一張,將這張牌與第一張交換順序

在剩下的53張中繼續隨機選取一張與第二張牌進行交換

直至最後一張。

時間複雜度為O(n),空間複雜度為O(1),缺點必須知道數組長度n。

代碼:

洗牌算法生成雷區:

將排列好的雷,用洗牌算法打亂生成雷區圖

生成的雷區圖:

相關焦點

  • 理論計算機有哪些特別的算法,它們的算法複雜性很高嗎?
    理論計算機作為現代計算機體系結構的一個分支,其算法與複雜性是理論計算機中最核心、最基礎的主題。下面是小編關於一些關於理論計算機算法的資料心得,與大家分享。1.怎樣定義一個算法是快速有效的?它的定義是,在漸近意義下最壞情況算法的運行時間總是不超過問題輸入規模的一個多項式函數。選擇一個多項式函數的基本標準是:當問題的規模增加一倍時,其運行時間也只是常數倍增加。從數學上講,這個多項式函數類的性質應比較好。比如算法A的輸入來自算法B的結果,如果算法A、算法B都是多項式時間的,則A和B的複合函數也是多項式時間的。
  • 史上最全GAN綜述2020版:算法、理論及應用
    時至今日,基於 GAN 設計的新型算法如雨後春筍般紛紛湧現了出來、對於 GAN 存在的模式坍塌和收斂性等理論問題的深入分析層出不窮,其應用也廣泛滲透到了諸如計算機視覺、自然語言處理、醫療人工智慧等領域中。本文是一份出自陶大程、葉傑平老師等大牛之手的 GAN 詳細綜述,介紹了近年來有關 GAN 模型的相關研究進展,並指出了今後該領域的發展方向。
  • 算法下的選擇讓渡,你被算法裹挾了嗎?
    但不論是大數據還是人工智慧,都依託算法而存在,我們正在走進的數字世界本質上則是數據驅動的算法應用。當算法充斥於我們的生活,又在細微處改變著我們對信息的接收、對產品的需求以及情緒與狀態時,卻少有人關心算法最終會對我們產生的影響。事實上,以算法為導向的思維模式,正在迅速地蔓延到自然科學和社會科學的所有領域,並滲透到我們日常生活的各個方面。
  • 算法穩定幣深度分析:從AMPL,Basis等看算法穩定幣的機會與不足
    然而,實際上,供應變化通常會自發地放大方向動量(4),特別是對於不遵循「鑄幣稅股份」模型的算法模型,即通過將穩定幣代幣與價值產生代幣和債務融資代幣分離開來。對於非算法穩定幣,網絡引導不涉及博弈論的協調。每個穩定幣(至少在理論上來說)可兌換等值的美元或其他形式的抵押品(5)。相比之下,算法穩定幣的成功價格穩定性完全無法保證,因為它完全由集體市場心理決定。
  • 樂透彩算法
    主要是概率理論基礎。K線借用股票的K線名詞,但用法完全不一樣。股票K線主要判斷股份的轉折點和上漲下跌幅度,而彩票主要判斷下期出號範圍。所以大家不要被股市的算法誤導。下面說具體算法:1.選定一個起點(當前開獎期次的前N期),確定你要分析的指標,如位、號、和、合、跨、單雙、大小、質偶、AC……2.統計這個指標的N期平均數=V。
  • 短小精悍的多源最短路徑算法—Floyd算法
    在圖論中,在尋路最短路徑中除了Dijkstra算法以外,還有Floyd算法也是非常經典,然而兩種算法還是有區別的,Floyd主要計算多源最短路徑。在單源正權值最短路徑,我們會用Dijkstra算法來求最短路徑,並且算法的思想很簡單——貪心算法:每次確定最短路徑的一個點然後維護(更新)這個點周圍點的距離加入預選隊列,等待下一次的拋出確定。但是雖然思想很簡單,實現起來是非常複雜的,我們需要鄰接矩陣(表)儲存長度,需要優先隊列(或者每次都比較)維護一個預選點的集合。
  • 陳根:算法下的選擇讓渡,你被算法裹挾了嗎?
    但不論是大數據還是人工智慧,都依託算法而存在,我們正在走進的數字世界本質上則是數據驅動的算法應用。當算法充斥於我們的生活,又在細微處改變著我們對信息的接收、對產品的需求以及情緒與狀態時,卻少有人關心算法最終會對我們產生的影響。
  • 算法到底算什麼?
    這個問題的提出,顯然來自於一個非常有力的直覺:如果法律人想要運用法律來介入算法,那麼他們必須要像了解法律的程度一樣了解算法;否則,即使事實上法律人介入了算法的領域,這不但無法避免盲目無知、法律人的傲慢之類批評,而且也會導致那個介入是無頭蒼蠅似的亂來。
  • 算法之「算法」:所有機器學習算法都可以表示為神經網絡
    隨後出現了一個又一個新算法,從邏輯回歸到支持向量機。但是眾所周知,神經網絡是算法的算法及機器學習的巔峰。我們可以說,神經網絡是對機器學習的普遍概括,而不是僅僅一次嘗試。與其說神經網絡是簡單的算法,不如說是框架和概念,這是顯而易見的,因為在構建神經網絡時有很大的自由度——比如對於隱藏層&節點個數、激活函數、優化器、損失函數、網絡類型(卷積神經網絡、循環神經網絡等)以及特殊層(批歸一化、隨機失活等)。如果把神經網絡看作是概念而非嚴格的算法,一個有趣的推論就應運而生了:任何機器學習算法,無論是決策樹還是k近鄰,都可以用神經網絡表示。
  • 圖的最短路徑算法-Floyd算法-弗洛伊德算法
    Floyd算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法 在計算機科學中,Floyd-Warshall算法是一種在具有正或負邊緣權重(但沒有負周期)的加權圖中找到最短路徑的算法。算法的單個執行將找到所有頂點對之間的最短路徑的長度(加權)。
  • RSA算法研究
    二、RSA算法 :它是第一個既能用於數據加密也能用於數字籤名的算法。它易於理解和操作,也很流行。算法的名字以發明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理論上的證明。
  • 算法機制對媒體社會責任的影響
    【導語】算法的中立策略,是一條修正媒體社會責任理論的新思路,儘管隨之而來也有許多新挑戰,但這並不會成為放棄中立性的理由,因為算法機制在媒體中的滲透已然成為不可逆轉的趨勢 越來越多的資訊聚合類客戶端運用算法機制進行新聞分發,這些沒有新聞採集製作資質、不做原創新聞而以算法推薦機制為主的新型信息分發平臺
  • 算法,即剝削
    本文從經濟學的角度,使用反壟斷理論、價格歧視及消費者剩餘理論,解釋和揭示「算法剝削」。本文邏輯:一、數據,即權力二、歧視,即壟斷三、算法,即剝削(正文約7000字,閱讀時間約30分鐘,感謝分享)數據,即權力這篇文章提到一個關鍵詞:時間失蹤。
  • 萬字長文詳解文本抽取:從算法理論到實踐
    本文是這兩次技術直播的內容總結,包括信息抽取傳統算法和前沿算法詳解、比賽介紹,以及比賽baseline模型代碼分析和改進建議。 在前半部分,達觀數據的聯合創始人高翔詳細講解了自然語言處理中信息抽取算法技術。在後半部分,達觀數據的工程師們分享並介紹了「達觀杯」文本信息抽取挑戰賽的baseline代碼以及改進建議。
  • 過度的熱點:一文看懂算法穩定幣的本質
    早在2014年就有學者發表了《哈耶克貨幣·加密貨幣價格穩定解決方案》和《關於加密貨幣穩定的報告:控制貨幣發行量》,而在2019年出現的算法穩定幣Ampleforth幾乎直接將上述學術理論進行了落地實踐,今年6月其代幣AMPL藉助DeFi進入行業視野,在2020年7月飆升至完全稀釋後的超10億美金市值,直至現在,由AMPL帶領的ESD、Ba se等暴漲行情重新洗牌交易榜單,令行業對AMPL
  • AI英雄 | 矽谷尤達大師高德納:算法領域的精神導師
    圖2-加利福尼亞理工學院,高德納1963年在這裡獲得博士學位或者,正如谷歌的傑出科學家安德烈布羅德(Andrei Broder)在會議上解釋的那樣:「我們希望為我們正在做的事情提供一些理論基礎。他們從來自瑞士數學家歐拉萊昂哈德·歐拉(Leonhard Euler)的有300年歷史的算法獲得靈感,歐拉想繪製一條穿越普魯士城市柯尼斯堡的路線,這條路線只穿過柯尼斯堡的七座橋各一次。高德納在他的專著的第一卷中論述了歐拉的經典問題。(他曾將歐拉方法應用於編碼讓計算機控制縫紉機。)遵循高德納的理論很有助益。
  • 算法是什麼:計算機領域中算法的科普
    所有這些都要感謝算法。每當你使用手機、計算機、筆記本電腦或計算器時,其實都在使用算法。那麼,什麼是算法?如果你想做數學運算,比如說兩個數字相乘(不使用任何電子設備),那麼你需要在紙上做乘法。你按照一定的規則獲得正確的答案。你也可以使用耗時更少的方法來做計算。這就是算法。算法是為執行特定的任務而設計的一組指令。
  • 對話雲天勵飛CEO陳寧:算法晶片化,不等於「算法+晶片」
    今年,在不到半年時間內,雲天勵飛完成了超20億元的融資,並於9月啟動上市輔導。這位長期活躍在圈內的技術派創始人不經意地走進大眾視野,他是從美國喬治亞理工學院電子工程系歸國創業的博士、中國第一款商用矢量處理器晶片設計者,實打實的晶片技術派。
  • 算法穩定幣應該改稱穩定算法幣丨DeFi+是什麼
    引言:算法穩定幣,或許叫「穩定算法幣」比較好,全稱叫「穩定算法型加密貨幣」,別和USDT\DAI\USDC混為一談,可以當做一個新物種。穩定算法型加密貨幣算法穩定幣,或許叫「穩定算法幣」比較好,別和USDT\DAI\USDC混為一談。可以當做一個新物種。算法穩定幣對標法幣的價格穩定性完全無法保證,因為它完全由集體市場心理決定。我說稱穩定算法幣,全稱是穩定算法型加密貨幣,本質是算法幣,不是穩定幣,更不是錨定幣。
  • 算法穩定幣應該改成穩定算法幣丨DeFi+是什麼
    引言:算法穩定幣,或許叫「穩定算法幣」比較好,全稱叫「穩定算法型加密貨幣」,別和USDT\DAI\USDC混為一談,可以當做一個新物種。DeFi+,做的是由服務或者商品的「供給-需求」組成的市場,而非金融資本市場,DeFi+是以DeFi為基礎設施的。