最好最坏和平均情况下的性能分析
最好最壞和平均情況下的性能分析
現在有一個問題,對于所有的輸入來說,前面得到的結果是否都成立呢?第二種排序法在少量字符串的時候性能也許是最好的。但是,輸入數據有很多地方可能變化:
輸入數據可能有1 000 000個字符串。算法如何處理如此大規模的數據?
輸入數據可能會是部分有序狀態,也就是說,幾乎所有的元素所在的位置離最終位置并不是很遠。
輸入數據可能包含重復的值。
無論輸入數據的規模n是多少,輸入數據都可以從一個小得多的數據集擴展而來,不過會有相當多的重復值。
雖然從圖2-2上來看,第四種排序法在排序n個亂序字符串的時候是最慢的,但是處理已經排序的數據卻是最快的。但是,隨著n的增長,第四種排序法的領先優勢消失得非常快,我們從圖2-3上可以看到,在對16個亂序的字符串進行排序時,第四種排序法就已經失去領頭羊的位置了。
| ? |
| ? |
盡管如此,假設一個包含n個字符串的輸入,并且這個輸入已經是幾乎有序,其中n/4個字符串(占總字符串的25%)被交換到僅僅是離最終位置4個元素。最終結果如圖2-4所示,我們看到第四種排序法性能表現遠遠好于其他的排序算法。
| ? |
我們得到這樣一個結論,對于許多問題來說,并不存在單一的最優算法。選擇一個算法需要對問題有著充分的理解,并知道這個問題將要處理數據規模的概率分布情況,還有算法的實際行為也必須要考慮到。
在這里我們提供一些指導,算法通常會分成三種情況進行分析:
最壞情況
定義一類輸入,在這類輸入下,算法表現出了最壞的運行性能。算法設計人員需要明白,這類輸入的共同性質阻止了算法高效地運行,而不只是針對特定的輸入。
平均情況
平均情況是表示算法在隨機給定的數據上期望的執行情況。通俗地說,一些輸入可能會在某些特殊情況下耗費程序大量的時間,但是大部分的輸入并不會這樣。這個衡量標準描述了用戶對算法性能的期望。
最好情況
定義一類輸入,算法在這類輸入下表現出了最好的運行性能。對于這類輸入來說,算法只進行很少的計算。不過在實際情況下,最好情況很少出現。
通過分析三種情況,大致了解了算法的性能,那么接下來你需要為將要面臨的問題選擇一個算法。
最壞情況
大多數問題都可能會處理一些比n大的數據。任意給定一個n,算法或者程序在處理所有規模為n的數據,其性能可能會動態地發生變化。給定一個程序和n,這個程序的最壞運行時間就是處理所有規模為n的數據所需要的最長運行時間。
我們也看到,最壞情況是對整個世界的一個悲觀的分析。但是我們還是非常關注最壞情況,因為:
追根刨底的欲望
這通常是對一個算法復雜度的最早的分析。
實際運行時的限制
如果你需要設計一個系統,協助外科醫生進行體外循環心臟手術,那么長時間的運行(即使這種情況是不經常發生)當然不可能接受。
更正式地說,如果Sn是數據集合si中規模為n的子集,t表示算法在每一份數據上的運行時間,那么最壞情況下,對于所有si∈Sn,算法在Sn上的運行時間是t(si) 的最大值。我們將在Sn下的最長時間記做Twc(n),Twc(n) 的增長率表示算法在最壞情況下的復雜度。
一般來說,沒有足夠的資源來計算每一份數據si,然后檢查算法在哪份數據上表現最壞。于是,給定算法的描述,算法分析人員總是想方設法地精心準備可能會導致最壞情況的輸入數據。
平均情況
現在要設計一個支持n個電話的電話系統,n是一個非常大的數目,要求在最壞情況下,即n/2位用戶同時呼叫另外n/2位用戶時,這個系統也能夠正確地處理數據。雖然這個系統不會由于過載而崩潰,但需要花費過高的代價構造這樣的情況。而且,n/2位用戶同時呼叫另外n/2位用戶發生的概率極小。也許可以設計一個花費較小的系統在過載的情況下很少會(或者從不)崩潰。但是我們還是必需借助數學工具來計算這個概率問題。
對于一個n個樣本的數據集合,我們用一個概率分布Pr表示樣本的出現概率,單個樣本的出現概率為0到1,所有樣本的概率的和為1。如果Sn是n個樣本的數據集合,那么:
| ? |
如果t表示算法在單個樣本的執行時間,那么在Sn上的平均運行時間是:
| ?? |
也就是說,在樣本si的實際執行時間,t(si) 將會與概率加權。如果Pr{si}=0,那么t(si) 的實際值將不會影響程序的期望運行時間。我們用Tac(n) 表示算法在Sn上的平均運行時間,那么Tac(n) 的增長率表示算法在平均情況下的復雜度。
回憶一下,當我們描述時間或者工作量的增長率時,我們一直忽視了常數,所以我們認為順序搜索n個元素的平均情況為:
| ?? |
探測(符合我們之前的假設),按照慣例,在符合這些假設的前提下,期望順序搜索能夠處理線性或者是n階的元素。
最好情況
知道算法的最好情況是非常有用的,即便這種情況很少發生。在很多情況下,最好情況能讓我們看到算法的最優狀況。例如,線性搜索的最好情況是當它在n個元素中搜索v的時候,第一個元素恰好就是要找的那個。一個稍微有些不同的算法,我們叫做計數搜索(Counting Search),在n個元素中搜索v,并且記錄v在表中出現的次數。如果v的計數是0,那么這個值是不存在的,所以會返回false,否則返回 true。注意,計數搜索總是會搜索整個表,因此,它的最壞情況是O(n)(和順序搜索一樣),最好情況還是O(n),所以我們不能夠使用這個算法,因為它的最好或者平均情況沒有改善性能。
總結
以上是生活随笔為你收集整理的最好最坏和平均情况下的性能分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 捉虫记---查看变量,整数转浮点
- 下一篇: openMP 并行编程 基础