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

JavaScript 找出兩個陣列共同元素:雙重迴圈、Set 與 filter 三種實作比較

     編輯:程式設計疑難解答

需求

給定兩個陣列 list1、list2,取出兩者都存在的元素(交集)。

方案一:雙重迴圈(教學用、O(n×m))

function intersectionDoubleLoop(list1, list2) {
    const result = [];
    for (let i = 0; i < list1.length; i++) {
        for (let j = 0; j < list2.length; j++) {
            if (list1[i] === list2[j]) {
                result.push(list1[i]);
                break; // 避免重複加入
            }
        }
    }
    return result;
}

⚠️ 若陣列含重複值,結果會重複;需額外去重。

方案二:Set + filter(推薦、O(n+m))

function intersectionSet(list1, list2) {
    const set2 = new Set(list2); // O(m) 建立查找表
    return [...new Set(list1.filter(x => set2.has(x)))]; // 去重 + 過濾
}
  • Set.has() 平均 O(1),整體線性複雜度。
  • 外層 new Set(...) 自動去重,結果無重複值。
  • ES6+ 環境通用,程式碼簡潔。

方案三:排序雙指標(適合已排序大陣列、O(n log n))

function intersectionSorted(arr1, arr2) {
    const a = [...arr1].sort((x,y)=>x-y);
    const b = [...arr2].sort((x,y)=>x-y);
    const res = [];
    let i=0, j=0;
    while (i

效能測試參考(Node 18,陣列長度 10 萬)

方法耗時記憶體
雙重迴圈~12 秒低
Set + filter~15 ms中
排序雙指標~40 ms中

總結建議

  • 一般情況:**Set + filter** 最佳平衡。
  • 已知陣列已排序且極大:**排序雙指標** 省去建立 Set 開銷。
  • 教學示範演算法思想:雙重迴圈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved