【问题标题】:Breakdown of the cost and time required for Fizzbuzz in worst caseFizzbuzz 在最坏情况下所需的成本和时间分解
【发布时间】:2014-06-26 06:19:46
【问题描述】:

Fizz-Buzz 函数(伪代码)采用任何正整数 n。我特别好奇 if-else 语句所需的成本和时间的代数分解。我知道它最坏情况下的运行时间是 O(n)。

Fizz-Bizz(n)
  for i = 1 to n
    if (n % 3 == 0)
      print "fizz"
    if (n % 5 == 0)
      print "buzz"
    if (n % 3 != 0 and n % 5 != 0)
      print n

另一种算法的故障示例:

【问题讨论】:

  • 运行时间取决于很多事情。时间复杂度为 O(n)。 ifelse 的性能与复杂性无关,只要它们与输入(它们是)相比是恒定时间的。

标签: algorithm time-complexity fizzbuzz


【解决方案1】:

时间复杂度为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

根据您的示例将所有这些加起来(用ab 替换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 的常数乘数。

现在,如果您在上面的这些等式中发现一个小错误,我不会感到惊讶 - 我已经好几年没做过这种级别的数学了,我可能会如果这是为了家庭作业而你尝试逐字复制它:-)

但您可能会发现的唯一错误是常量乘数本身的。它仍然是某些描述的常数乘数,我保证。

【讨论】:

  • 你能分解一下 if-else 语句的成本吗?喜欢用代数术语吗?
  • @MNRC,在复杂性分析中,这无关紧要。单次迭代的循环体成本实际上是恒定的,与复杂性无关。
  • @paxdiablo 我刚刚添加了插入排序的代数分解的照片。
  • 是的,我可以看到,而且,如果您想要“奇异的家庭作业”级别的详细信息,您当然可以解决。但你最终会得到我给你的相同的 O(n) 数字:-)
  • @paxdiablo 大崩溃!谢谢!!让我难过的部分是 if-else 语句,因为我的教科书没有包括如何计算它。但我现在看到,无论是否正确,该语句都会运行 n 次。
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2021-07-31
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多