C ++以0(n + m)复杂度搜索具有不同长度的多个数组的交集

Posted

技术标签:

【中文标题】C ++以0(n + m)复杂度搜索具有不同长度的多个数组的交集【英文标题】:C++ Searching for the intersect of multiple arrays with different lengths in 0(n+m) complexity 【发布时间】:2016-12-16 16:05:50 【问题描述】:

目前我有多个不同长度的有序数组

int * arrs[5];
int arrs_length[5];
int arr0[] = 1, 5, 8;
int arr1[] = 1, 2, 3, 5, 7, 10, 11, 15;
int arr2[] = 1, 4, 5, 6;
int arr3[] = 1, 5, 9, 14, 16, 19;
int arr4[] = 1, 2, 4, 5, 6, 9, 9;
arrs[0] = arr0;
arrs_length[0] = sizeof(arr0) / sizeof(int);
arrs[1] = arr1;
arrs_length[1] = sizeof(arr1) / sizeof(int);
arrs[2] = arr2;
arrs_length[2] = sizeof(arr2) / sizeof(int);
arrs[3] = arr3;
arrs_length[3] = sizeof(arr3) / sizeof(int);
arrs[4] = arr4;
arrs_length[4] = sizeof(arr4) / sizeof(int);

我正在尝试输出这些数组的交集。

我首先使用其中一个数组的值创建一个 unordered_map,然后使用 count 函数检查它是否存在。当 1 和 5 不排队时我会遇到问题,但如果他们排队,它就会起作用。

int intersect(int *arrs[], int arrs_length[], int *re_arr, int & re_size)
    unordered_map <int,int> myMap;
    int j=0;
    for (int i=0; i<arrs_length[0]; i++)
        myMap[arrs[0][i]];
    

谁能告诉我如何正确搜索无序映射并一次搜索多个数组?

【问题讨论】:

nm 是什么? std::set_intersection 可能会有所帮助。 @alexeykuzmin0 n 是所有数组加起来的总长度 @ZacharyLevinson 和m? @alexeykuzmin0 m 是数组的数量 【参考方案1】:

您可以维护一个无序映射并执行以下操作:

您可以为每个数组创建一个空的无序集。然后,您可以对其进行迭代并将 +1 添加到全局映射中的当前元素(如果它不在当前集合中)并将其添加到集合中。如果它已经存在,请忽略它。

检查所有数组后,您应该打印地图中的元素,如果它们的值等于数组的数量。

这个解决方案在输入的大小上是线性的,因此它具有最佳的时间复杂度。

【讨论】:

以上是关于C ++以0(n + m)复杂度搜索具有不同长度的多个数组的交集的主要内容,如果未能解决你的问题,请参考以下文章

元组的定义和初始化,其元素具有相同的模板类,但具有不同的特化

回文树(模板)

Codeforces Round #369 (Div. 2)-C. Coloring Trees DP

c语言:输入是一个n*m的矩阵,要求找到其中最大的全0字矩阵。怎么算?

Python:计算具有不同长度的列表列表中第 n 个元素的平均值

C语言 分离字符串中的字母、数字、符号