期望為線性時間的選擇演算法

2021-08-31 01:14:25 字數 885 閱讀 4367

《演算法導論》第9章randomized_select演算法

從乙個陣列當中尋找第i小的元素,最簡單最暴力的方法就是將整個陣列按照公升序進行排序操作,那麼第i個元素就是第i小的元素。

如果是以這種方式,那麼時間複雜度等同於排序時所使用的排序演算法,如果是快速排序,那麼此時時間複雜度為o(nlgn)。

那麼,有沒有乙個演算法相對於整個陣列排序再查詢來的更快呢?比如線性時間o(n)?

randomized_select就是這樣乙個基於隨機函式和快排引申出來的查詢函式。在期望線性時間內,可以找到任一順序統計量,特別是中位數。

int randomized_partition(vector&p, int left, int right)

srand((unsigned int)time(0));

int key = (rand() % (right - left + 1)) + left;

for (int i = left - 1, j = left; j <= right; j++)

}if (j == right)

}return key;

}

int randomized_select(vector&p, int left, int right, int i)

int q = randomized_partition(p, left, right);

int k = q - left + 1;

if (k==i)

else if(i利用隨機數進行劃分,從數學角度上將最壞執行時間給平均掉了,等概率劃分的情況下使得最壞執行時間也不會太差。

書中還介紹了一種最壞情況為線性時間的選擇演算法,下次再寫。

期望為線性時間選擇演算法

一般選擇問題看起來要比我麼找最小值這樣的簡單問題更難。但這兩個問題的漸進執行時間卻是相同的 n randomized select演算法,以快速排序演算法為模型。與快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而randomized select只處理劃分的一邊。快速排序執行的時間是 n n 而r...

期望為線性的選擇演算法

以快排為模型,對陣列遞迴劃分,但遞迴後只處理包含所查第 個元素的那邊,如此遞迴下去直至查詢成功 無 這裡的partition就是其中的randomized partition include int randomized partition int a,int p,int r temp a i 1 ...

小白高階之期望為線性時間的選擇演算法

期望為線性時間的選擇演算法,最壞時間複雜度為 n 期望時間複雜度為 n 選擇演算法用到了以前快速排序時用到的隨機劃分。目的是找出陣列中第i個元素。演算法的思想為 先隨機劃分,再看i的位置,若是i剛剛好等於隨機劃分的位置,則返回此位置的陣列元素值,否則根據i的位置遞迴呼叫選擇函式,尋找第i 個元素。與...