我不明白第二个循环如何具有O(i ^ 2)?

时间:2019-02-16 07:40:23

标签: time-complexity

  

第二个循环从i到i ^ 2 -1,所以没有。的时间= i ^ 2-i + 1

function(int n) {
  

外部运行n次

    for (int i = 0; i < n; i++) {
        for (int j = i; j < i * i; j++) {
            if (j % i == 0) {
  

这将运行j次

                for (int k = 0; k < j; k++) {
                    printf("*");
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您将在这里找到答案

for (int j = i; j < i * i; j++) {

j运行到i ^ 2(或i * i),导致内部循环为O(i ^ 2)

答案 1 :(得分:0)

  

所以没有。的时间= i ^ 2-i + 1

如果i变得更大,例如很大,则i^2i都变得非常大。但是,i^2正在增加 i更快,那么与i的增加相比,i^2的增加可以忽略。对于Big-O notation中的time complexity,它表示为 O(i ^ 2)

此外,它是“ O”(字母O),而不是“ 0”(数字零)。

答案 2 :(得分:0)

您要说的是,因为内部循环从i到i²,所以复杂度一定不能为O(i²)。
的确,复杂度最多 O(i²),但是:

  1. 对于i = 1 ,第二个循环执行1次
  2. 对于i = 10 ,为90次(距离100不远)
  3. 对于i = 100 ,为9900次(距离10000不太远)
  4. 对于i = 1000 ,为999000次(距离1M不太远)

每次将i乘以数字n(在我的例子中为10)时,内部循环将运行n²次。 这说明复杂度至少为 O(i²)。

结论:复杂度完全(=至少+至少)O(i²)


关于复杂性的一般知识:

您将看到的大多数代码在下面的有序列表中或在它们的组合中具有复杂性(稍后会详细介绍):
n^0 (= constant) < log2(n) < sqrt(n) < n < n^2 < exp(n)

复杂度是仅适用于非常大的数字的术语。
它与小值无关,例如,您将看到here

对于您而言,的价值非常大,在i前面不知所措,因此O(i²-i) = O(i²)

更笼统地说,复杂度只会成倍增加:

  • 您的外部循环为O(n)
  • 您的内部循环为O(n^2)
  • 结果:您的代码示例为O(n^3)

很明显,当您组合复杂性时,顺序将保持不变。
例如,我之前的有序列表乘以O(n)将变为:
n < n*log2(n) < n*sqrt(n) < n^2 < n^3 < n*exp(n)

如您所见,多亏了我上一个列表中介于n和n ^ 2之间的值。