首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

大數據統計:100萬條微博統計 @提及 Top 100 算法思路

     編輯:程式設計綜合問答

問題

文本文件 100 萬行,每行一條微博,需統計 @用戶名 出現次數最多的前 100 用戶。

算法思路

  1. 正則提取:逐行讀取,用正則 @(\\w+) 提取所有 @用戶名。
  2. 哈希計數:HashMap 累加每個用戶名計數。Key 為用戶名,Value 為出現次數。
  3. Top-K 選取:
    • 小數據:全部排序 O(N log N)。
    • 大數據:維護大小 100 的最小堆,單次遍歷 O(N log 100),內存只存 100 個元素。

優化要點

  • 流式讀取(BufferedReader),避免一次性載入 100 萬行到內存。
  • 用戶名標準化(去除標點、統一大小寫)。
  • 若用戶 ID 已知,可用 int[] 陣列直接映射計數,比 HashMap 更快。
  • 分布式場景:MapReduce / Spark 先局部聚合再全局合併。

核心代碼片段

Map counter = new HashMap<>();
Pattern pattern = Pattern.compile("@(\\w+)");
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
        Matcher m = pattern.matcher(line);
        while (m.find()) {
            String name = m.group(1);
            counter.merge(name, 1, Integer::sum);
        }
    }
}
// 取 Top 100
List> top = counter.entrySet().stream()
    .sorted(Map.Entry.comparingByValue().reversed())
    .limit(100).collect(Collectors.toList());
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved