如果函数具有O(N)复杂度并且在if语句中调用它仍然是O(1)?
例如:
f(x);
if (f2(x))
f3(x);
其中f(x)为O(N)f2(x)为O(N)且f3(x)为O(Nlog2N)。
在条件为真的最坏情况下,这个片段的总体复杂度是O(Nlog2N)吗?
答案 0 :(得分:1)
Big O返回时间复杂度或算法空间的上限(最差情况)。
条件语句是O(1)。
if (f2(x))
可以写成
boolean b = f2(x);
if(b){...}
因此,上面的条件有O(1),而高于它的f2(x)的评估是O(N)。 因此该集合将具有O(N)复杂性。
你会把最坏的情况,条件评估转为真,然后计算它。 O(Nlog2N)将是您问题中该块的整体复杂性。
<强> (Rules) 强>
答案 1 :(得分:1)
是。这是最糟糕的情况。 在一种情况下,它是o(n)和其他情况o(N lg n)。
因此,既然我们对最坏的情况感兴趣,我们会说它是后者。
答案 2 :(得分:0)
Big-O是一个上限,因此片段f1(); if(f2()) f3();
是O(f1 + f2 + f3)
。在不知道任何其他事情的情况下,这将是最好的结果(因为你必须假设最坏情况的行为)。
但是,如果证明 f2
为假(例如,因为您已经到达分析中数据结构的末尾),则可以将其降低到{{1 }}。这有时是必要的,例如在分析递归算法的基本情况时。