【发布时间】:2015-12-06 10:33:29
【问题描述】:
假设我们有这样一个数组:
var arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
我要进行聚合:
var sum = arr.Aggregate((a, b) => a + b);
当然,这只是一个简化的例子。我不处理int,而是需要合并的更复杂的对象(它们是树)。然而,这种聚合的效果真的很糟糕,因为它从左到右迭代,添加了两个相互欺骗的元素。在整数的情况下,这没有任何区别,但在复杂对象的情况下,更好的解决方案是以树的方式执行聚合。什么意思?
55
36 19
10 26 19
3 7 11 15 19
1 2 3 4 5 6 7 8 9 10
我希望这个架构能说明问题。
如何在 C# 的 LINQ 中实现这一点?
【问题讨论】:
-
但是……复杂度不一样吗?您仍然可以遍历每个对象一次。
-
这将是相同的,但可以并行运行。
-
嗯,是的...但是当我处理大树时,每次合并时都会复制它们。因此,第一棵树中的元素将被复制 n - 1 次。即使它们可以被复制 log n 次。
-
因为在此期间它们会更小。例如,在线性列表中,最后一次合并它复制了一个几乎完整的树,但在 log-n-approach 的情况下,它合并了两个相似大小的树。这是一个显着的差异。