【问题标题】:Understanding time complexity: iterative algorithm理解时间复杂度:迭代算法
【发布时间】:2019-01-26 04:48:49
【问题描述】:

我是新来的时间复杂性,我似乎无法理解最后得到这个背后的逻辑:

100 (n(n+1) / 2)

对于这个功能:

function a() {
    int i,j,k,n;
        for(i=1; i<=n; i++) {
            for(j=1; j<=i; j++) {
                for(k=1; k<=100; k++) {
                    print("hello");
                }
            }
        }
}

我是这样理解它的算法的:

i = 1, 2, 3, 4...n

j = 1, 2, 3, 4...(dependent to i, which can be 'n')

k = 1(100), 2(100), 3(100), 4(100)...n(100)
  = 100 [1, 2, 3, 4.....]

如果我使用上面的这个算法来模拟最终方程,我会得到这个结果:

结束方程:

100 (n(n+1) / 2)

模拟

   i = 1, 2, 3, 4... n
   j = 1, 2, 3, 4... n
   k = 100, 300, 600, 10000

我通常在 youtube 上研究这些并得到 Big O、Omega 和 Theta 的想法,但是当谈到这个时,我无法弄清楚它们是如何以我给出的等式结尾的。请提供帮助,如果您有一些最佳做法,请分享。

编辑: 至于我自己的假设答案,它认为应该是这个:

100 ((n+n)/2) or 100 (2n / 2)

来源:

https://www.youtube.com/watch?v=FEnwM-iDb2g
At around: 15:21

【问题讨论】:

  • 一般来说,如果可以的话,您会希望降低时间复杂度。 O(100 (2n/2))O(n) 相同,因为 big-O 确实如此不关心乘以常数。

标签: time-complexity computer-science complexity-theory


【解决方案1】:

我认为你的ij 是正确的,只是不清楚你为什么说k = 100, 200, 300... 在每个循环中,k1 运行到100

所以让我们先考虑一下内部循环:

        k from 1 to 100:
            // Do something

内部循环是O(100) = O(1),因为它的运行时间不依赖于n。现在我们分析外循环:

i from 1 to n:
    j from 1 to i:
        // Do inner stuff

现在让我们计算Do inner stuff 执行了多少次:

i = 1     1 time
i = 2     2 times
i = 3     3 times
 ...        ...
i = n     n times

这是我们的经典triangular sum1 + 2 + 3 + ... n = n(n+1) / 2。因此,外部两个循环的时间复杂度为 O(n(n+1)/2) 减少到 O(n^2 )

整个事情的时间复杂度是 O(1 * n^2) = O(n^2) 因为嵌套循环会增加复杂度(假设运行时内循环的变量独立于外循环中的变量)。这里注意,如果我们没有在各个阶段减少,我们将剩下 O(100(n)(n+1)/2),相当于O(n^2) 因为大 O 表示法的特性。

一些提示: 您要求提供一些最佳实践。以下是我在分析您发布的示例时使用的一些“规则”。

  • 在时间复杂度分析中,我们可以忽略乘以一个常数。这就是为什么内部循环即使执行了 100 次仍然是 O(1)。理解这一点是时间复杂度的基础。我们正在大规模分析运行时间,而不是计算时钟周期数。
  • 对于运行时相互独立的嵌套循环,只需增加复杂性即可。将 O(1) 循环嵌套在外部 O(N^2) 循环中会导致 O(N^2) 代码。

  • 更多缩减规则:http://courses.washington.edu/css162/rnash/quarters/current/labs/bigOLab/lab9.htm

如果您可以将代码分解成更小的部分(就像我们将 k 循环与外部循环分开分析的方式一样),那么您可以利用嵌套规则来找到组合的复杂性。

关于 Omega/Theta 的注意事项:

Theta 是时间复杂度的“精确界限”,而 Big-O 和 Omega 分别是上限和下限。因为没有随机数据(就像排序算法中的那样),我们可以得到时间复杂度的精确界限,并且上限等于下限。因此,在这种情况下,我们使用 O、Omega 或 Theta 没有任何区别。

【讨论】:

  • 感谢您的详细介绍,先生 :) 非常感谢,因为我是这个主题的新手。我目前正在阅读您在答案中添加的所有链接,因为这将有助于我进一步了解时间复杂性
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 2021-11-15
  • 2023-03-04
  • 2023-03-24
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多