有人可以解释这段代码的big theta格式的复杂性(以及为什么)?这是我从这个主题的第一个任务,我有点困惑。任何形式的帮助将不胜感激!
for i <-- 1 to n-1
do j <-- 1
while j <= 2*(i+1)
do j <-- j + 1
答案 0 :(得分:0)
我可能错了±1,但我认为将要执行的步骤数是:
sum_ {i = 1} ^ {n-1} 2 *(i + 1)= 2sum_ {i = 1} ^ {n-1} + 2(n-1)=(n ^ 2-n) +(2n-1)= n ^ 2 + n + 1
答案 1 :(得分:0)
n ^ 2,因为循环中有一个循环,这意味着你的指令被执行n * n次
答案 2 :(得分:0)
首先,根据惯例,你的Pseudocode并不完全正确。
for i <-- 1 to n-1
do j <-- 1
while j <= 2*(i+1)
do j <-- j + 1
如果表示如下,上面的伪代码应该更清楚,
for i = 1 to n-1
for j = 1 to (2*(i+1))
// Body of the inner loop
只有当内循环的主体包含常量时间表达式时,才能分析上述伪代码的复杂性。例如,如果操作数足够小,则加法或减法是恒定时间操作。另一方面,如果循环包含对另一个函数的调用,那么复杂性也取决于该被调用函数的复杂性。
如果循环体仅包含常量时间表达式,则可以如下分析复杂性。
外循环执行n-1
次。
内循环执行2*(i+1)
次。
因此内循环中的语句执行4,6,8,...,最后执行2n次。所以执行的指令总数是
4 + 6 + 8 + ... + 2n
= 2 ( 2 + 3 + 4 + ... + n)
= 2 (n(n+1)/2 - 1)
= n(n+1) - 2
执行的指令总数为 n 2 - n - 2 。
因此,复杂性为Θ(n 2 )。