《演算法導論》筆記系列之第九章中位數和順序統計量

2021-07-27 23:34:21 字數 2187 閱讀 9634

在乙個由n個元素組成的集合中,第i個順序統計量,是該集合中第i小的元素。

9.1討論了陣列的最小值和最大值。

如果要找出陣列的最小值,可以通過至多n-1次比較得出。最大值相同。

但若要求同時找出最大值和最小值呢?可以採用9.1介紹的方法。

就是不是將元素與最小值或最大值相比,而是將陣列的元素成對處理,先將兩個元素相比,然後將較大的與當前的最大值比較,將較小的元素與當前的最小值相比較。這樣每2個元素就只需要3次比較。

總的比較次數,如果n是偶數,需3 * (n-2)/2次比較。

若n為奇數,則將最大值和最小值的初始化都設定為第乙個元素。則需3 * (n-1)/2次比較。

關於期望時間為線性時間,最壞時間為o(n^2) 的選擇演算法,書中給出了非常嚴謹的說明與證明。

這裡不再贅述。

我得到的啟發是:

從快速排序。到期望時間為線性時間的選擇演算法。主要是抽取出了partition操作,然後通過partition將陣列分為大於pivot和小於pivot兩個部分,來確定次序關係。每次捨棄一部分,將查詢範圍縮小。縮小操作範圍的演算法操作,我現在所了解的還有二分法。而希爾排序事實上是改進的插入排序。堆排序可惜看到一些希爾排序的影子,也有選擇排序的相似的操作。 如果將演算法拆分來看的話,其實是一步一步的操作,每一步的操作都有其思想蘊含其中。

具體演算法來說,不同的排序演算法,是不同的排序方法,氣泡排序,就是最基礎的排序玩法,依次將陣列中的最大值,第2大值,第3大值。。。找出來,就完成了排序。接著是插入排序,模擬平時打紙牌,將陣列分成已排序,未排序和正在排序三部分。將正在排序的插入到已排序的部分中。其實,除了希爾排序的優化方式以外,也可以針對插入操作,對插入排序進行優化。就是將原來的每次新元素,都要進行o(n)次比較,變為使用二分查詢來找到新元素該在的位置,將此步驟的時間縮短為o(lgn)也是一種優化方法。

這是最基礎的排序解法。

還有方法是,我們可以將已經排好序的兩個陣列合併成乙個陣列,合併成的新陣列,也是有序的。這就是歸併排序。

還有,既然插入排序,每次新元素向前移動乙個元素太慢,我們可以讓他前移的步伐加大,這就是希爾排序、二分插入排序。

或者,我們不採用那樣確定的方法,每次只確定把陣列分成是兩個部分,只確定前半部分的元素必小於後半部分的元素,但部分內的元素不一定有序。這樣持續劃分下去,陣列終將成為2個元素的小陣列,前半部分和後半部分各含有乙個元素,再向上遞迴返回,同樣也將陣列排好了序。

以上這些演算法,經證明,時間複雜度的上限是o(nlgn),那麼有沒有可能突破這個上限呢??思考思考思考、發現這些演算法都有乙個共同特點就是需要對元素進行無數次比較來確定次序。如果使用書中的決策樹的方法證明的話,可以很直觀的證明比較排序的時間上限就是o(nlgn),因此,若要突破該上限,就必須要去掉,比較這一步驟。

找靈感時,就會發現排序都是基於數字的,再從數字角度考慮的話,就很容易考慮到桶排序和計數排序。這是後話。

以上這些演算法有沒有一些共同點呢?可以發現,伴隨著演算法時間的改善,我們利用了越來越多的陣列中元素的特性,比如,剛開始時,氣泡排序是不管陣列元素是怎樣的,我只管乙個乙個找出要找的元素就可以了。插入排序也是如此。再提公升乙個複雜度級別的演算法,則在此基礎上,給了陣列元素很多假定,假如陣列是兩個已排好序的部分會怎樣?假如陣列一部分必小於另一部分,會怎樣?再提公升時間效能的演算法,就再次假定,我們只管陣列元素全是數字的情況,既然是數字,就可以為所欲為了。我們可以按照個、十、百、千。。。一位一位的進行比較(桶排序)。我們也可以計算下小於該元素的有幾個元素(計數排序)等等。也就是說,我們想要更加精確的獲得想要的資訊,就必須增加我們的輸入資訊。這個結論是最近看機器學習的演算法時,看到資訊熵的概念。想到的。

再接下來,我們將此思想進行一些應用。

如果要獲取陣列中第i大的元素,若是尋常方法,就要進行比較操作。但這樣必然會導致o(nlgn)的執行時間。而且本要求第i大的元素,把整個陣列都排序了,有點費力不討好的嫌疑。有沒有更好的演算法呢?

這時想起,增加我們的輸入。我們可以假定一些陣列的基本情況。比如陣列沒有排好序,但是至少有一部分與另一部分的大小情況可以掌握。這不就想到了快速排序的partition了嗎?這就是本章中的期望時間為線性時間的選擇演算法了。證明略。那麼還有沒有更快的演算法呢?對,我們再輸入資訊,比如,我們已經找到了陣列的中位數。這樣也是可以確定第i大的元素在哪一半了。再詳細擴充套件一下,便是本章中第3節,最壞時間為線性時間的選擇演算法。

若要問,該演算法,還有沒有更好的方案?我說,有。一定有。只要我們可以再對輸入元素進行假定。比如,我們確定了陣列中的第i-1大的元素。對此思想方向延伸,必然可以繼續對第三節的演算法進行優化。

演算法導論 第九章

這章介紹了中位數和順序統計學 中位數即乙個序列中最中間的數字,在快速排序中非常有意義,在其它的一些應用中也很有效,因為可以2分序列,這樣會有更好的效率。這章主要介紹如何不排序來找到序列的順序,由於不需要排序,可以減少很多比較的操作,最終可以獲得一些線性的演算法,得到排名第i的數字。演算法的基礎是首先...

演算法導論第九章 中位數和順序統計量

9.1 最小值和最大值 遍歷陣列,線性時間求最小值 int minimun int a 兩兩相比,3n 2次比較即可求最小值和最大值 void minandmax int a,int min,int max 如果n是偶數 else 成對地處理餘下的元素 for i length a i i 2 9....

演算法導論 第九章 中位數和順序統計量

def 第i個順序統計量,是該集合中第i小的元素。def 選擇問題 輸入,乙個包含n個數的集合a,和乙個整數i,1 i n。輸出,元素x屬於a,且a中恰好有i 1個其他元素小於它。9.1 最大值和最小值 尋找乙個陣列中的最大值和最小值需要經過n 1次比較找到 def minimum a mini a...