c語言實現磁碟排程演算法 C語言實現洗牌演算法

2021-10-17 08:28:01 字數 2000 閱讀 4236

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

math.random() * 100,就可以拿到乙個 0 到 99 的隨機數,是不是重複50次就可以了?當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出50個不重複的數的話,隨機次數遠遠大於50,因為越到後面隨機到的數與前面選出的數重複的概率越大。

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

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

fisher-yates洗牌演算法是由 ronald a.fisher和frank yates於2023年發明的,後來被knuth在書中介紹,很多人直接稱knuth洗牌演算法, knuth大家應該比較熟悉,《the art of computer programming》作者,演算法理論的創始人。我們現在所使用的各種演算法複雜度分析的符號,就是他發明的。

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

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

4被抽中的概率是1/5

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

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

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

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。

**

void knuth_durstenfeld_shuffle(vector&arr)

}

洗牌演算法生成雷區

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

生成的雷區圖

點【在看】是最大的支援

(C語言實現)磁碟排程 掃瞄尋道演算法(SCAN)

一 設計目的 加深對請求磁碟排程管理實現原理的理解,掌握磁碟排程演算法中的掃瞄尋道演算法。二 設計內容 通過程式設計實現磁碟排程中掃瞄尋道演算法。設定開始磁軌號尋道範圍,依據起始掃瞄磁軌號和最大磁軌號數,隨機產生要進行尋道的磁軌號序列。選擇磁碟排程演算法,顯示該演算法的磁軌訪問順序,計算出移動的磁軌...

C語言實現遞迴演算法

c語言實現遞迴演算法 遞迴演算法是運用於函式呼叫中的。遞迴的概念 在乙個函式體內呼叫自身稱為函式的遞迴呼叫。遞迴呼叫的原理 需要在函式內滿足一定的條件後不在呼叫自身或者結束,或者呼叫其它函式,否則容易出現類似死迴圈的情況,程式將癱瘓。已知 f 1 1 f 0 0,fn n f n 1 f n 2 求...

演算法C語言實現 一

程式3 5 厄拉多塞篩 從1到n,如果查詢到乙個數a是素數,那麼將2 a,3 a,m a m a 質數,又稱為素數,指在乙個大於1的自然數中,除了1和此整數自身外,不能被其他自然數整除的數。include define n 10000 main for i 2 i n i for i 2 i n i...