以下代码的Big-Theta表示法中最差的运行时间是多少?该代码在降低最低分数后,从家庭作业分数列表中计算出家庭作业分数的平均值。
m := 1
for i := 2 to n
if h_i < h_m then m := i
total := 0
for j := 1 to n
if j != m then total := total + h_j
return total/(n − 1)
在最坏的情况下,这意味着最低分位于最后位置。这意味着在第一个循环中,它将运行n-1次迭代。第一个循环的上限和下限分别是O(n)和Ω(n)。我相信这意味着它的运行时间为Θ(n)
第二个循环几乎是一样的,除了它是n次迭代。
我想知道整个程序的整体运行时间,我们是否使用max(Θ(n),Θ(n))=Θ(n),就像我们使用big-O表示法一样,即max(O(n), (O(1))= O(n)?
我问了这个问题,因为据说我修改了上面的代码只能在一个循环上运行: -
m := 1 ; total = h_1
for i := 2 to n
if h_i < h_m then m := i
total = total + h_i
total = total - h_m
return total/(n − 1)
此代码还运行n-1次迭代=&gt; Θ(n)中。现在这对我来说似乎很奇怪,因为显然第一个代码的运行时比第二个代码长,因为它有两个循环。这就是为什么我问的是使用max(Θ(f(n)),Θ(g(n))是否正确。
答案 0 :(得分:1)
与big-O表示法相同,常数因素被删除。所以整个运行时都是Θ(2n) = Θ(n)
。
此外,具有两个循环并不意味着更长的运行时间,因为循环可以更短或每次迭代更少。你的第二个程序每次迭代都做得更多,因此总运行时间大致相同。
答案 1 :(得分:1)
你会陷入一个常见的错误,认为大O /θ符号会告诉你运行时间。它没有,它告诉你运行时间(渐近)如何缩放为n
的函数。如果算法1在n
中线性增长,并且算法2的运行时间比算法1长两倍,则算法2仍然具有线性增长。这就是我们忽略big-O /θ的任何缩放常数的原因。
答案 2 :(得分:0)
在迭代完成之前,您不会返回,这意味着您始终会查看完整列表