我知道有一个“不”,因为linq带来了一个不反对的集合,但我担心大的性能什么是最快的算法呢?
答案 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)时间。