[英]Checking for matching values in two arrays using for loop, is it faster to iterate through the smaller loop?
我正在創建一個函數,該函數將接受兩個參數,每個參數均為數組,並返回兩個數組之間匹配值的單獨數組。
我做了兩個版本的函數,
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)
}
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.