给定 n 组不同大小的整数。每个集合也可能包含重复项。如何找到所有集合的交集。如果一个元素在所有集合中多次出现,则应该在结果中多次添加。
例如,考虑有三个集合 {1,2,2,3,4} {2,2,3,5,6} {1,3,2,2,6}。给定集合的交集应该是 {2,2,3}
以下是解决此问题的有效方法。
1.对所有集合进行排序。
2.取最小的集合,将所有元素及其频率插入到映射中。
3.对地图中的每个元素执行以下操作
... ..一。如果该元素不存在于任何集合中,则忽略它
...。B。查找每个集合中元素的频率(使用二进制搜索)。如果它小于地图中的频率,则更新频率
... ..℃。如果在所有集合中都找到该元素,则将其添加到结果中。
这是上述方法的 C++ 实现。
// C++ program to find intersection of n sets
#include
#include
#include
#include
输出:
时间复杂度:假设有“n”个列表,列表的平均大小为“m”。排序阶段需要 O( n* m *log m) 时间(排序 n 个平均长度为 m 的列表)。搜索阶段需要 O( m * n * log m) 时间。 (对于列表中的每个元素,我们用 log m 时间搜索 n 个列表)。所以总的时间复杂度是 O( n*m*log m )。
辅助空间:用于存储地图的 O(m) 空间。