Concat表现

时间:2010-08-30 22:58:21

标签: c#

我正在msdn上阅读有关迭代器的blog post,其中讨论了Concat O(m^2)的表现如何m是第一个IEnumerable的长度。 richard_deeming在第二页上提出的一条评论提供了一些示例代码,他说这些代码要快得多。我真的不明白为什么它更快,并希望有人可以向我解释。

感谢。

2 个答案:

答案 0 :(得分:2)

他只是说,而不是使用Concat来创建一个迭代器,它实际上等同于创建一个迭代器:

...(((a+b)+c)+d)...

由以下原因引起:

for (int i = 0; i < length; ++i)
    ones = ones.Concat(list); 

创建一个所需的迭代器列表,并返回之前创建的每个迭代器。

这样你就不会在第一个元素集合中结束大量的堆叠迭代器。

还值得一提的是,关于O(m^2)的说法并非“非常正确”。在这种特定情况下确实如此,但这就像在计算+案例时说O(m^2)(((a+b)+c)+d)...。这是使其成为O(m^2)的具体使用模式。

答案 1 :(得分:1)

我不认为博客文章说Concat是O(m ^ 2),至少,它不应该 - 在某一点上提到Concat是O(m + n)的事实 - 并且这更可信。在该帖子中给出的循环中使用Concat是O(m ^ 2) - 我不认为这是一个特别令人震惊的发现,因为你期望许多调用会增加复杂性!

理查德的后续建议将Concat操作推迟到需要之前,存储一个迭代器列表,然后从第一个开始遍历每个操作,然后当它耗尽时,继续前进到下一个,非常有道理 - 然而,对于'轻量级使用',Concat as-is会很好。