当前位置: 首页 > 编程语言 > C#

创建3个IEnumerables的联合时实现O(n)性能的最简单方法是什么?Share

时间:2023-04-10 13:59:53 C#

创建3个IEnumerables的联合时,实现O(n)性能的最简单方法是什么?假设a、b、c都是列表,我想创建一个未排序的联合。虽然性能不是非常关键,但它们每个可能有10,000个条目,所以我很想避免O(n^2)解决方案。AFAICTMSDN文档在不同类型方面未提及union的性能特征。我的直觉告诉我,如果我只做一个。a.Union(b).Union(c),这将花费O(n^2)时间,但newHashset(a).Union(b).Union(c)将是O(n)。有没有人有任何文件或指标来证实或否认这一假设?您应该使用Enumerable.Union,因为它与HashSet方法一样高效。复杂度为O(n+m),因为:Enumerable.Union在枚举此方法返回的对象时,Unione会按顺序计算第一个和第二个,生成每个尚未生成的元素。源代码在这里。Ivan是对的,如果对多个集合使用Enumerable.Union会产生开销,因为必须为每个链式调用创建一个新集合。因此,如果您使用以下之一,它可能会更有效(就内存消耗而言):Concat+Distinct:a.Concat(b).Concat(c)....Concat(x).Distinct()Union+Concata.Union(b.Concat(c)...Concat(x))采用IEnumerableHashSet构造函数(fewithint):newHashSet(a.Concat(b).Concat(c)...Concat(x))前两者之间的差异可以忽略不计。第三种方法不使用延迟执行,它在内存中创建HashSet。这是一种出色且高效的方法1.如果您需要此集合类型或2.如果这是查询的最终操作。但是如果你需要对这个链式查询进行进一步的操作,你应该更喜欢Concat+Distinct或Union+Concat。虽然@TimSchmelter关于Enumerable.Union方法的线性时间复杂度是正确的,但链接多个Union运算符有一个隐藏的开销,每个Union运算符在内部创建一个哈希集,该哈希集本质上是从前一个运算符(加上其他项目)复制HashSet,因此使用比单个HashSet方法更多的内存。如果我们认为Union只是Concat+Distinct的快捷方式,那么具有与HashSet相同的时间/空间复杂度的可扩展LINQ解决方案将是:a.Concat(b).Concat(c)...Concat(x)。Distinct()联合是O(n)。a.Union(b).Union(c)在大多数实现中比a.Union(b.Concat(c))效率低,因为它为第一个联合操作创建哈希集,然后为另一个a.Union(b.Concat(c))如其他答案所说,创建另一个哈希集。这两者最终都使用了一系列IEnumerator对象,这会随着添加更多资源而增加成本。a.Union(b).Union(c)在.NETCore中效率更高,因为第二个.Union()操作生成一个知道a、b和c的对象,这将为整个操作创建一个哈希集,并避免链接IEnumerator对象。C#学习教程就是这样:创建3个IEnumerable的并集时实现O(n)性能的最简单方法是什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: