三个嵌套 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】:在您的情况下,时间复杂度取决于两个参数:m
和 n
,因为中间循环可以表示为第一个的函数。
如果考虑总迭代次数,它们的顺序是:
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 循环的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章