我是否正确地认为这个片段是O(n ^ 3)?

时间:2011-09-01 09:57:29

标签: c# big-o

collection.Where(i => i.condition)
.ToList()
.ForEach(i => SomeComplicatedOpInvolving_i);

我不是在寻找答案,告诉我有一种更简单的方法可以做到这一点,只需将其视为思想实验。

首先,我认为这是三个循环吗? Where()ToList()ForEach()
第二,(假设它是三个循环)我是否正确地认为这是大O符号中3的幂?

谢谢大家。

6 个答案:

答案 0 :(得分:4)

不,实际上。我认为它应该是O(n)。

Where()在O(n)中运行(假设condition是常数)

ToList()也会运行Where的所有结果,所以O(n)也是

ForEach()运行ToList生成的整个列表一次,O(n)也是如此。我认为SomeComplicatedOpInvolving_i不会与我的数量相比......

这里的关键点是循环没有嵌套,它们一个接一个地运行 - 所以总运行时间是3 * O(n),这与O(n)相同。

答案 1 :(得分:3)

不,它们不是嵌套循环。它是O(n)。

避免使用ToList(),因为没有充分的理由而花费O(n)存储空间。请检查此blog post

答案 2 :(得分:1)

不,这是O(n)。如果循环内的循环内存在循环,则只有O(n^3)

答案 3 :(得分:0)

这是O(n)

由于WhereO(n),这意味着对于某些WhereA x n的费用约为A

同样,ToListForEach也是O(n),这意味着对于某些B x nC x n,其成本分别约为BC一些 (A x n) + (B x n) + (C x n) = (A + B + C) x n = D x n

这意味着总费用大致为:

D

对于某些A(我们从未真正关心BCA + B + C是什么,所以我们也不关心D是什么,所以只需称它O(n)使我们的方程更简单。)

因此,此操作为{{1}}。

答案 4 :(得分:0)

collection.Where(i => i.condition) // is O(n) where n is the size of collection
.ToList() // is O(m) where m is the number if items with i.condition true
.ForEach(i => SomeComplicatedOpInvolving_i);  // O(m) where m is the number if items with i.condition true

假设SomeComplicatedOpInvolving是O(1),例如如果你有更多的物品,它不会更长。

鉴于此

when m is never bigger then n, then 
O(n) + O(m) + O(m) == O(n) 

然后该片段是O(n)

答案 5 :(得分:0)

它是O(collection.Size)* O(SomeComplicatedOpInvolving_i)。