Top K問題——Parition算法

Top K問題概述

  • 在非海量數(shù)據(jù)的情況下,Top K問題的首推解法就是快排中的Parition算法刺啦。不僅平均時間復(fù)雜度優(yōu)越竣贪,可以達到O(n)研叫,并且相比于基于堆的算法(包括:min_heapify哮针、build_heap关面、insert等一系列過程),編碼更簡潔十厢。
  • 在海量數(shù)據(jù)的情況下等太,還是老老實實選擇基于堆的這一數(shù)據(jù)結(jié)構(gòu)的算法吧。時間復(fù)雜度為O(nlogk)蛮放。并且大多數(shù)高級編程語言中都應(yīng)該內(nèi)置了基于堆的API缩抡,所以編寫起來也沒有那么麻煩,例如JDK中的:java.util.PriorityQueue<>包颁。

基于Partition算法

  • 選擇一個Position(稱為基準)缝其,基于該算法的Top k算法,非常受Position好壞的影響徘六,所謂的壞,有可能使時間復(fù)雜度達到O(n*n)榴都。
  • 然后利用Partition算法進行劃分待锈,如果Partition得到的p小于K,則繼續(xù)劃分p的右邊嘴高,如果p大于K竿音,則繼續(xù)劃分p的左邊和屎,如果p等于K,則算法結(jié)束春瞬。

Code

import java.util.Scanner;

/**
 * 利用快排中parition算法柴信,找到第k大數(shù),平均時間復(fù)雜度為O(n)
 */
public class FindK
{
    //測試
    public static void main(String[] args)
    {
        int k = 0;
        Scanner scanner = new Scanner(System.in);
        k = scanner.nextInt();
        scanner.close();

        int[] a = {2, 6, 3, 10, 45, 12, 5, 6, 5, 6};
        if (k >= 0 && k < a.length) {
            findMaxK(a, 0, a.length - 1, k);
            System.out.println("第"+ (k+1) +"大數(shù)為:" + a[k]);
        } else
            System.out.println("are you kidding me ?");
    }
    
    //遞歸劃分
    private static void findMaxK(int[] a, int low, int high, int k)
    {
        int p = partition(a, low, high);
        if (p == k)
        {
            return;
        }
        if (p < k)
        {
            findMaxK(a, p + 1, high, k);
        }else{
            findMaxK(a, low, p - 1, k);
        }
    }

    //核心算法:劃分
    private static int partition(int[] a, int low, int high)
    {
        int position = a[high];
        int i = low - 1;
        for (int j = low; j < high; ++j)
        {
            if (a[j] <= position)
            {
                ++i;
                exchange(a, i, j);
            }
        }
        exchange(a, i + 1, high);
        return i + 1;
    }

    static void exchange(int[] a, int i, int j)
    {
        int temp = a[j];
        a[j] = a[i];
        a[i] = temp;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宽气,一起剝皮案震驚了整個濱河市随常,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萄涯,老刑警劉巖绪氛,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涝影,居然都是意外死亡枣察,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門燃逻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來序目,“玉大人,你說我怎么就攤上這事伯襟≡痴牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵逗旁,是天一觀的道長嘿辟。 經(jīng)常有香客問我,道長片效,這世上最難降的妖魔是什么红伦? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮淀衣,結(jié)果婚禮上昙读,老公的妹妹穿的比我還像新娘。我一直安慰自己膨桥,他們只是感情好蛮浑,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只嚣,像睡著了一般沮稚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上册舞,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天蕴掏,我揣著相機與錄音,去河邊找鬼。 笑死盛杰,一個胖子當著我的面吹牛挽荡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播即供,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼定拟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逗嫡?” 一聲冷哼從身側(cè)響起青自,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祸穷,沒想到半個月后性穿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡雷滚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年需曾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈远。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡呆万,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出车份,到底是詐尸還是另有隱情谋减,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布扫沼,位于F島的核電站出爹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缎除。R本人自食惡果不足惜严就,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望器罐。 院中可真熱鬧梢为,春花似錦、人聲如沸轰坊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肴沫。三九已至粟害,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颤芬,已是汗流浹背我磁。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工孽文, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夺艰。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像沉衣,于是被迫代替她去往敵國和親郁副。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗豌习。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • 今天下午,治療完患者后,臨下班前還有一段空余時間,彬哥說他扭傷的腳踝有些腫,一直這么拖著也不是辦法,想波波師兄看看...
    立新七針李麗霞閱讀 293評論 0 0
  • 不要再無所事事了存谎,趕緊把身邊的事處理完,然后專心升本肥隆,考完減肥既荚,加油
    西瓜吃橘子閱讀 158評論 0 0
  • 我是付費閱讀擁護者恰聘,如果你想體驗付費閱讀的感覺,不妨滑到最后贊賞一筆再滑回來繼續(xù)讀吸占。 寫一些東西晴叨,在我自己看來算是...
    漁夫簡想閱讀 376評論 2 4
  • 關(guān)于愛情,你想說些什么矾屯? 我無話可說兼蕊。 你用力撕扯那早已死去的枝椏,希望能夠?qū)⑺鼡u醒件蚕,但只能讓它腐朽得更快孙技。 你狂...
    可汗閱讀 101評論 0 0