JavaScript 查找任意数量数组的公共项目

JavaScript 查找任意数量数组的公共项目

问题陈述要求你找到一个解决方案,解决一个任意数量的数组的问题,用户需要在每个任意数组中找到一个共同的元素。这里的任意数组被指称为一个数组对象。不要混淆在两个数组之间找到共同元素,这不是问题陈述所问的。它定义并探索了可以帮助我们在给定的源数据中找到最少公共因子的各种算法,使用的是JavaScript

什么是JavaScript中的任意数量数组

任意数量指的是一个不确定的大量值,它们不遵循任何特定的模式,你随机提供这些值。同样,任意数量的数组指的是超过两组数组,这些数组中没有规律地给出了随机元素,这样的不同数组被打包在一起,形成一个称为数组对象的对象。问题陈述要求找到这些随机、不同且超过两个可计数数组中存在的交集元素。

不同的数组集合可以被打包在一个数组的数组或数组对象中,因为问题陈述没有提到这个条件。

这里的算法讨论了在数组本身中解决任意数量数组的问题陈述。

步骤1: 声明一个名为findCommonElements的函数,将数组作为源输入。

步骤2: 声明并初始化一个结果数组,用空数组。

步骤3: 使用外部循环遍历所有任意数组中的第一个数组,其中i索引将跟踪第一个数组及其元素,从arr.length-1开始向后遍历,因为在存在大型数组或多个数组的情况下,在循环的每次迭代中每次计算length属性是不高效和不必要的。

步骤4: 嵌套的第二个循环将遍历大数组中剩余的数组集合或剩余的任意数组,使用j索引。

步骤5: 使用indexOf方法查找第一个数组中存在的元素的值到剩余的任意集合。

步骤6: 如果第一个数组中的特定值在剩余数组中找不到,我们使用break语句跳过下一次迭代,尝试在其他任意数组中找到共同的元素。

步骤7: 一旦所有的循环都结束了,我们使用j索引来判断它的值是否达到了第一个数组本身,这是进行比较的主要源,只要在比较过程中从arr[0][i]得到的任何值都将被推送到结果数组中,因为数组不能与自身进行比较。

主代码-使用循环

示例

function findCommonElements(arr) {
  let commonArray = [];
  for (let i = arr[0].length - 1; i >= 0; i--) {
   let isCommon = true;
   for (let j = arr.length - 1; j > 0; j--) {
    if (arr[j].indexOf(arr[0][i]) === -1) {
     isCommon = false;
     break;
    }
   }
   if (isCommon) {
    commonArray.push(arr[0][i]);
   }
  }
  return commonArray;
}

const arrayOfArrays = [
  [1, 4, 6, 78, 8, 9, 124, 44],
  [44, 6, 9],
  [124, 44, 16, 9]
];

console.log(findCommonElements(arrayOfArrays));

输出

[ 44, 9 ]

时间和空间复杂度

在上述算法中,我们使用了一个嵌套循环,循环次数与数组长度相同,因此最坏情况下的时间复杂度为O(n^2)。空间复杂度为O(1)。

上述算法可以通过在JavaScript中使用映射和集合进行优化。

方法- 使用映射和集合

现在,该算法在时间复杂度方面更加高效,但牺牲了空间复杂度。

步骤1: 声明一个名为commonElementFind的函数,该函数以mainArray作为输入源。

步骤2: 声明并初始化一个空值的映射。

步骤3:我们将遍历数组的每个子数组,将其转换为Set,以在JavaScript中去除重复项并使算法更高效、更快地找到存在于任意数量数组中的公共元素。

步骤4: 一旦每个子数组都被转换为唯一的Set,我们将通过计数它们在整个常用和单一映射中的出现次数来设置它们的值。

步骤5: 如果Set的值已经在映射中存在,则将其值加1,否则初始化并将其值设置为1。

步骤6: 一旦所有循环和遍历每个Set元素的操作都完成,我们将映射对象的键映射为检查映射中的任何键的长度是否等于数组的长度,这将明确指示公共元素的行为。

步骤7: 一旦我们找到长度等于数组长度的键,那么这个特定元素就已经出现在所有子数组中,因此我们可以找到在JavaScript中存在于任意数量数组中的值或公共元素。

代码 – 使用映射和集合

示例

function commonElementFind(mainArray)
{   

   const newMap = {};

   for(let subArray of mainArray)
   {  

     const newSet = new Set(subArray);

         newSet.forEach(val => {

       if(newMap[val])
       { 
         newMap[val] = newMap[val] + 1;
       }
       else 
       {
         newMap[val] = 1;
       }
   })

   }
Object.keys(newMap).map((key)=> {

     if(newMap[key] === arr.length) {

       console.log(key);

     }
   });
}

const arr = [
   [15, 23, 36, 49, 104, 211],
   [9, 12, 23],
   [11, 17, 18, 23, 38],
   [13, 21, 23, 27, 40, 85]
  ];

  commonElementFind(arr);

输出

23

时间复杂度和空间复杂度

由于我们使用了JavaScript中的Map和Set等高级概念对算法进行了优化,将时间复杂度从O(n^2)降低到了O(n),但由于使用了额外的内存分配,我们也将空间复杂度以O(n)的线性时间进行了牺牲。

结论

这就是我们在编码的环境中如何在逻辑上和高效地解决上述问题陈述,将代码从嵌套循环转化为Map和Set的功能,这使得我们能够在时间和空间复杂度的线性时间内遍历和执行操作。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程