1.隨機化輸入
在快速排序演算法的使用中,發現其效能是不穩定的,它的速度取決於輸入情況,最好的情況下複雜度為o(nlogn),最壞情況下為o(n^2).
最簡單的優化方法是隨機化輸入,打亂輸入陣列順序,這樣可以將不良輸入帶來低劣效能的可能性降到最低,對於**演算法的執行時間是十分重要的。
考慮到,在c++中std標準庫已有random_shuffle函式,其他語言也有類似方法,但c#並沒有此標準函式,這樣我索性自己實現乙個。
設計:這裡按照最簡單的o(n)來設計,需要n次交換,實現起來無疑很簡單。
實現:
publicclass
randomshuffle
return
a; }
}
總結:這裡使用迭**起來會更簡潔明瞭,但是大規模的迭代會導致執行緒棧stackoverflowexception,所以使用迴圈會更安全。
2.計時器
衡量乙個演算法的效能主要有兩個方面:執行時間與記憶體效能。演算法分析中,執行時長是乙個很重要的衡量指標,但準確測量給定程式的執行時長時間很困難的事情,不過幸運地是我們只需要近似的結果就可以了。
我們可以使用系統api來實現乙個精度尚可的計時器,可以幫助我們驗證演算法的速度。
設計:設計乙個stopwatch類,它的elapsedtime()方法能夠輸出程式執行時間。它的實現基於.net框架的datetime類,能返回以毫秒/秒計數的結果。
實現:
publicclass
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 前為產生...