在不使用任何数据结构的情况下查找两组交集的算法

时间:2012-10-12 17:06:25

标签: algorithm sorting

我想知道算法确定两个相等元素数组(比如整数)的交集,而不使用任何外部数据结构(如哈希表)(O(nlogn))?

3 个答案:

答案 0 :(得分:10)

排序,然后使用迭代器迭代到每个元素数组:

if A[iter1] > B[iter2]: increase iter2
else if A[iter1] < B[iter2]: increase iter1
else: element is in intersection, print and increase both iters

排序为O(nlogn),迭代为O(n),总计O(nlogn)

答案 1 :(得分:2)

  • 对数组进行排序
  • 循环播放并存储匹配

像...一样的东西。

var A = [0...N];
var B = [0...N];
var result = [];
Array.sort(A);
Array.Sort(B);
for(var x=0, y=0; x < N && y < N; x++) {
    while(A[x] < B[y] && y < N) {
        y++;
    }
    if(A[x] == B[y]) {
        result.push( B[y++] );
    }
}

答案 2 :(得分:0)

n集的交集

给出n组不同大小的整数。每组也可能包含重复项。如何找到所有集合的交集。如果一个元素在所有集合中多次出现,则应在结果中多次添加该元素。

例如,考虑有三组{1,2,2,3,4} {2,2,3,5,6} {1,3,2,2,6}。给定集合的交集应为{2,2,3}

以下是解决此问题的有效方法。

  1. 对所有集合进行排序。
  2. 取最小的一组,并将所有元素及其频率插入地图。
  3. 对于地图中的每个元素,请执行以下操作 …..一个。如果该元素不存在于任何集合中,请忽略它 ... ..b。查找每个集合中元素的频率(使用二进制搜索)。如果它小于地图中的频率,请更新频率 …..C。如果在所有集合中找到该元素,请将其添加到结果中。
  4. 时间复杂度:让'n'列表,列表的平均大小为'm'。排序阶段需要O(n * m * log m)时间(排序n个列表,平均长度为m)。搜索阶段需要O(m * n * log m)时间。 (对于列表中的每个元素,我们使用log m time搜索n个列表)。因此总体时间复杂度为O(n m log m)。

    辅助空间:用于存储地图的O(m)空间。