如何在多个数组中找到匹配的值

How to find matching values in several arrays

本文关键字:数组      更新时间:2023-10-16

我有N个整数数组,每个数组的长度未知。我必须在所有数组中找到匹配的对值,最好的方法是什么?例如,给定这个阵列-

const int array_01 [8]  = {1, 8, 6, 7, 9, 1, 3, 7};
const int array_02 [11] = {3, 2, 1, 8, 2, 8, 4, 5, 9, 7, 10};
const int array_03 [10] = {4, 0, 6, 7, 7, 2, 1, 2, 2, 9};

匹配将是-

array_01, array_02 - 1, 3, 7, 8.
array_01, array_03 - 1, 6, 7.
array_02, array_03 - 1, 3.

试试这个。您可以获得2个数组的匹配对。

function match_array(array1, array2){
var match = array();
for(int i = 0; i < array1.length; i++)
     for(int j = 0; j < array2.length; j++){
          if(array1[i] == array2[j]){
                match.push(array1[i]);
          }
     }
     return match;
}

解决此问题的最佳方法是用一个数组的元素准备一个集合std::unordered_setO(n1),其中n1是第一个数组中的元素数)。

然后迭代第二个数组的元素,注意第一个数组中已经存在的元素(O(n2),其中n2是第二个阵列中的元素数量)。

总时间复杂度O(n1 + n2)

如果使用成对的数组进行匹配,那么一开始就有N数组也没有什么区别。

这个实用的例子将两个数组都转换为集合(对于您的目的来说,它更实用),然后迭代:

std::unordered_set<int> set1, set2;
for(int i = 0; i < sizeof(array_01)/sizeof(array_01[0]); i++)
    set1.insert(array_01[i]);
for(int i = 0; i < sizeof(array_02)/sizeof(array_02[0]); i++)
    set2.insert(array_02[i]);

for(auto it = set2.begin(); it != set2.end(); ++it )
    if(set1.count(*it)>0)
        std::cout << "repeated " << *it;