【问题标题】:How can we compute the time complexity of the below function我们如何计算以下函数的时间复杂度
【发布时间】:2022-01-05 03:29:27
【问题描述】:
void f(int n) 
{
 doOh(n);
 if(n<1) return;
 for(int i=0; i<2; i++)
 {
   f(n/2);
 }
}

doOh(n) 的时间复杂度是 O(N)。 我们如何计算给定函数的时间复杂度。

【问题讨论】:

  • 通过编写时间复杂性的递归并通过主定理求解。
  • 问问自己,如果 n 很大,函数多久会调用一次自己? (2倍,一半大小)
  • 你能解释一下计算吗,我是初学者。
  • @tom:理解老师的解释并练习是你的责任。否则你学不会。

标签: c++ algorithm


【解决方案1】:

将复杂度表示为T(n),代码表示

T(n) = T0 if n = 0
     = O(n) + 2 T(n/2) otherwise

对于某些c*,我们可以通过将O(n) 替换为c n 来获得上限,然后我们展开

T(n) = c n + 2 T(n/2)
     = c n + 2 c n/2 + 4 T(n/4) 
     = c n + 2 c n/2 + 4 c n/4 + 8 T(n/8) 
     = ...

求和在n &lt; 2^l 时停止,其中ln 的有效位数。因此我们得出结论

T(n) = O(l c n + 2^l T0) = O(l n).

*从技术上讲,我们只能从n &gt; 一些N 开始这样做。但这并没有改变关于T的渐近行为的结论。

【讨论】:

  • 您的解决方案是正确的,AFAIK,但我猜O(n log n) 更容易理解。这只是一个观点,可能是错误的。
  • @user1984: log n 不直观。 log2 n 更好。但是 IMO 可以说这是减半的数量,直到你变为零,即位数。 (是的,我知道新手不会立即将此与对数联系起来。生活就是生活。)我将 m 重命名为 l
  • 没问题,而且是正确的。别担心:D
【解决方案2】:

复杂度 = O(nlog2n)

原因是

  • 每次调用 f(n) 时,都会调用 doOh(n)。正如你提到的,当我们在 f(n) 中传递 n 时,它的时间复杂度是 O(n)
  • f(n) 将调用 f(n/2) 2 次。所以时间复杂度将是 2*O(f(n/2)) = O(f(n/2))
  • f(n) 正在变为 f(n/2)。 f(n/2) 正在变成 f(n/4) 等等......这意味着这个 f(n) 将被调用 log2n 次(logn base 2 次)。
  • 因此,doOh(n) 还将创建 n + n/2 + n/4 等时间复杂度 logn 次。
  • n 或 n/2 或 n/4 都具有 O(n) 复杂度。 因此,总时间复杂度为 O(logn) * O(n),即 nlogn base 2 = O(nlog2n) 的阶

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多