K選擇問題

2021-08-01 18:36:18 字數 1121 閱讀 2323

從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)

kdeletemin-->用時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值的減小就意味著整體模型變得複雜,容易發生過擬...