如何在超集中查找不在子集中的项目

时间:2009-12-16 01:16:03

标签: c# linq superset

我知道有一个“不”,因为linq带来了一个不反对的集合,但我担心大的性能什么是最快的算法呢?

3 个答案:

答案 0 :(得分:2)

IEnumerable<T>中删除项目子集的唯一方法是遍历超集,并通过子集循环超集循环中的每个项目,如果在子集中找到该项目,则从超集中删除该项目

这将平均为您提供 O(n²)

现在,如果有关于这些集合的其他信息(可能一个或两个是列表,或者可能是一个或两个序列都已排序),这可以帮助您创建更高性能的解决方案。

如果您有兴趣,这是一个扩展方法,将执行我刚才描述的内容:

public static IEnumerable<T> Exclude<T>
    (this IEnumerable<T> source, IEnumerable<T> items)
{
    foreach (T t in source)
        if (!items.Contains(t))
            yield return t;
}


没关系,请使用Enumerable.Except扩展方法:

  

产生两个序列的集合差异。

答案 1 :(得分:1)

如果你可以按顺序遍历这些集合,你可以通过迭代来保证O(n)行为(而不是“最坏情况下通常为O(n)但可能是O(n²)”,即“散列集”)他们都是锁定的。

例如:

//loop boilerplate
if(itemA < itemB) {
    itemA = a.next();
    continue;
}
if(itemA > itemB) {
    itemB = b.next();
    continue;
}
a.remove(itemA);

您需要自己添加边界检查和其他样板。

答案 2 :(得分:0)

通过将超集转换为哈希表(通常为O(n),但随后允许您在恒定时间内执行查找),可以获得更好的性能。然后,您可以枚举子集并检查超集中是否存在每个项目。整个操作应该占用O(n)额外的内存和O(n)时间。