首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

不良代碼展示:雙重循環比較兩數組差異的性能災難與 Set 優化重構

     編輯:關於C

代碼審查中常見的「能跑通但上線炸裸」典型案例:用雙層循環比較兩個字串陣列的差異,時間複雜度 O(n×m),資料量一大直接拖垮系統。

❌ 反面教材:雙重循環暴力比對

public class WrongCompare {
    public static void main(String[] args) {
        String[] str1 = {"1","2","3","4","5","6"};
        String[] str2 = {"0","2","3","4","5","6","7"};

        // 找 str1 有、str2 無
        for (int i = 0; i < str1.length; i++) {
            boolean has = false;
            for (int j = 0; j < str2.length; j++) {
                if (str1[i].equals(str2[j])) { has = true; break; }
            }
            if (!has) System.out.println(str1[i] + " 在str1中,不在str2中");
        }

        // 找 str2 有、str1 無
        for (int j = 0; j < str2.length; j++) {
            boolean has = false;
            for (int i = 0; i < str1.length; i++) {
                if (str1[i].equals(str2[j])) { has = true; break; }
            }
            if (!has) System.out.println(str2[j] + " 在str2中,不在str1中");
        }
    }
}

痛點:兩次雙層循環,測試環境數據少不顯山露水,生產環境萬級數據直接 OOM/超時。

✅ 正向重構:HashSet 降維打擊

import java.util.*;

public class RightCompare {
    public static void main(String[] args) {
        String[] str1 = {"1","2","3","4","5","6"};
        String[] str2 = {"0","2","3","4","5","6","7"};

        Set<String> set1 = new HashSet<>(Arrays.asList(str1));
        Set<String> set2 = new HashSet<>(Arrays.asList(str2));

        // 差集:str1 - str2
        for (String s : set1) {
            if (!set2.contains(s))
                System.out.println(s + " 在str1中,不在str2中");
        }
        // 差集:str2 - str1
        for (String s : set2) {
            if (!set1.contains(s))
                System.out.println(s + " 在str2中,不在str1中");
        }
    }
}

複雜度對比

指標雙重循環HashSet
時間複雜度O(n × m)O(n + m)
空間複雜度O(1)O(n + m)
10萬級數據耗時~10¹⁰ 次操作(不可接受)~2×10⁵ 次操作(毫秒級)

為何 HashSet 快?

  • 基於雜湊表,contains 平均 O(1)。
  • 無序存儲,無需比較全部元素。
  • JVM 內部優化極佳,移動端(Android)效能增益更明顯。

工程守則

  1. 測試通 ≠ 上線穩:必須考慮數據量增長帶來的複雜度變化。
  2. 選對資料結構:查找/去重/交集/差集 → 首選 HashSet/HashMap。
  3. 空間換時間:記憶體通常比 CPU 便宜,大膽用輔助集合。
  4. 代碼審查清單:巢狀循環 + 集合查找 → 必須優化。

此例雖簡單,卻折射出「演算法意識」在工程落地中的生死攸關地位。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved