新聞中心
標(biāo)準(zhǔn)庫中的sort函數(shù),是快速排序算法的典型實(shí)現(xiàn)。算法將含有n個元素的序列排序,平均需要 O(n log n) 時間。

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、槐蔭網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為槐蔭等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
上周,我提出了“測試一個程序的性能比測試其功能更難”這個觀點(diǎn)。確認(rèn)程序的性能達(dá)到標(biāo)準(zhǔn)以及確定“標(biāo)準(zhǔn)”的含義都十分困難。
接下來,我會繼續(xù)討論標(biāo)準(zhǔn)庫中的sort(排序)函數(shù)。sort函數(shù)實(shí)現(xiàn)了快速排序算法,快速排序算法平均可以在 O(n log n) 時間內(nèi)對含有n個元素的序列進(jìn)行排序。除了這個平均性能之外,如果選擇了“不幸”的輸入情況,快速排序的運(yùn)行時間會比平均時間長很多,比如,某些情況下快速排序的時間復(fù)雜度可以達(dá)到O(n2)。我使用“不幸”這個詞是因?yàn)樵诳焖倥判虻膶?shí)現(xiàn)中經(jīng)常使用隨機(jī)性的來保證O(n2)這樣的性能表現(xiàn)很少出現(xiàn)。
為什么隨機(jī)性在這里很重要呢?快速排序算法開始時挑選序列中的一個特定元素開始排序,叫做pivot(中心數(shù)據(jù))。然后,快速排序算法調(diào)整元素的順 序,使得小于等于中心數(shù)據(jù)的元素位于中心數(shù)據(jù)的前面,所有大于中心數(shù)據(jù)的元素排在中心數(shù)據(jù)的后面。最后,快速排序算法遞歸調(diào)用,來完成對這兩部分元素的排 序
因此,快速排序的執(zhí)行時間,最壞情況下與元素個數(shù)對應(yīng)的最大遞歸深度成比例。在實(shí)現(xiàn)中,依賴于遞歸深度的快速排序的性能,一般不會大于O(log n)。只要中心數(shù)據(jù)選定,遞歸深度就可以估計(jì)。平均情況下,這個深度與最大或最小元素的值無關(guān)。
快速排序算法是怎樣確保選定的中心數(shù)據(jù)不是很接近序列的端點(diǎn)呢?一般來看,這是無法保證的。盡管如此,大部分情況下可以采用隨機(jī)選取中心數(shù)據(jù)的方法,來避 免出現(xiàn)最壞情況。這樣做可以保證快速排序算法的平均性能是可以接受的,即使在個別情況下,中心數(shù)據(jù)會出現(xiàn)在序列的端點(diǎn)位置,從而導(dǎo)致算法性能低下。由于這 樣的情況非常少見,對于平均性能來說它不是一個大問題。對嗎?
這要視情況而定。假設(shè),你的任務(wù)是編寫性能測試程序,來測試快速排序的實(shí)現(xiàn)。
- 你怎樣將c++標(biāo)準(zhǔn)中模糊的“平均性能”,改寫為實(shí)際需求,從而可以測試所有情況?
- 你以怎樣的方式來測試快速排序,這樣的方式可以保證測試結(jié)果正確可靠?
測試平均性能之所以困難,是因?yàn)樵谶@個概念中一個概率的因素。如果,程序最終必須產(chǎn)生一個特定結(jié)果,那么,你可以確定一個測試程序的運(yùn)行結(jié)果是正確 還是錯誤。相反,如果你在測試平均性能,那么對于一個單獨(dú)的測試用例,無法判斷運(yùn)行結(jié)果是否正確。最好情況是,通過運(yùn)行越來越多的測試用例,你可以更有把 握程序是否正確運(yùn)行。在這個測試的過程中,更多的測試可能會改變你對于程序正確性的判斷。
簡而言之,如果性能中包括了關(guān)于平均執(zhí)行時間的描述,那么相應(yīng)的測試需要用到一些統(tǒng)計(jì)分析。這樣的分析并不簡單,但是這是工程應(yīng)用的傳統(tǒng)。美國航空191號班機(jī)的空難就 是一個例子。191號班機(jī)在1979年5月25日從奧黑爾國際機(jī)場起飛。當(dāng)飛機(jī)剛剛離開地面時,飛機(jī)左翼引擎忽然失靈并且從機(jī)翼上脫落。引擎是通過安全銷 連接在機(jī)翼上的,這樣的設(shè)計(jì)是為了與機(jī)翼脫離而不是毀壞機(jī)翼。盡管如此,由于維護(hù)失誤,機(jī)翼被毀,導(dǎo)致飛機(jī)失控,發(fā)生空難,機(jī)上所有人無一幸免。
在閱讀相關(guān)的調(diào)查中,我看見了不同的飛機(jī)制造商對安全銷進(jìn)行的測試,證明— 假設(shè)飛機(jī)正常維護(hù) — 安全銷會使得引擎離開機(jī)翼而不是毀壞機(jī)翼。在此之前,我沒有見到過這樣的測試,但是設(shè)計(jì)安全銷在工程商的主要問題是:安全銷的目的是,受到過大壓力時,使 引擎和機(jī)翼脫落。沒有辦法在安全銷不被破壞的情況下測試安全銷是否滿足要求。因此,在飛機(jī)中實(shí)際使用的安全銷不能檢測。
人們怎樣才能確保使用這樣生產(chǎn)的安全銷不會影響飛機(jī)的安全性呢?答案設(shè)計(jì)非常聰明。
- 引擎被許多個安全銷固定在機(jī)翼上,這樣即使有一個安全銷失靈,引擎也能從機(jī)翼上分離,而不損壞機(jī)翼。
- 安全銷以100個為一批進(jìn)行生產(chǎn),一個批次內(nèi)的安全銷同時以同樣的方式生產(chǎn)制造。
- 每個批次的100個安全銷中,會被隨機(jī)挑選10個進(jìn)行測試,因此,10個安全銷會在測試中毀壞。如果,10個安全銷都通過了測試,那么就認(rèn)為剩下的90個安全銷是安全可用的。如果10個中有一個安全銷沒有通過測試,那么這個批次都會被銷毀。
顯然,這樣的設(shè)計(jì)不僅僅包括了巧妙的工業(yè)設(shè)計(jì),也包含了精妙的統(tǒng)計(jì)分析。必須準(zhǔn)確選擇對安全銷的限制條件,在10%的安全銷已經(jīng)通過測試的條件下, 即使兩個隨機(jī)選取的安全銷也幾乎不可能超出限制條件。我推測,這樣的限制條件可能是比實(shí)際應(yīng)用中安全銷需要滿足的限制條件更窄的范圍。
我不想為了評估快速排序算法的平均性能而進(jìn)行這樣的統(tǒng)計(jì)分析。即使我有信心可以正確地進(jìn)行類似的統(tǒng)計(jì)分析,將來可能出現(xiàn)的規(guī)范或者測試程序的改變, 都會使這樣的分析無效。同時,在以快速排序?yàn)槔乃惴ǎ鸵园踩N為例的機(jī)械設(shè)備之間有一個重要區(qū)別,那就是,有時為了達(dá)到某些目的,算法的輸入會被設(shè)計(jì) 的非常復(fù)雜。比如在Doug McIlroy 1999年寫的論文中,詳細(xì)描述了怎樣構(gòu)造快速排序的輸入,使得算法對于n個元素的排序時間達(dá)到O(n2)。在這樣的情況下,快速算法就與描述不符了嗎?如果是這樣,那么就很難看見我們現(xiàn)在對快速算法的應(yīng)用了。
使得這樣的性能測試問題簡單化的一個方法是采用白盒測試的方法。白盒測試的方法利用了已知程序?qū)崿F(xiàn)細(xì)節(jié)這一優(yōu)勢。下周,我會詳細(xì)介紹這樣的測試技術(shù)。
分享標(biāo)題:怎樣測試程序的平均性能
鏈接分享:http://m.fisionsoft.com.cn/article/dhhospj.html


咨詢
建站咨詢
