三个嵌套 for 循环的时间复杂度

Posted

技术标签:

【中文标题】三个嵌套 for 循环的时间复杂度【英文标题】:Time Complexity of three nested for loops 【发布时间】:2021-02-15 04:37:02 【问题描述】:

有三个嵌套的 for 循环,如果循环递增 1,我可以找到复杂度,但如果循环像这样 i+=c 递增,我会感到困惑?

    for (int i = 0; i < n; i+=c)
        for (int j = 0; j < i; j++)
             for (int k=0; k < m; k++)
                 result[i,j]= x[j]-y[k]

第三个 for 循环的复杂度是 m,但我认为第一个 for 循环是 n/c,第二个 for 循环是 n ==> 将范围相乘:n/c * n * m = n^2 /c * m ==> 最坏的情况是 O(n^2)。它是否正确? 如何使用求和形式求总迭代次数?

【问题讨论】:

什么是 m?是数组的长度吗? 对,m和n是两个不同数组的长度 【参考方案1】:

在您的情况下,时间复杂度取决于两个参数:mn,因为中间循环可以表示为第一个的函数。

如果考虑总迭代次数,它们的顺序是:

1/2 * m * n * (n-1) = O(mn^2)

左边部分假设c=1。但是,将c 作为常数,整体时间复杂度不会改变。

如果 c 未作为常数给出,则生成的时间复杂度将为 O(mn^2)/c

【讨论】:

我猜你应该除以c,因为i += c 感谢您的帮助。我对 c 部分感到困惑,如果 i+=2,我在这里看到了很多例子,复杂度将是 n/2。每次程序运行时,c 都会有不同的值。 但是如果 n^2 占主导地位,我应该将它单独包含在大 O 表示法上还是应该包含所有变量 O(mn^2/c)?! 取决于您是否有关于 m 的其他信息,并且您可以对其进行表征。例如,如果m=O(n^2)c=O(1) 则变为O(n^4),但如果您没有任何关于它的信息,那么您应该离开,因为时间复杂度也取决于它作为输入的一部分。 非常感谢您的澄清。

以上是关于三个嵌套 for 循环的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

如何计算嵌套在 for 循环中的 while 循环的时间复杂度?

Python中嵌套For循环的时间复杂度

两个嵌套for循环的时间复杂度

具有多个 if 语句的嵌套 for 循环的时间复杂度

嵌套循环的大O时间复杂度

嵌套循环的时间复杂度:cn(n+1)/2 从何而来?