大O - 最坏情况/最佳案例确认

时间:2017-04-10 08:00:21

标签: python big-o

我想确认我的想法对于以下代码的最坏情况/最佳案例场景是正确的:

def function2(L, x):
ans = 0
index = len(L)
while (index > 0):
    i = 0
    while i < 1000000:
        i = i + 1
    ans = ans + L[index - 1]
    index = index // 2

if (x == L[-1]):
    return ans
else:
    for i in range(len(L)):
        ans = ans + 1
return ans

我认为最好的情况是O(sqrt(n))因为索引// 2是它最好的因素。我认为最坏的情况是o(n + sqrt(n)因为else语句正在添加常量运行时。这是正确的吗?

1 个答案:

答案 0 :(得分:0)

  

我认为最好的情况是O(sqrt(n))因为索引// 2是它最好的因素。

不太确定你的意思&#34;索引// 2是它最好的因素&#34;。无论您有什么输入,索引// 2都将成为&#34;因素&#34;最佳/最差/平均情况。

每次迭代都会将

index减少一半,因此您的循环复杂度不是sqrt(n)而是log(n)。 (请查看here以获取有关原因的更详细说明。)

  

我认为最坏的情况是o(n + sqrt(n)因为else语句正在添加常量运行时。

小心使用&#34; O&#34; vs&#34; o&#34;。 Little-o完全是一个完全不同的符号,你不想让他们感到困惑。 (在复杂性中添加n不是添加常量运行时,n是变量而不是常量)

Big-O是包含上限,因此对于:

  • 最佳案例,当x == L[-1]时,代码在 O(登录)时间内运行。
  • 最坏情况,当x != L[-1]时,第一个循环在 O(logn)时运行,第二个循环在 O(n)中运行时间。由于Big-O正在寻找上界,因为我们知道O(n)比O(logn)花费更多时间,我们的复杂性只是 O(n)