给定两个(有序或无序)设置相同类型元素的A和B,其中A,B或两者中存在任意数量的元素。
我想确定A中哪些元素不包含在B中以及哪些B元素未包含在A中。
这可以通过
轻松完成var dA = A.Except(B);
var dB = B.Except(A);
我的问题:这是否是此任务最有效的算法?
由于上面对两个集合进行了迭代,看起来我们可以重新使用第一次迭代中的一些信息来减少在第二次迭代上花费的精力。
答案 0 :(得分:2)
设n
为A
集的大小,m
为set B
的大小。如果我们假设A
和B
被实现为哈希表,则可以使用简单的O(min(n,m))
预期时间算法来查找A \ B
和B \ A
。
W.l.o.g让n < m
(否则交换集合)。
A
。对于每个元素,检查它是否也在B
中。如果是,请将其从B
中删除。如果不是,请将其添加到dA
。结果将在dA
和B
中。
如果你不想销毁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)