選擇問題的演算法

2021-06-19 01:57:57 字數 1503 閱讀 4194

1什麼叫選擇問題:

設有一組

n個數,而要確定其中第

k個最大者。

2、問題的解法:解法1

:最容易想到的一種解法就是將這個

n個數讀入乙個陣列,然後通過某個比較簡單的排序演算法,如冒泡法,以遞減順序將陣列排序,然後位置

k上的數就是想要的第

k個最大數。

總的時間複雜度為o(n*logn +k)。解法2

:可以先把

k個元素讀入陣列,然後以遞減的順序排序,接著,便對剩下的元素逐一讀入,每讀入乙個新元素,如果它小於陣列中的最小者(即第

k個元素)那麼則忽略該元素,否則將其放在書組中正確的順序上,必然的同時,將陣列中最小的那個元素擠出陣列。當演算法終止時,位於第

k個位置上的元素將作為答案返回。時間複雜度

o(n * logk) 解法

3:利用快速排序的思想,從陣列

s中隨機找出乙個元素

x,把陣列分為兩部分sa和

sb。sa中的元素大於等於x,

sb中元素小於

x。這時有兩種情況:

1.sa

中元素的個數小於k,則

sb中的第

k-|sa|

個元素即為第

k大數;

2.sa

中元素的個數大於等於

k,則返回

sa中的第

k大數。時間複雜度近似為

o(n) 解法

4:二分[smin,smax]

查詢結果

x,統計

x在陣列中出現,且整個陣列中比

x大的數目為

k-1的數即為第

k大數。時間複雜度平均情況為

o(n*logn) 解法

5:用o(4*n)

的方法對原數組建最大堆,然後

pop出

k次即可。時間複雜度為

o(4*n +k*logn) 解法

6:利用選擇排序或互動排序,

k次選擇後即可得到第

k大的數。總的時間複雜度為

o(n*k) 解法

7:利用

hash

儲存陣列中元素

si出現的次數,利用計數排序的思想,線性從大到小掃瞄過程中,前面有

k-1個數則為第

k大數,平均情況下時間複雜度

o(n)

3、演算法孰優孰劣

我們知道,這

7種方法都是可行的,

但問題是,誰更好一些呢?哪個執行的效率更高,需要的計算時間更小?驗證他們,也許我們可以通過大量的資料進行實驗才得知。比如,n為

1000萬,k

為300

萬,那麼處理起來,計算機真的要好久才能出結果。

選擇問題的根本可以歸結為一般的排序問題。

選擇問題演算法

對於給定的 n 個元素的陣列a 1 n 要求從中找出第 k小的元素。如果劃分元素 v測定在a j 的位置上,則有 j 1個元素小於或等於a j 且有 n j個元素大於或等於a j 因此,若 k,則第 k小元素在a 1 j 1 中 若 k j,則a j 就是第 k小元素 若 k j 則第k 小元素是a...

演算法 活動選擇問題

encoding utf 8 import sys def greedy activity activity,begin,end activity list temp end time activity begin 1 獲取最小的結束時間 if begin end return activity l...

貪心演算法 活動選擇問題

活動選擇問題 就是給定一組活動的開始時間和結束時間,然後他們都需要使用到乙個資源,這個資源每次只有乙個活動可以用,要求求出乙個最大的相互相容的活動子集。首先定義了乙個集合sij 其中s就是所有活動的集合,fi是活動ai的完成時間si是活動ai的開始時間。這道題如果是用dp來解的話,就需要找到最優解的...