求N個無序數(shù)組中第K(大/小)數(shù)的方法

思路一:時間復(fù)雜度為O(N*logk)

對前k個數(shù)撑瞧,建立最大堆,對于后面N-k個數(shù)显蝌,依次和最大堆的最大數(shù)比較预伺,如果小于最大數(shù),則替換最大數(shù)曼尊,并重新建立最大堆酬诀。

堆排序:

我們舉例,假若從10000萬個數(shù)里選出前100個最大的數(shù)據(jù)骆撇。
首先我們先分析:既然要選出前100個最大的數(shù)據(jù)瞒御,我們就建立一個大小為100的堆(建堆時就按找最大堆的規(guī)則建立,即每一個根節(jié)點(diǎn)都大于它的子女節(jié)點(diǎn))神郊,然后再將后面的剩余數(shù)據(jù)若符合要求就插入堆中肴裙,不符合就直接丟棄該數(shù)據(jù)。
那我們現(xiàn)在考慮:確定是該選擇最大堆的數(shù)據(jù)結(jié)構(gòu)還是最小堆的數(shù)據(jù)結(jié)構(gòu)呢涌乳。
分析一下:
若選用最大堆的話蜻懦,堆頂是堆的最大值,我們考慮既然要選出從10000萬個數(shù)里選出前100個最大的數(shù)據(jù)爷怀,我們在建堆的時候阻肩,已經(jīng)考慮了最大堆的特性,那這樣的話最大的數(shù)據(jù)必然在它頂端运授。假若真不巧,我開始的前100個數(shù)據(jù)中已經(jīng)有這10000個數(shù)據(jù)中的最大值了乔煞,那對于我后面剩余的10000-100的元素再想入堆是不是入不進(jìn)去了S蹼!渡贾!所以逗宜,選用最大堆從10000萬個數(shù)里選出前100個最大的數(shù)據(jù)只能找出一個,而不是100個空骚。
那如果選用最小堆的數(shù)據(jù)結(jié)構(gòu)來解決纺讲,最頂端是最小值,再次遇到比它大的值囤屹,就可以入堆熬甚,入堆后重新調(diào)整堆,將小的值pass掉肋坚。這樣我們就可以選出最大的前K個數(shù)據(jù)了乡括。言外之意肃廓,假若我們要找出N個數(shù)據(jù)中最小的前k個數(shù)據(jù),就要用最大堆了诲泌。
那如果選用最小堆的數(shù)據(jù)結(jié)構(gòu)來解決盲赊,最頂端是最小值,再次遇到比它大的值敷扫,就可以入堆哀蘑,入堆后重新調(diào)整堆,將小的值pass掉葵第。這樣我們就可以選出最大的前K個數(shù)據(jù)了绘迁。

時間復(fù)雜度:n*logk

一個堆的元素數(shù)目為K時,堆的高度至多為logk羹幸。建立堆的時間為klogk脊髓。而調(diào)整的次數(shù)為n-k,每次調(diào)整的時間為logk栅受,所以調(diào)整的時間為 (n-k)logk将硝,所以總的時間復(fù)雜度為nlogk。
n
logk = klogk + (n-k)logk

假若我們要找出N個數(shù)據(jù)中最大的前k個數(shù)據(jù)屏镊,就要用最小頂堆了依疼。
假若我們要找出N個數(shù)據(jù)中最小的前k個數(shù)據(jù),就要用最大頂堆了而芥。

思路二:時間復(fù)雜度為O(k*n)

先排序前k個數(shù)律罢,對于后面N-k個數(shù),依次進(jìn)行插入棍丐。
當(dāng)k很小時误辑,可以用這種算法

思路三:復(fù)雜度O(N*logN).

先直接排序,再取排序后數(shù)據(jù)的前k個數(shù)歌逢。
排序算法用最快的堆排序巾钉,復(fù)雜度也會達(dá)到O(N*logN).
當(dāng)k接近于N時,可以用這種算法秘案。

引自:https://blog.csdn.net/hanjing_1995/article/details/51539593
引自:http://www.cnblogs.com/studynote/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砰苍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阱高,更是在濱河造成了極大的恐慌赚导,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赤惊,死亡現(xiàn)場離奇詭異吼旧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荐捻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門黍少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寡夹,“玉大人,你說我怎么就攤上這事厂置∑刑停” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵昵济,是天一觀的道長智绸。 經(jīng)常有香客問我,道長访忿,這世上最難降的妖魔是什么瞧栗? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮海铆,結(jié)果婚禮上迹恐,老公的妹妹穿的比我還像新娘。我一直安慰自己卧斟,他們只是感情好殴边,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著珍语,像睡著了一般锤岸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上板乙,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天是偷,我揣著相機(jī)與錄音,去河邊找鬼募逞。 笑死蛋铆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的放接。 我是一名探鬼主播戒职,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼透乾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磕秤,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤乳乌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后市咆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汉操,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蒙兰,在試婚紗的時候發(fā)現(xiàn)自己被綠了磷瘤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芒篷。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖采缚,靈堂內(nèi)的尸體忽然破棺而出针炉,到底是詐尸還是另有隱情,我是刑警寧澤扳抽,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布篡帕,位于F島的核電站,受9級特大地震影響贸呢,放射性物質(zhì)發(fā)生泄漏镰烧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一楞陷、第九天 我趴在偏房一處隱蔽的房頂上張望怔鳖。 院中可真熱鬧,春花似錦固蛾、人聲如沸结执。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌犹。三九已至,卻和暖如春览芳,著一層夾襖步出監(jiān)牢的瞬間斜姥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工沧竟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铸敏,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓悟泵,卻偏偏與公主長得像杈笔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糕非,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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