Самый быстрый способ проверить, содержат ли 2 массива одинаковые значения в javascript - PullRequest
3 голосов
/ 22 апреля 2020

Есть ли более быстрый или более эффективный способ проверить, что два массива содержат одинаковые значения в javascript?

Вот что я сейчас делаю, чтобы проверить это. Работает, но долго.

    var arraysAreDifferent = false;
    for (var i = 0; i < array1.length; i++) {
      if (!array2.includes(array1[i])) {
        arraysAreDifferent = true;
      }
    }
    for (var i = 0; i < array2.length; i++) {
      if (!array1.includes(array2[i])) {
        arraysAreDifferent = true;
      }
    }

Ответы [ 2 ]

4 голосов
/ 22 апреля 2020

Чтобы уменьшить вычислительную сложность с O(n ^ 2) до O(n), используйте вместо этого наборы - Set.has равно O(1), но Array.includes равно O(n).

Вместо обычного for Подробная ручная итерация l oop, используйте .every, чтобы проверить, проходит ли каждый элемент в массиве тест. Также убедитесь, что размеры обоих множеств одинаковы - если это сделано, то, если один из массивов итерируется, нет необходимости перебирать другой (кроме как для построения его набора):

const arr1Set = new Set(array1);
const arr2Set = new Set(array2);
const arraysAreDifferent = (
  arr1Set.size === arr2Set.size &&
  array1.every(item => arr2Set.has(item))

);
0 голосов
/ 22 апреля 2020

function same(arr1, arr2){
    //----if you want to check by length as well 
    // if(arr1.length != arr2.length){
    //     return false;
    // }

    // creating an object with key => arr1 value and value => number of time that value repeat;
    let frequencyCounter1 = {};
    let frequencyCounter2 = {};
    for(let val of arr1){
        frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
    }
    for(let val of arr2){
        frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1;
    }
    for(let key in frequencyCounter1){
        //check if the key is present in arr2 or not 
        if(!(key in frequencyCounter2)) return false;
        //check the number of times the value repetiton is same or not;
        if(frequencyCounter2[key]!==frequencyCounter1[key]) return false;
    }
    return true;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...