演算法手記附1 隨機化輸入與計時器

2022-01-20 13:41:18 字數 967 閱讀 3362

1.隨機化輸入

在快速排序演算法的使用中,發現其效能是不穩定的,它的速度取決於輸入情況,最好的情況下複雜度為o(nlogn),最壞情況下為o(n^2). 

最簡單的優化方法是隨機化輸入,打亂輸入陣列順序,這樣可以將不良輸入帶來低劣效能的可能性降到最低,對於**演算法的執行時間是十分重要的。

考慮到,在c++中std標準庫已有random_shuffle函式,其他語言也有類似方法,但c#並沒有此標準函式,這樣我索性自己實現乙個。

設計:這裡按照最簡單的o(n)來設計,需要n次交換,實現起來無疑很簡單。

實現:

public

class

randomshuffle

return

a; }

}

總結:這裡使用迭**起來會更簡潔明瞭,但是大規模的迭代會導致執行緒棧stackoverflowexception,所以使用迴圈會更安全。

2.計時器

衡量乙個演算法的效能主要有兩個方面:執行時間與記憶體效能。演算法分析中,執行時長是乙個很重要的衡量指標,但準確測量給定程式的執行時長時間很困難的事情,不過幸運地是我們只需要近似的結果就可以了。

我們可以使用系統api來實現乙個精度尚可的計時器,可以幫助我們驗證演算法的速度。

設計:設計乙個stopwatch類,它的elapsedtime()方法能夠輸出程式執行時間。它的實現基於.net框架的datetime類,能返回以毫秒/秒計數的結果。

實現:

public

class

stopwatch

public

void

elapsedtime()

else

console.writeline(

"time:

" + time + "ms"

); }

}

總結:這樣的計時器雖然精度不高,但是足以用來簡單地評估演算法的效能了。

隨機化演算法

隨機化演算法的主要目的是希望讓隨機發生在演算法上,而不是發生在輸入分布上,這樣的話,沒有特別的輸入會引起我們的演算法的最壞情況。即使你最壞的敵人也無法產生最壞的輸入陣列。因為隨機排列使得輸入次序不再相關。只有在隨機數生成器產生乙個不走運的排列時,隨機演算法才會執行得很差。一.隨機優先順序陣列法 我們...

隨機化演算法基礎

隨機化演算法在分析某些涉及概率分析的問題上具有重要意義,因為輸入的分布是我們不能預知的,我們想讓分析的問題達到乙個平均的狀態,就得依靠隨機化,把輸入分布重新排列,使之成為乙個脫離其他外界因數的排列,同時要保證出現這個排列的概率為1 n 下面,有兩個常用的演算法來實現輸入分布的隨機化,以給定的輸入陣列...

c語言 隨機化演算法

srand unsigned int time null 若不隨機則生成的都為1 相同值 做產生隨機數的種子 x double rand rand max rand 後若為 則是隨機生成0 1之間的數 若為 則是生成0 rand max之間的數 rand max為最大值32767 rand 前為產生...