collection.Where(i => i.condition)
.ToList()
.ForEach(i => SomeComplicatedOpInvolving_i);
我不是在寻找答案,告诉我有一种更简单的方法可以做到这一点,只需将其视为思想实验。
首先,我认为这是三个循环吗? Where()
,ToList()
和ForEach()
?
第二,(假设它是三个循环)我是否正确地认为这是大O符号中3的幂?
谢谢大家。
答案 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)
。
由于Where
为O(n)
,这意味着对于某些Where
,A x n
的费用约为A
。
同样,ToList
和ForEach
也是O(n)
,这意味着对于某些B x n
和C x n
,其成本分别约为B
和C
一些 (A x n) + (B x n) + (C x n)
= (A + B + C) x n
= D x n
。
这意味着总费用大致为:
D
对于某些A
(我们从未真正关心B
,C
和A + 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)。