從n個數當中選出第k個最大者。 最簡單的兩種演算法:
- 優先佇列基本模型
- 優先佇列的簡單實現
方法a,鍊錶:表頭插入-->遍歷鍊錶刪除最小元。時間複雜度o(1)+o(n)
方法b,二叉查詢樹。時間複雜度o(logn)
- 優先佇列更好的實現方案:二叉堆(簡稱堆)
a.二叉堆的結構性質
堆:完全填滿的二叉樹。底層元素從左到右填入。(完全二叉樹)
完全二叉樹,高h與節點數n的關係
n = 2^h ~ 2^(h+1) - 1
h = o(logn)
完全二叉樹非常規律-->可以用陣列表示完全二叉樹
位置i的元素-->左兒子[2i],右兒子(2i+1),父親(i/2)下取整
b.堆序性質
堆序性質(heap-order property):讓操作快速執行的性質
在乙個堆中,每乙個子節點x的父親中的關鍵字小於等於x的關鍵字,根節點除外。
c.基本的堆操作(見資料結構與演算法分析p153)
buildheap
最壞情況用時o(n)
每次deletemin
用時o(logn)
k
次deletemin
-->用時o(klogn + n)
演算法a5:
選取s中乙個元素作為樞紐元v,將集合s-分割成s1和s2,就像快速排序那樣
如果k <= |s1|,那麼第k個最小元素必然在s1中。在這種情況下,返回quickselect(s1, k)
。
如果k = 1 + |s1|,那麼樞紐元素就是第k個最小元素,即找到,直接返回它。
否則,這第k個最小元素就在s2中,即s2中的第(k - |s1| - 1)個最小元素,我們遞迴呼叫並返回quickselect(s2, k - |s1| - 1)
。
此演算法的平均執行時間為o(n)
。
在我自己的專案中,k=1或2.所以採用演算法a2或者a4比較好。a2**量小,果斷採用。
選擇問題 第k小元素
問題描述 在乙個無序的序列t中,尋找第k小的元素 分析 將序列t進行公升序排列,下標為k的元素即為第k小的數。下標從1開始 考慮到快速排序的過程,每次進行一次partition 函式,就將比軸線值小的數放在軸線左邊,比軸線大的值放在軸線右邊,即可確定乙個軸線值的下標位置s。下面分三種情況 1 s k...
選擇問題(第k小元素)(分治法)
selection algorithm 選擇問題即第k小元素問題。解決該問題的基本思想與快速排序演算法相同,通過選擇基元進行劃分,從而知道第k小元素在 原始資料使用隨機函式生成。採用結構化程式設計,可以很容易改為從標準輸入或檔案讀入資料,只需要修改函式getdata即可。資料個數由巨集定義給出,也可...
k值的選擇
k值過大 k值選擇問題,李航博士的一書 統計學習方法 上所說 1 選擇較小的k值,就相當於用較小的領域中的訓練例項進行 學習 近似誤差會減小,只有與輸入例項較近或相似的訓練例項才會對 結果起作用,與此同時帶來的問題是 學習 的估計誤差會增大,換句話說,k值的減小就意味著整體模型變得複雜,容易發生過擬...