算法導論--在平均線性時間下選擇元素

一般的選擇問題比簡單的選擇最小值要難的多。但是,隨着n的增大,它們所消耗的時間都是O(n)。這一次我們介紹一個基於分治法的算法來解決這個問題,叫做隨機選擇算法,英文名叫,RANDOMIZED-SELECT。這個算法跟快速排序很像,只不過它只在一邊執行partition算法。這個區別導致這樣的分析:蘇日安快速排序的時間複雜度是O(nlgn),但是RANDOM-SELECT算法的平均時間是O(n),在元素都是互不相同的假設下。
RANDOMIZED-SELECT 用RANDOMIZED-PARTITION程序。就像隨機化快速排序,這是一個隨機化的算法。因爲它的部分行爲是基於一個隨機數產生器產生的隨機數的。以下的僞代碼返回i th smallest, 即是第i小的元素,在一個數組裏。

這裏寫圖片描述

來解釋以下:
第1-2行:這裏是遞歸的返回條件之一,當A[p…r]之間包含的只有一個元素的時候,這種情況下,i == 1, 並且我們在第2行就直接返回A[p],就是i th smallest 元素。
第3行:調用隨機化partition算法,這時候A[p…q-1]小於等於A[q],並且A[q+1….r]大於A[q]。就像快速排序,我們將A[q]命名爲pivot元素
第4行:計算子數組A[p..q]的元素個數k
第5行:檢查A[q]是否是i th smallest元素,如果是,就直接返回A[q],否則的話,算法需要決定i th smallest元素在哪個子數組裏,A[p…q-1]或者是A[q+1….r]
第7-9行:判斷我們想要的元素在哪個子數組,然後遞歸執行。

時間複雜度:最壞情況下這個算法的時間複雜度是O(n^2),也就是我們特別倒黴,每次劃分都劃分出了最大的剩下的元素。但是平均情況下,這個算法有着線性的複雜度O(n),這裏就不證明了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章