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來解的話,就需要找到最優解的...