代码之家  ›  专栏  ›  技术社区  ›  nehacharya

这个代码的时间复杂度是O(n^2)还是O(nlogn)?

  •  2
  • nehacharya  · 技术社区  · 2 年前
    for (int i = 1; i <= n; i++) {
       for (int j = 1; j <= n; j += i) {
           // some code
       }
    }
    

    外循环绝对运行 n 时间。在假设n=8的内环的情况下,

    j
    1. 1、2、3、4、5、6、7、8--->运行N次
    2. 1、3、5、7--->运行N/2次
    3. 1、4、7
    4. 1,5
    5. 1,6
    6. 1,7
    7. 1,8
    8. 1.

    我很困惑复杂性是否应该 logn n 用于内环。任何帮助都将不胜感激!

    1 回复  |  直到 2 年前
        1
  •  6
  •   Berthur Sercan    2 年前

    外部循环从 i = 1 n 步长为 1 因此,外部循环执行 n 时间-线性时间复杂性。

    内部循环从 j = 1 n 步长为 i .步长 取决于 在外环中。

    正如您的表格所示;

    • 什么时候 1. ,内部循环执行 n 时间。
    • 什么时候 2 ,内部循环执行 n/2 时间。
    • 什么时候 3 ,内部循环执行 n/3 时间。
    • 。。。
    • 什么时候 n ,内部循环执行 n/n 时间,即 1.

    这些迭代的总和变为:

    n + n/2 + n/3 + ... + 1
    

    如果我们考虑 n ,我们得到谐波级数:

    1 + 1/2 + 1/3 + ... 1/n
    

    其时间复杂度近似为 log(n) .你可以在这里看到更详细的解释 https://stackoverflow.com/a/25905474/12974735

    所以,你的代码总共有 O(n log(n)) 时间复杂性。