K個(gè)最大(最蟹虬 )元素的算法

問題描述:給定具有N個(gè)元素的全序集合A撇眯,比較算符為<=,求最大的K<=N個(gè)元素锚国,不要求排序玄坦。下面按照取K個(gè)最小值的情況討論。
基本思想:類似于快速排序法豺总,選擇一個(gè)元素將其插入到數(shù)組的一個(gè)位置择懂,使得左側(cè)的元素都小于等于該標(biāo)記元素,右側(cè)元素都大于等于該元素表伦。

  • 取第一個(gè)元素為標(biāo)記元素赂弓,掃描后續(xù)的元素,并與其比較翔怎,分為三類
    • 一類是全部小于該元素杨耙,數(shù)組計(jì)為A_1,個(gè)數(shù)計(jì)為N_1
    • 一類是全部等于該元素容握,數(shù)組計(jì)為A_2剔氏,個(gè)數(shù)計(jì)為N_2
    • 一類是全部大于該元素,數(shù)組計(jì)為A_3羊苟,個(gè)數(shù)計(jì)為N_3
    • 定義M_1=N_1, M_2 = N_1+N_2, M_3 = N_1 + N_2 + N_3
  • KM_1,M_2,M_3比較感憾,確定其位置。
  • 當(dāng)K=M_1時(shí)凉倚,返回結(jié)果即A_1
  • 當(dāng)K=M_2時(shí)嫂沉,返回結(jié)果即A_1\cup A_2
  • 當(dāng)K=M_3時(shí),返回結(jié)果即A集合本身
  • 當(dāng)K < M_1時(shí)瓦胎,對A_1集合遞歸調(diào)用上述過程
  • 當(dāng)M_1 < K < M_2時(shí)尤揣,在A_2集合中遞歸調(diào)用上述過程找到A_2集合中的前K-M_1個(gè)元素B北戏,返回A_1\cup B
  • 當(dāng)M_2 < K < M_3時(shí)漫蛔,在A_3集合中遞歸調(diào)用上述過程莽龟,找到A_3集合中的前K-M_2個(gè)元素C,返回A_1\cup A_2\cup C

參考Haskell代碼:

ksplit 0 xs = ([], xs)
ksplit k xs
    = let x = head xs
          xs1 = filter (<  x) xs
          xs2 = filter (== x) xs
          xs3 = filter (>  x) xs
          n1  = length xs1
          n2  = length xs2 + n1
          n3  = length xs3 + n2
      in  if k > length xs
          then error "not_enough_elements"
          else if k == n1
               then (xs1, xs2 ++ xs3)
               else if k == n2
                    then (xs1 ++ xs2, xs3)
                    else if k == n3
                         then (xs, [])
                         else if k < n1
                              then let (ys1, ys2) = ksplit k xs1
                                   in  (ys1, ys2 ++ xs2 ++ xs3)
                              else if k < n2 -- k \in (n1, n2)
                                   then (xs1 ++ take (k - n1) xs2, take (n2 - k) xs2 ++ xs3)
                                   else let (ys1, ys2) = ksplit (k - n2) xs3 -- k \in (n2, n3)
                                        in  (xs1 ++ xs2 ++ ys1, ys2)


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剃毒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搂赋,更是在濱河造成了極大的恐慌赘阀,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脑奠,死亡現(xiàn)場離奇詭異基公,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宋欺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門轰豆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胰伍,“玉大人,你說我怎么就攤上這事酸休。” “怎么了雨席?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵菩咨,是天一觀的道長。 經(jīng)常有香客問我陡厘,道長抽米,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任糙置,我火速辦了婚禮云茸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谤饭。我一直安慰自己标捺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布揉抵。 她就那樣靜靜地躺著亡容,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冤今。 梳的紋絲不亂的頭發(fā)上闺兢,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音戏罢,去河邊找鬼屋谭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛龟糕,可吹牛的內(nèi)容都是我干的桐磁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼讲岁,長吁一口氣:“原來是場噩夢啊……” “哼我擂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起催首,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扶踊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后郎任,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秧耗,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年舶治,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了分井。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片车猬。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尺锚,靈堂內(nèi)的尸體忽然破棺而出珠闰,到底是詐尸還是另有隱情,我是刑警寧澤瘫辩,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布伏嗜,位于F島的核電站,受9級特大地震影響伐厌,放射性物質(zhì)發(fā)生泄漏承绸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一挣轨、第九天 我趴在偏房一處隱蔽的房頂上張望军熏。 院中可真熱鬧,春花似錦卷扮、人聲如沸荡澎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摩幔。三九已至,卻和暖如春抖甘,著一層夾襖步出監(jiān)牢的瞬間热鞍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工衔彻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偷办。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓艰额,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椒涯。 傳聞我的和親對象是個(gè)殘疾皇子柄沮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容