内循环依赖于外循环的嵌套for循环的时间复杂度
Time complexity of nested for loops where inner loop depends on outer loop
我有一个嵌套的 for 循环:
for(i = 0; i < n*n; i++)
for(j = 0; j <= i/5; j++)
print("Hello World!");
如何找到这个循环的时间复杂度。
我考虑的是外循环,从0到n^2(不包括),所以它运行了n^2 + 1次。
对于内部循环,它取决于 i,这就是我迷路的地方。有什么指点吗?
几乎总是你可以只插入常识告诉你的数字来构成最坏的情况。除非所说的最坏情况只保证 运行 固定次数而不管 N(即所有循环都接近最优,除了最多 5 个循环不是,即使我们循环一千次 - 非常rare) - 然后用最坏的情况做数学运算。
就每个单独的循环而言:对每个循环都采取最坏的情况。这是对的,除非循环之间有 link,例如if inner loop 运行s 'worst case' only if some outer loop is guaranteed to 运行 best case, and vice versa - when there are a clear relationship.
所以,让我们在这里应用它:
- i 运行s 从 0 到 n*n,这部分很简单。
- j 运行s从0到i(我们可以忽略常数因子,所以
/5
部分是无关紧要的,我们可以忽略它)。
j循环的最坏情况是i等于n*n
,这使得j运行从0到n*n
。所以我们就用它吧。
这实际上是正确的答案;这是一个 运行s 进行 n*n
次迭代的循环(这是 j
循环),并且此过程重复 n*n
次(i
循环) ,总复杂度为 O(n^4)
(哎哟,随着 n 的增长,它会很快下降)。
如果您不确定数学是否有效,请尝试找到线性。这保证了它。在这种情况下,最好的情况是 i
为 0,在这种情况下 j 循环 运行s 仅一次,而最坏的情况是 j 循环 运行s n*n
次。至关重要的是,j
循环的特征是线性的:只需绘制出第 j 循环的性能相对于第 i 循环的 'lifetime' 的性能变化情况,这是一个简单的直线关系。前 5 j 次循环 运行 一次,第二 5 j 次循环 运行 两次,一直到最后 j 次循环 运行s n*n/5
次。
所有 j 次循环的 'average' 就是该行的中间:n*n/5
的一半。这是 n*n/10
,常数因子无关紧要,所以仍然是 n*n
。因此,为什么这是 O(n^4)
,与 for (j = 0; j < n*n; j++)
相同。
我有一个嵌套的 for 循环:
for(i = 0; i < n*n; i++)
for(j = 0; j <= i/5; j++)
print("Hello World!");
如何找到这个循环的时间复杂度。
我考虑的是外循环,从0到n^2(不包括),所以它运行了n^2 + 1次。
对于内部循环,它取决于 i,这就是我迷路的地方。有什么指点吗?
几乎总是你可以只插入常识告诉你的数字来构成最坏的情况。除非所说的最坏情况只保证 运行 固定次数而不管 N(即所有循环都接近最优,除了最多 5 个循环不是,即使我们循环一千次 - 非常rare) - 然后用最坏的情况做数学运算。
就每个单独的循环而言:对每个循环都采取最坏的情况。这是对的,除非循环之间有 link,例如if inner loop 运行s 'worst case' only if some outer loop is guaranteed to 运行 best case, and vice versa - when there are a clear relationship.
所以,让我们在这里应用它:
- i 运行s 从 0 到 n*n,这部分很简单。
- j 运行s从0到i(我们可以忽略常数因子,所以
/5
部分是无关紧要的,我们可以忽略它)。
j循环的最坏情况是i等于n*n
,这使得j运行从0到n*n
。所以我们就用它吧。
这实际上是正确的答案;这是一个 运行s 进行 n*n
次迭代的循环(这是 j
循环),并且此过程重复 n*n
次(i
循环) ,总复杂度为 O(n^4)
(哎哟,随着 n 的增长,它会很快下降)。
如果您不确定数学是否有效,请尝试找到线性。这保证了它。在这种情况下,最好的情况是 i
为 0,在这种情况下 j 循环 运行s 仅一次,而最坏的情况是 j 循环 运行s n*n
次。至关重要的是,j
循环的特征是线性的:只需绘制出第 j 循环的性能相对于第 i 循环的 'lifetime' 的性能变化情况,这是一个简单的直线关系。前 5 j 次循环 运行 一次,第二 5 j 次循环 运行 两次,一直到最后 j 次循环 运行s n*n/5
次。
所有 j 次循环的 'average' 就是该行的中间:n*n/5
的一半。这是 n*n/10
,常数因子无关紧要,所以仍然是 n*n
。因此,为什么这是 O(n^4)
,与 for (j = 0; j < n*n; j++)
相同。