说a,b,c都是List<t>
我想创建它们的未排序联合。尽管性能并不是超级关键,但它们可能每个都有 10,000 个条目,因此我热衷于避免 O(n^2) 解决方案。
AFAICT MSDN 文档没有提及有关不同类型的 union 的性能特征。
我的直觉告诉我如果我这样做a.Union(b).Union(c)
,这将花费 O(n^2) 时间,但是new Hashset<t>(a).Union(b).Union(c)
将是 O(n)。
有人有任何文件或指标来证实或否认这个假设吗?
你应该使用Enumerable.Union
因为它的效率与HashSet
方法。复杂度为 O(n+m),因为:
Enumerable.Union https://msdn.microsoft.com/en-us/library/bb341731(v=vs.110).aspx
当该方法返回的对象被枚举时,Union<TSource>
e按顺序计算第一和第二并产生每个元素
尚未产生。
源代码here https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,f46b208108fc16dd.
Ivan https://stackoverflow.com/a/44884681/284240是的,如果你使用的话会有开销Enumerable.Union
具有多个集合,因为必须为每个链式调用创建一个新集合。因此,如果您使用以下方法之一,它可能会更有效(就内存消耗而言):
-
Concat
+ Distinct
:
a.Concat(b).Concat(c)...Concat(x).Distinct()
-
Union
+ Concat
a.Union(b.Concat(c)...Concat(x))
-
HashSet<T>构造函数 https://msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx这需要IEnumerable<T>
(例如与int
):
new HashSet<int>(a.Concat(b).Concat(c)...Concat(x))
前两者之间的差异可能可以忽略不计。第三种方法不使用延迟执行,它创建一个HashSet<>
在记忆中。这是一种很好且有效的方法 1. 如果您需要此集合类型或 2. 如果这是查询的最终操作。但是,如果您需要对此链式查询进行进一步操作,您应该更喜欢Concat + Distinct
or Union + Concat
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)