【问题标题】:Time Complexity Analysis Dependent nested loop时间复杂度分析依赖嵌套循环
【发布时间】:2014-12-19 17:46:04
【问题描述】:

我很难理解嵌套循环的时间复杂度。我已经搜索了数周的在线资源/书籍/等。但我就是不明白嵌套依赖循环是如何工作的。以这个为例

for (int i=0; i<n; i++) //n is even //n + 1
    for (int j=i; j<n/2; j++) //(n/2 + 3)*n/4 + n/2 = n2/8+5n/4
        cout << i << “,” << j <<endl; //(n/2 + 1)*n/4 = n2/8 + n/4 

时间复杂度在 cmets 中,但我不明白它是如何得出这个答案的。我理解第一个循环中的 n+1;它运行 n 次加上失败案例。但从那里我不明白。如果有人能清楚地向我解释,我将不胜感激。

我也尝试用 n 值写出来,但我不明白如何处理跟踪以达到那种复杂性。

【问题讨论】:

  • 您是在寻找“大 O”表示法(双循环是 O(N*N)),还是在更详细的级别。请注意,对于从 (n+3)/2 到 n-1 的 i 值,内部循环根本不执行,因为 j 已经大于 n/2。
  • 更详细的级别,基本上注释的是每一行的时间复杂度,我正在试图弄清楚我是如何得到这些的。

标签: time complexity-theory


【解决方案1】:

第二个循环的迭代次数可以使用算术级数之和来计算。我们来观察i被迭代时它做了多少次迭代:

  • 当 i 为 0 时,它会执行 n/2 次迭代(j = 0, 1, .... n/2 - 1)
  • 当 i 为 1 时,它执行 n/2 - 1 次迭代(j = 1, .... n/2 - 1)
  • 当 i 为 n/2 - 1 时,它执行 1 次迭代(j = n/2 - 1)
  • 当 i >= n/2 时,它执行 0 次迭代

因此总体迭代次数为:n/2 + (n/2 - 1) + ... + 1 = ((n/2 + 1) * (n / 2)) / 2 = (n /2 + 1) * (n / 4) - 这里我使用算术级数之和的公式。这正是您提到的值(尽管表示方式有所不同)。

至于外层值 - (n/2 + 3)*n/4 + n/2 = n2/8+5n/4 - 对于i的每个值,循环会再执行一次操作 - 到验证j 是否超过限制n / 2。因此,您必须求和 ((n / 2 + 1) + (n / 2) + .... + 2) + 1 * (n / 2) - 第一个总和是针对不大于 n / 2 的元素 - 1,第二个用于其余立即未通过检查 j

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多