【问题标题】:Runtime complexity of the function函数的运行时复杂度
【发布时间】:2016-05-29 22:15:40
【问题描述】:

我必须找出以下程序的时间复杂度:

function(int n)
{
    for(int i=0;i<n;i++)                   //O(n) times
        for(int j=i;j<i*i;j++)             //O(n^2) times
            if(j%i==0)
            {  //O(n) times
                for(int k=0;k<j;k++)       //O(n^2) times
                    printf("8");
            }
}

我对这个函数的分析如下:

i : O(n)  : 1        2        3          4             5
j :       : 1        2..3     3..8       4..15         5..24           (values taken by j)
    O(n^2): 1        2        6          12            20              (Number of times executed)
j%i==0    : 1        2        3,6        4,8,12        5,10,15,20      (Values for which the condition is true)
    O(n)  : 1        1        2          3             4
k         : 1        2        3,6        4,8,12        5,10,15,20      (Number of times printf is executed)
    Total : 1        2        9          24            50              (Total)

但是我无法得出任何结论,因为我没有发现本质上为 O(n) 和 Total of k(最后一行)的 $i$ 之间有任何相关性。事实上,我不明白我们是否应该根据执行 printf 的次数来查看时间复杂度,因为这将忽略 j-for 循环的 O(n^2) 执行。给出的答案是 O(n^5),我认为这是错误的,但什么是正确的?为了更具体地说明我的困惑,我无法弄清楚 if(j%i==0) 条件如何影响函数的整体运行时复杂性。

【问题讨论】:

    标签: time-complexity


    【解决方案1】:

    答案肯定不是 O(n^5)。它可以很容易地看到。假设您的第二个内部循环始终运行 n^2 次,而您的最内层循环始终运行 n 次,即使这样总时间复杂度也将是 O(n^4)

    现在让我们看看实际的时间复杂度是多少。

    1。最外面的循环总是运行 O(n) 次。

    2。现在让我们看看第二次内循环运行了多少次外循环的单次迭代:

    循环将运行

    0i = 0的时间

    0i = 1的时间

    2 次数为i = 2 ....

    i*i - ij = i

    i*i - iO(i^2)

    3。来到最里面的循环,它仅在j 可被i 整除且j 不同于i to i*i-1 时运行。

    这意味着j 一直到i*1, i*2 , i*3 .....直到i 的最后一个倍数小于i*i。这显然是 O(i),因此对于第二个内循环的单次迭代,最内循环运行 O(i) 次,这意味着两个内循环的总迭代次数为 O(i^3).

    总结 O(i^3) 对于 i = 0 到 n-1 肯定会给出一个 O(n^4) 项。

    因此,正确的时间复杂度是O(n^4)

    【讨论】:

    • 好的,所以你也想出与我在原始问题中所述的那些单个循环相同的复杂性。但是,在这种情况下,我认为以 O(n)*O(n^2)*O(n)=O(n^4) 的方式对 n 的幂求和是不合适的。请注意我分析中标题为“Total”的最后一行(执行 printf 的次数)。这些数字绝对不是 O(n^4)。例如,对于 i=3,total = 9 = O(i^2),而对于 i=4,Total = 24。因此,O(i^2)
    • 大 O 表示法用于渐近分析,这意味着非常非常大的输入。您只是无法使用实际数字来分析复杂性。这是错误的方式。
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2020-07-25
    • 1970-01-01
    • 2019-06-08
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多