簡體   English   中英

使用for循環檢查兩個數組中的匹配值,迭代較小的循環是否更快?

[英]Checking for matching values in two arrays using for loop, is it faster to iterate through the smaller loop?

我正在創建一個函數,該函數將接受兩個參數,每個參數均為數組,並返回兩個數組之間匹配值的單獨數組。
我做了兩個版本的函數,

  1. 默認值在for循環中循環訪問第一個參數,並使用.includes()檢查第二個參數的匹配值

例如:

var matches = [];
for (let i = 0, len = array1.length; i < len; i++) {
    var a = array1[i];
    if (array2.includes(a)) {
        matches.push(a)
    }
  1. 測量並比較兩個數組的長度,然后選擇較短的數組在for循環中進行迭代

例如:

if (array1.length <= array2.length) {
    var itArr = array1;
    var checkArr = array2 }
else { var itArr = array2
       var checkArr = array1 };
var matches = [];
for (let i = 0, len = itArr.length; i < len; i++) {
    var a = itArr[i];
    if (checkArr.includes(a)) {
        matches.push(a)
    }

我的問題是,這是否實際上會提高性能,或沒有任何區別,還是會損害性能(通過添加更多變量定義,計算等)?

這不會產生重大差異,因為最壞情況下的復雜度為O(n * m) ,其中n和m是數組的長度。

您可以對2個數組進行排序,並使用2個指針找到交點,在這種情況下,時間復雜度為O(nlogn + mlogm + n + m),這取決於所使用的排序算法

我想我會采用第一種方法,因為.includes函數將嘗試對數組進行迭代,並在找到元素時返回true,因此,如果元素位於數組的末尾,則會對其進行完全迭代。 因此,您嘗試選擇較小的選擇不會有太大的不同。

這是使用Set來查看一個數組是否包含另一個數組的值的示例。

如果您不是ES6,(為什么不呢?),則可以使用簡單的對象文字。

這應該比執行double for循環更快,因為這將包括include那樣。

 function makeRandom(count, max) { return Array.from(new Array(count), (a,ix) => Math.round(Math.random() * max)); } function union(a,b) { var aSet = new Set(a), oSet = new Set(); b.forEach((v) => { if(aSet.has(v)) oSet.add(v) }); return Array.from(oSet); } const random1 = makeRandom(5, 10), random2 = makeRandom(5, 10); const unionArray = union(random1, random2); console.log(random1.join(':')); console.log(random2.join(':')); console.log(unionArray.join(':')); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM