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

2021-08-02 11:50:48 字數 928 閱讀 1744

一般的選擇問題比簡單的選擇最小值要難的多。但是,隨著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),這裡就不證明了。

計數排序(線性時間排序) 演算法導論

之前的排序都是通過比較得到的,即比較排序 在排序的最終結果中,各元素的次序依賴與它們之間的比較。而時間複雜度最好的也是o nlgn 接下來說乙個未經比較的排序,而複雜度則是線性的。計數排序 假設n個輸入元素的每乙個都是在0 k區間內的乙個整數,其中k為某個整數。當k o n 時,排序的執行時間為o ...

《演算法導論》總結(一) 線性時間排序演算法

演算法導論 第一部分,第8章。這章介紹了3個線性時間排序的演算法,也就是在o n 的時間內排序的演算法,o n 時間複雜度是排序演算法時間的極限,簡單想一下也能明白,再好的演算法也總得將所有資料全部讀一遍才能知道順序,所以複雜度至少也是n。雖然這幾個演算法排序的時間複雜度很低,但是這幾個演算法都有一...

演算法導論 第8章 線性時間排序

比較排序指在排序的最終結果各元素的次序依賴於它們之間的比較的排序演算法。在最壞情況下,任何比較排序演算法都需要做 nlgn 次比較。因此堆排序和歸併排序都是漸近最優的比較排序演算法。本章討論三種用運算而不是比較來確定排序順序的線性時間複雜度的排序演算法 計數排序假設n個輸入元素中的每乙個都是在0 k...