Top K Frequent Elements

Algorithms will always matter.

的確,無論現(xiàn)在的計(jì)算能力如何提高调缨,人們總會發(fā)現(xiàn)立即會有更多的數(shù)據(jù)需要處理好芭。

依然是leetcode上的題目:

Given a non-empty array of integers, return the k most frequent elements.
For example,Given [1,1,1,2,2,3]
and k = 2, return [1,2]
.
Note: **
You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
Your algorithm's time complexity must be better than O(
n
log n), where n is the array's size.

顯然,掃描數(shù)組鸥滨,使用元素值作為hash-key,保存每個數(shù)字出現(xiàn)的次數(shù)谤祖,變身為top-k 問題婿滓。

Top K Problem

對于top k 問題是利用堆排序,首先建立最大堆泊脐,交換堆頂元素與最后一個有序的元素空幻,調(diào)整最大堆至所有元素有序。
由于只需要K個元素有序容客,所以只需進(jìn)行k次shift-down調(diào)整即可秕铛。

代碼實(shí)現(xiàn)

def top_k(nums, k): 
    length = len(nums)
    def shift_down(start, end):
        root = start
        while True:
            child = 2 * root + 1 
            if child > end:
                break;
            if child + 1 <= end and nums[child] < nums[child + 1]: 
                child += 1
            if nums[root] < nums[child]:
                nums[root], nums[child] = nums[child],nums[root]
                root = child
            else:
                break
    for start in xrange((length - 2) // 2, -1, -1):
        shift_down(start, length - 1)

    for end in xrange(length - 1, length - k - 1, -1):
        nums[0], nums[end] = nums[end], nums[0]
        shift_down(0, end - 1)

    return nums[-1 : length - k - 1 : -1] 

復(fù)雜度分析

首先,建堆需要O(N)時間缩挑, 然后每次調(diào)整需要logN但两,共發(fā)生k次調(diào)整,總時間為O(N+K*logN)供置。

更優(yōu)雅的做法

我們的實(shí)現(xiàn)仍然缺少map的統(tǒng)計(jì)谨湘,代碼已經(jīng)比較臃腫。是否有更優(yōu)雅的做法呢芥丧?答案是利用python提供內(nèi)置Counter類庫紧阔。

    def topKFrequent(self, nums, k): 
        cnt = Counter()
        for i in nums:
            cnt[i] += 1
        return [ x for x,y in cnt.most_common(k) ] 

怎樣,寥寥4行代碼之間是否讓你感到python的優(yōu)雅了嗎续担?

后記

top k問題在編程之美這本書中被挖掘到了不能再美擅耽。不過,還記得文章開始的引子嗎物遇? 是的乖仇,如果數(shù)據(jù)變大憾儒,所有數(shù)據(jù)分布在不同的機(jī)器集群上,如何獲得所有集群上的top-k呢乃沙?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末起趾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子警儒,更是在濱河造成了極大的恐慌训裆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冷蚂,死亡現(xiàn)場離奇詭異缭保,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝙茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門艺骂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隆夯,你說我怎么就攤上這事钳恕。” “怎么了蹄衷?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵忧额,是天一觀的道長。 經(jīng)常有香客問我愧口,道長睦番,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任耍属,我火速辦了婚禮托嚣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厚骗。我一直安慰自己示启,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布领舰。 她就那樣靜靜地躺著夫嗓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冲秽。 梳的紋絲不亂的頭發(fā)上舍咖,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音锉桑,去河邊找鬼谎仲。 笑死,一個胖子當(dāng)著我的面吹牛刨仑,可吹牛的內(nèi)容都是我干的郑诺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杉武,長吁一口氣:“原來是場噩夢啊……” “哼辙诞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轻抱,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤飞涂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后祈搜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體较店,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年容燕,在試婚紗的時候發(fā)現(xiàn)自己被綠了梁呈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蘸秘,死狀恐怖官卡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情醋虏,我是刑警寧澤寻咒,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站颈嚼,受9級特大地震影響毛秘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阻课,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一叫挟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柑肴,春花似錦霞揉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硕舆,卻和暖如春秽荞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抚官。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工扬跋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凌节。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓钦听,卻偏偏與公主長得像洒试,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朴上,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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