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