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]];
谁能告诉我如何正确搜索无序映射并一次搜索多个数组?
【问题讨论】:
n
和 m
是什么?
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字矩阵。怎么算?