我想确认我的想法对于以下代码的最坏情况/最佳案例场景是正确的:
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语句正在添加常量运行时。这是正确的吗?
答案 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)