現有如下題目:有乙個海量文字,儲存的是漢語詞語,要求從中找出前k個出現頻率最高的詞語,寫出最優演算法,兼顧時間和空間複雜度。
思路分析:熟悉搜尋引擎的程式設計師,應該不是難題。用傳統的hashmap是無法解決的,因為資料量非常龐大的時候,空間複雜度會導致程式執行時,頻繁執行minorgc和majorgc,最終jvm會宕掉。之前寫的字母排列演算法的時候,當輸出100多萬條資料的時候,jvm就宕掉了,下面用自平衡的三叉樹來解決此問題。
第一步:對文字進行排序和折中處理,更新文字,要要用到pinyin4j專案包;
第二步:把更新後的字典,載入到三叉樹中,實現平衡的三叉樹,自定義的三叉樹要增加節點字元出現次數的變數,以便實現詞頻統計;
第三步:遍歷字典,每次讀到的詞語,用三叉樹查詢,得到頻率,然後把讀到的詞語和頻率寫到另乙個檔案中,用空格分開,類似於key-value鍵值對形式;
第五步:得到最小頻率值的堆後,從新的文字中找到對應的詞語,加入到set中,統一頻率的詞語會有很多,而不是乙個,輸出應該是如下形式:
[***,***,***……]
[***,***,***……]
[***,***,***……]
**省略,不上傳了!
posted @
2016-03-08 18:45
佟學強 閱讀(
...)
編輯收藏
在海量資料中統計出現次數最多的n個
在海量資料中統計出現次數最多的n個 分兩種情況,1 如果資料能夠在記憶體中放下,比如如果海量資料是ip位址,最多有4g個ip位址,每個ip位址佔4個位元組 需要記憶體16g,如果內存在幾十g,則完全可以全部裝入記憶體,直接讀取大檔案,然後建立乙個hash表,統計次數,最後再用堆統計最大的n個 2 如...
堆 heap 從海量資料中尋找最大的k個值
1 目的 獲取大量元素 topk 大個元素,固定記憶體 2 思路 1 先放入元素前 k 個建立乙個最小堆 2 迭代剩餘元素 a 如果當前元素小於堆頂元素,跳過該元素 肯定不是前 k 大 b 否則替換堆頂元素為當前元素,並重新調整。3 示例 import heapq class topk 獲取大量元素...
小公尺OJ 13(出現頻率最高的前 K 個元素)
出現頻率最高的前 k 個元素 序號 13 難度 有挑戰 時間限制 1000ms 記憶體限制 10m描述 有乙個不為空且僅包含正整數的陣列,找出其 現頻率最高的前 k 個數,時間複雜度必須在 o n log n 以內。輸入一行資料報括兩部分,乙個正整數陣列 數字間 分隔 和乙個正整數 k 1 k 陣列...