一文帶你了解被 BATJ 問爛的 TopK 問題

2021-01-14 視學算法

作者:CyC2018連結:https://www.nowcoder.com/discuss/150681

問題描述

找出一組數最大的 K 個數。

一般解法

Leetcode : 215. Kth Largest Element in an Array

https://leetcode.com/problems/kth-largest-element-in-an-array/description/

快速選擇

快速排序的 partition() 方法,會返回一個整數 j 使得 a[l..j-1] 小於等於 a[j],且 a[j+1..h] 大於等於 a[j],此時 a[j] 就是數組的第 j 大元素。可以利用這個特性找出數組的第 K 個元素,這種找第 K 個元素的算法稱為快速選擇算法。

時間複雜度 O(N)、空間複雜度 O(1)

只有當允許修改數組元素時才可以使用

public int findKthElement(int[] nums, int k) {

   k = nums.length - k;

   int l = 0, h = nums.length - 1;

   while (l < h) {

       int j = partition(nums, l, h);

       if (j == k) {

           break;

       } else if (j < k) {

           l = j + 1;

       } else {

           h = j - 1;

       }

   }

   return nums[k];

}


private int partition(int[] a, int l, int h) {

   int i = l, j = h + 1;

   while (true) {

       while (a[++i] < a[l] && i < h) ;

       while (a[--j] > a[l] && j > l) ;

       if (i >= j) {

           break;

       }

       swap(a, i, j);

   }

   swap(a, l, j);

   return j;

}


private void swap(int[] a, int i, int j) {

   int t = a[i];

   a[i] = a[j];

   a[j] = t;

}

維護一個大小為 K 的最大堆,那麼在堆中的數都是 TopK。

使用小頂堆來維護最大堆,而不能直接創建一個大頂堆並設置一個大小,企圖讓大頂堆中的元素都是最大元素。

維護一個大小為 K 的最大堆過程如下:在添加一個元素之後,如果小頂堆的大小大於 K,那麼需要將小頂堆的堆頂元素去除。


public int findKthLargest(int[] nums, int k) {

   PriorityQueue<Integer> pq = new PriorityQueue<>(); // 小頂堆

   for (int val : nums) {

       pq.add(val);

       if (pq.size() > k)  // 維護堆的大小為 K

           pq.poll();

   }

   return pq.peek();

}

海量數據

在這種場景下,單機通常不能存放下所有數據。

拆分,可以按照哈希取模方式拆分到多臺機器上;

在每個機器上維護最大堆;

整合,將每臺機器得到的最大堆合併成最終的最大堆。

頻率統計

Heavy Hitters 問題要求找出一個數據流的最頻繁出現的 K 個數,比如熱門搜索詞彙等。

HashMap

使用 HashMap 進行頻率統計,然後使用快速選擇或者堆的方式找出頻率 TopK。在海量數據場景下,也是先進行拆分再整合的方式來解決空間問題。

Count-Min Sketch

維護 d*w 大小的二維統計數組,其中 d 是哈希函數的個數,w 根據情況而定。

該算法的思想和布隆過濾器類似,具有一定的誤差,特別是當 w 很小時。但是它能夠在單機環境下解決海量數據的頻率統計問題。

public class CountMinSketch {


   private int d;

   private int w;


   private long estimators[][];


   public CountMinSketch(int d, int w) {

       this.d = d;

       this.w = w;

   }


   public void add(int value) {

       for (int i = 0; i < d; i++)

           estimators[i][hash(value, i)]++;

   }


   public long estimateFrequency(int value) {

       long minimum = Integer.MAX_VALUE;

       for (int i = 0; i < d; i++) {

           minimum = Math.min(minimum, estimators[i][hash(value, i)]);

       }

       return minimum;

   }


   private int hash(int value, int i) {

       return 0; // use ith hash function

   }

}

Trie

Trie 樹又叫又叫字典樹、前綴樹、單詞查找樹,它是一顆多叉查找樹。與二叉查找樹不同,鍵不是直接保存在節點中,而是由節點在樹中的位置決定。

Trie 樹可以用於解決詞頻統計問題,只要在詞彙對應節點保存出現的頻率。它很好地適應海量數據場景,因為 Trie 樹通常不高,需要的空間不會很大。

參考資料



今日問題


關鍵字inline的作用是什麼?


打卡格式:打卡第n天,答:...


相關焦點

  • 一文帶你了解加速度計
    一文帶你了解加速度計 工程師曾暄茗 發表於 2018-07-07 10:52:00 測量範圍: 傳感器輸出信號規格支持的加速度水平,通常用±g表示
  • 【一文帶你了解霍爾效應】霍爾效應的原理分析及應用
    大量的研究揭示:參加材料導電過程的不僅有帶負電的電子,還有帶正電的空穴。如圖所示,在垂直於磁感應強度B的勻強磁場中,分別放置一塊P型半導體和一塊N型半導體,並通以縱向電流(I)由於洛倫茲力的作用,空穴會產生橫向偏移,結果使得這塊半導體的上側(a-d)積聚有正電荷,相應的下側(b-c)積聚了負電荷,從而在橫向兩側間形成電勢差,即兩側電勢高低的關係是:  j(a-d)>j(b-c)    在N型半導體中,電流是由於帶負電荷的電子定向運動形成的
  • 一文帶你全方位了解與投遞EI
    一文帶你全方位了解與投遞EI(上大畢業發EI可行嗎)一、EI簡介EI全稱叫做The Engineering Index,中文叫:工程索引。它的資料庫主要收錄工程技術領域的期刊、會議和書籍。按收錄類別來說,我們所說的EI包括EI源刊和EI會議。其實我們說EI的時候一般就是指EI會議。雖然EI分為EI源刊和EI會議兩種。
  • 一文帶你了解手機的「芯」
    而面對每天都被我們握在手中的親密夥伴——手機,你又對它的「心臟」了解多少呢?是不是面對眾多不同名稱的處理器感到不解呢?又對處理器的幾個重點參數了解多少呢?今天小M就帶你一文讀懂手機的「心臟」。 至於海思麒麟,想必大家都多少有些了解,作為華為自研處理器品牌,近幾年來一直輸出優質的「中國芯」,無論是集成5G基帶方面還是總體性能方面都非常的優秀。
  • 動態規劃:關於01背包問題,你該了解這些!(滾動數組)
    昨天動態規劃:關於01背包問題,你該了解這些!中是用二維dp數組來講解01背包。今天我們就來說一說滾動數組,其實在前面的題目中我們已經用到過滾動數組了,就是把二維dp降為一維dp,一些錄友當時還表示比較困惑。
  • 今日帶你進入摔不爛的太空杯時代
    唱著屬於我們的「童年」,翻開屬於我們的「青春紀念冊」,想著屬於我們的「最初的夢想」,用著屬於我們的「經典太空杯」……最近幾天朋友圈似乎又掀起了一股濃濃的懷舊風無論是讓人津津樂道的電影《頭號玩家》中,一百多號彩蛋帶給我們驚喜還是「紙短情長」帶我們回味起那最初的悸動
  • 一文帶你了解鉛鋅礦
    原標題:一文帶你了解鉛鋅礦 鉛是人類從鉛鋅礦石中提煉出來的較早的金屬之一。它是最軟的重金屬之一,也是密度大的金屬之一,具藍灰色,硬度1.5,密度11.34,熔點327.4℃,沸點1750℃,展性良好,易與鋅、錫、銻等金屬和砷製成合金。
  • 《康德的倫理學其實很爛》,這篇論文究竟爛在哪裡?
    對於《康德的倫理學其實很爛》一文所引發的風波,論文作者說,不服來辯論;編輯部也說,不服來投稿。投稿真是不敢,吃瓜群眾實在學力不濟,但談談這篇論文究竟爛在哪裡,還是可以的。01這篇論文的標題為什麼很爛?《康德的倫理學其實很爛》,加上了副標題,即《道德形上學原理》批判,稍微做了限制,算是謙虛。
  • 一文帶你了解扭力扳手
    以上有沒有你需要的呢?點擊左下角閱讀原文,更有海量扭力扳手任你挑選~來源:西域整理髮布聲明:本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,我們將根據您提供的證明材料確認版權,確認後即刻刪除相關內容。
  • 13個問題,帶你全面了解導熱矽膠片!
    經常有客戶問,你們導熱墊片的係數是多少?帶粘性?受熱後硬度會不會有變化?今天,就借這些問題,帶大家重新認識一下導熱矽膠墊片。A:導熱矽膠片都會有矽油成份,我們經過、特殊處理,兩次高溫化學處理並作真空處理解決了這個問題。Q12:電子設備中常用的導熱材料有哪些分類?A:導熱墊片、導熱矽脂、導熱絕緣材料、導熱相變材料、導熱膠等。
  • 區別於傳統平面式 一文帶你了解超級結MOSFET
    區別於傳統平面式 一文帶你了解超級結MOSFET May 發表於 2017-08-25 14:36:20 基於超級結技術的功率MOSFET已成為高壓開關轉換器領域的業界規範
  • 一例一休進入勞檢期 臺網友酸問:臺南高雄在比爛?
    華夏經緯網7月3日訊:據臺灣媒體報導,臺灣一例一休7月日前高雄市長陳菊表示對實施一例一休有困難的企業會用柔性勸導,稱「懲罰不是我們的目的」;昨天台南市長賴清德則說市府會依臺當局計劃進行作持續輔導,但坦言「不會為裁罰而作檢查」。網友酸問「究竟是臺南比較幸福呢?還是高雄比較幸福?」另有網友表示「說實話,高雄比臺南幸福一點點,不過就是比爛的概念!」
  • 一文帶你了解什麼是燃料電池
    目前,全球能源緊缺和環境汙染問題日益嚴重,氫能和燃料電池是未來重要發展方向和趨勢,燃料電池汽車也被認為是未來新能源汽車的終極選擇。今天,電動汽車資源網就帶大家一起來了解一下燃料電池。什麼是燃料電池?可使用的燃料範圍廣,能源多樣性就強,這樣可以降低對現有主要能源石油的依賴性,優化能源結構,緩解能源緊張的問題。4.安全性相對較高燃料電池在工作過程中,電池溫度不會超過100℃,如果加上冷卻措施,溫度還會更低,此外燃料電池的外殼如果破裂,也不會產生爆炸,只會有燃燒反應,相對其他電池來說安全性更高。
  • 一文帶你了解
    (圖片來源於網絡) 什麼是質子和重離子?
  • 一文帶你深入了解掃描陣列雷達信號處理
    一文帶你深入了解掃描陣列雷達信號處理 工程師2 發表於 2018-05-07 14:00:00 主動電掃描陣列 (AESA) 雷達是當今先進武器系統的關鍵組成 ,
  • 3分鐘英文動畫帶你了解
    They live pretty normal bat lives, flapping around and giving the viruses time to spread.) 更重要的是,適應了蝙蝠體內「極端環境」的病毒,在人體中更難被消滅。
  • 你再看看它,網友:沒有最爛,只有更爛!
    這句話深刻的剖析了一個社會問題——沒有買賣,就沒有殺害!咳咳,不好意思,串臺了!凡事就怕一個比,就拿老學長來說吧,本來覺得自己打籃球很菜,可是看到某位流量明星的籃球視頻,突然感覺自己是整個籃球場最靚的崽!
  • 一文帶你了解靈魂石的各種...
    一文帶你了解靈魂石的各種用法 靈魂石的洗禮活動已經上線十來天了,想必勇士們對這個活動一定有了一些了解了。那麼各位勇士是否真的掌握了靈魂石的使用精髓了嗎?筆者這裡有幾個靈魂石的使用方法,或許可以幫助勇士們。
  • 停課不停學,趣學英語—蝙蝠 bat
    I am a bat. I have a special power, that is, to host morethan a thousand of viruses including rabies, Nipah and puumala.
  • 主板名字帶WiFi和不帶有什麼區別?一文讀懂
    一文讀懂   主板的命名一直是很有學問的,有些重要的信息都會在主板命名中體現,比如晶片組、廠商的產品系列等,基本老手一看名字就可以大概能判斷這款主板的價格和地位。