时间复杂度为O(n),因为if 语句对此没有实际影响。 if 语句的复杂性在足够大的数据集上是恒定的。
if 语句实际上可能在迭代中执行不同数量的工作,其中您有 3 或 5 的倍数,但是,每次循环迭代的额外工作量不依赖于 @987654325 @。事实上,随着n 变大,它的平均值会变成一个常数。
顺便说一句,我认为代码可能是错误的。在 15 的倍数时,它应该同时打印 fizz 和 buzz。
如果您想在编辑中做到这一点(添加的细分),您只需为每个语句分配一个任意成本c<sub>i</sub>(并且该成本对于该语句的单次执行是恒定的)然后算出每条语句运行了多少次。
例如,第一个if 序列运行n 次,print "fizz" 运行其中的三分之一,n/3。所以你最终会得到这样的表格:
cost times
Fizz-Buzz(n)
for i = 1 to n c1 n
if (n % 3 == 0) c2 n
print "fizz" c3 n / 3 [call this a]
else
if (n % 5 == 0) c4 n - a
print "buzz" c5 (n - a) / 5 [call this b]
else
print n c6 n - a - b
根据您的示例将所有这些加起来(用a 和b 替换n-方程),最后,您会仍然得到一些东西依赖于n,因此是O(n) 算法。它看起来像:
c1*n + c2*n + c3*n/3 + c4*(n-a) + c5*(n-a)/5 + c6*(n-a-b)
= c1*n + c2*n + (c3/3)*n + c4*(n-n/3) + (c5/5)*(n-n/3) + c6*(n-n/3-(n-n/3)/5)
= c1*n + c2*n + (c3/3)*n + c4*(2/3)*n + (c5/5)*(2/3)*n + c6*(n-n/3-(n-n/3)/5)
= c1*n + c2*n + (c3/3)*n + (c4*2/3)*n + (c5*2/15)*n + c6*(n*8/15)
= c1*n + c2*n + (c3/3)*n + (c4*2/3)*n + (c5*2/15)*n + (c6*8/15)*n
/ 1 2 2 8 \
= ( c1 + c2 + - c3 + - c4 + -- c5 + -- c6 ) * n
\ 3 3 15 15 /
括号内的所有值实际上都是常数(因为它们是常数的倍数)所以整个事情是n 的常数乘数。
现在,如果您在上面的这些等式中发现一个小错误,我不会太感到惊讶 - 我已经好几年没做过这种级别的数学了,我可能会如果这是为了家庭作业而你尝试逐字复制它:-)
但您可能会发现的唯一错误是常量乘数本身的值。它仍然是某些描述的常数乘数,我保证。