求第 K 大元素

2022-09-07 19:24:15 字數 534 閱讀 4420

問題:給定乙個長度為 \(n\) 的陣列,求第 \(k\) 大元素。

普通的 \(o(n)\) 隨機分治應該廣為人知,這裡介紹一種確定性的 \(o(n)\) 做法。

我們考慮分治,每五個元素一組,我們 \(o(1)\) 求出每組五個元素的中位數,隨後我們遞迴呼叫該做法,求出每一組中位數的中位數,記為 \(x\)。

然後我們 \(o(n)\) 掃瞄求出 \(x\) 的排名,我們由中位數的偏序關係可以得到這個 \(x\) 的排名必然在 \(\fracn\sim \fracn\) 之間(中位數小於 \(x\) 的組中至少有三個數小於 \(x\),中位數比 \(x\) 大的也至少有三個數)。

然後我們根據 \(k\) 和 \(x\) 的排名關係來捨棄 \(x\) 某一側的元素,將剩下的陣列遞迴。

複雜度分析可以得到遞推式 \(t(n)=t(\frac)+t(\fracn)+cn\),其中 \(c\) 是常數。

令 \(t(n)=10cn\) 代入發現等式成立,於是該做法複雜度最壞也為線性。

(也許可以出成互動然後互動庫是依賴性的,這樣隨機做法就炸了)

Partition演算法 求第K大元素

二分partition演算法是指在o n 的時間複雜度和o 1 的空間複雜度的情況下將乙個陣列分為大於某個數和小於某個數的兩部分。快速排序其實就是分治 partition演算法。int partition vector int nums,int begin,int end swap nums pos...

第k大元素

在陣列中找到第k大的元素 最先想到的是簡單排序,但是簡單排序超時,於是想到改造快排,快排的思想是每次確定乙個元素在陣列中的下標,如果確定的下標為k那該元素為k大,若下標大於k,第k大在改下標之前.class solution public int pat int nums,int start,int...

第K大元素

在陣列中找到第k大的元素。給出陣列 9,3,2,4,8 第三大的元素是4 給出陣列 1,2,3,4,5 第一大的元素是5,第二大的元素是4,第三大的元素是3,以此類推 要求時間複雜度為o n 空間複雜度為o 1 如果不考慮時間複雜度和空間複雜度,這道題目有很多種方法,利用一種排序演算法將陣列倒敘排序...