我应该如何计算2组的不相交元素?

时间:2014-03-10 18:00:25

标签: c# .net algorithm

给定两个(有序或无序)设置相同类型元素的A和B,其中A,B或两者中存在任意数量的元素。

我想确定A中哪些元素不包含在B中以及哪些B元素未包含在A中。

这可以通过

轻松完成
var dA = A.Except(B);
var dB = B.Except(A);

我的问题:这是否是此任务最有效的算法?

由于上面对两个集合进行了迭代,看起来我们可以重新使用第一次迭代中的一些信息来减少在第二次迭代上花费的精力。

2 个答案:

答案 0 :(得分:2)

nA集的大小,m为set B的大小。如果我们假设AB被实现为哈希表,则可以使用简单的O(min(n,m))预期时间算法来查找A \ BB \ A

W.l.o.g让n < m(否则交换集合)。

  1. 遍历A。对于每个元素,检查它是否也在B中。如果是,请将其从B中删除。如果不是,请将其添加到dA
  2. 我认为会有第二步,但实际上你已经完成了。
  3. 结果将在dAB中。

    如果你不想销毁B,你可以预先创建它的副本,当实现为简单的memcpy时,它应该非常快。

    可以而是使用persistent data structure来代表B,但这会增加相当大的成本并且不太可能有用,除非你的设置尺寸非常不平衡。

答案 1 :(得分:1)

如果您可以按顺序迭代集合,那么可以使用像mergesort的merge-phase这样的算法:

a = A.First
b = B.First
while a <> Nil and b <> Nil do
if a < b
  dA.Add(a)
  a = A.Next 
else if a > b
   dB.Add(b)
   b = B.Next 
else
   a = A.Next 
   b = B.Next 
endwhile
if a <> Nil
   dA.Add(rest of A)
if b <> Nil
   dB.Add(rest of B)