嵌套for循环的算法时间复杂度
- 1. 单层循环的时间复杂度:
- 2.嵌套循环的时间复杂度:
- 3. 更复杂的嵌套循环:
- 3.1. 依赖关系的嵌套循环:
- 3.2. 多个嵌套循环:
- 4. 嵌套循环中有条件语句:
- 5. 总结:
- 举个例子:
在分析嵌套 for 循环的算法时间复杂度时,主要依据循环的嵌套层数和每一层循环的迭代次数来计算总的时间复杂度。下面是一般的计算方法和一些常见情形的分析:
1. 单层循环的时间复杂度:
如果算法只有一个简单的 for 循环,并且该循环的迭代次数为 ( n ),那么时间复杂度就是 ( O(n) )。
2.嵌套循环的时间复杂度:
当算法包含多个嵌套的 for 循环时,我们需要考虑每一层循环的迭代次数。一般的规则是,时间复杂度是每一层循环次数的乘积。
假设有两个嵌套的 for 循环:
for i in range(n):
for j in range(n):
# do something
在这种情况下,外层循环从 ( i = 0 ) 迭代到 ( i = n-1 ),内层循环对于每个 ( i ) 从 ( j = 0 ) 迭代到 ( j = n-1 )。因此,内外两层循环的总时间复杂度是:
O
(
n
)
×
O
(
n
)
=
O
(
n
2
)
O(n) \times O(n) = O(n^2)
O(n)×O(n)=O(n2)
也就是说,如果外层和内层循环的迭代次数都是 ( n ),则总的时间复杂度是 ( O(n^2) )。
3. 更复杂的嵌套循环:
如果循环的迭代次数不是固定的,而是随着某些变量变化的,时间复杂度的计算需要根据这些变化的规律来推导。
3.1. 依赖关系的嵌套循环:
假设外层循环迭代次数为 ( n ),内层循环的次数依赖于外层循环的变量:
for i in range(n):
for j in range(i, n):
# do something
在这个例子中,外层循环从 ( i = 0 ) 迭代到 ( i = n-1 ),内层循环每次迭代的次数是 ( n-i ),因此总的时间复杂度是:
O
(
1
)
+
O
(
2
)
+
⋯
+
O
(
n
)
=
O
(
∑
i
=
1
n
i
)
=
O
(
n
(
n
+
1
)
2
)
=
O
(
n
2
)
O(1) + O(2) + \cdots + O(n) = O\left(\sum_{i=1}^{n} i\right) = O\left(\frac{n(n+1)}{2}\right) = O(n^2)
O(1)+O(2)+⋯+O(n)=O(i=1∑ni)=O(2n(n+1))=O(n2)
这里的总时间复杂度仍然是 ( O(n^2) )。
3.2. 多个嵌套循环:
假设有三个嵌套的 for 循环,其中外层循环的迭代次数为
n
n
n,第二层循环的迭代次数为$m $,第三层循环的迭代次数为
p
p
p,那么总的时间复杂度是:
O
(
n
×
m
×
p
)
O(n \times m \times p)
O(n×m×p)
例如:
for i in range(n):
for j in range(m):
for k in range(p):
# do something
总时间复杂度是 O ( n × m × p ) O(n \times m \times p) O(n×m×p)。
4. 嵌套循环中有条件语句:
如果嵌套循环中有条件判断,导致某些迭代次数减少,需要根据条件来计算时间复杂度。通常情况下,条件语句会影响某些循环次数,但是对于大多数情况,时间复杂度的主项还是由外层和内层的迭代次数决定。
例如:
for i in range(n):
for j in range(i, n):
if some_condition(i, j):
# do something
由于内层循环依赖于外层循环,并且条件语句会导致某些迭代跳过,因此时间复杂度仍然是
O
(
n
2
)
O(n^2)
O(n2),但实际执行次数可能会更少,具体取决于 some_condition
的影响。
5. 总结:
- 嵌套的 for 循环 的时间复杂度是每一层循环次数的乘积。
- 如果每一层循环的迭代次数为 n n n,那么时间复杂度通常是 O ( n k ) O(n^k) O(nk),其中 k k k 是嵌套的层数。
- 如果每一层的迭代次数是变量依赖的,时间复杂度的计算需要考虑这些依赖关系的累积效应。
举个例子:
假设有一个算法,内外两层循环,其中外层循环从 1 1 1到 n n n 迭代,内层循环的迭代次数依赖于外层循环变量,如下所示:
for i in range(1, n+1):
for j in range(i, n+1):
# do something
计算时间复杂度:
- 外层循环: i i i从 1 到 n n n,迭代 n n n 次。
- 内层循环:对于每个 i i i,内层循环迭代 n − i + 1 n - i + 1 n−i+1 次。
总时间复杂度:
O
(
1
+
2
+
3
+
⋯
+
n
)
=
O
(
n
(
n
+
1
)
2
)
=
O
(
n
2
)
O(1 + 2 + 3 + \dots + n) = O\left(\frac{n(n+1)}{2}\right) = O(n^2)
O(1+2+3+⋯+n)=O(2n(n+1))=O(n2)
因此,时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
例子2
对于以下嵌套 for 循环:
for i in range(n):
for j in range(n):
for a in range(m):
for b in range(m):
# do something
我们可以逐层分析每个 for 循环的迭代次数,并最终计算时间复杂度。
分析:
-
外层循环(i):
- 该循环从 i = 0 i = 0 i=0 到 i = n − 1 i = n-1 i=n−1迭代,因此它运行了 n n n 次。
-
第二层循环(j):
- 对于每一次 i i i 的迭代,第二层循环 j j j 会从 j = 0 j = 0 j=0到 j = n − 1 j = n-1 j=n−1 迭代,所以它也运行了 n n n 次。
-
第三层循环(a):
- 对于每一次 a a a 的迭代,第四层循环 b b b 会从 b = 0 b = 0 b=0到 b = m − 1 b = m-1 b=m−1迭代,所以它也运行了 m m m 次。
-
第四层循环(b):
- 对于每一次 a a a 的迭代,第四层循环 b b b 会从 b = 0 b = 0 b=0到 b = m − 1 b = m-1 b=m−1迭代,所以它也运行了 m m m 次。
总时间复杂度:
- 外层循环运行了 n n n 次。
- 对于每次外层循环,第二层循环运行了 n n n 次。
- 对于每次第二层循环,第三层循环运行了 m m m 次。
- 对于每次第三层循环,第四层循环运行了 m m m 次。
因此,时间复杂度是每一层的迭代次数相乘:
O
(
n
)
×
O
(
n
)
×
O
(
m
)
×
O
(
m
)
=
O
(
n
2
⋅
m
2
)
O(n) \times O(n) \times O(m) \times O(m) = O(n^2 \cdot m^2)
O(n)×O(n)×O(m)×O(m)=O(n2⋅m2)
该嵌套 for 循环的总时间复杂度为 O ( n 2 ⋅ m 2 ) O(n^2 \cdot m^2) O(n2⋅m2),其中 n n n 是前两层循环的迭代次数, m m m 是后两层循环的迭代次数。
通过这样的推导,你可以计算任何嵌套 for 循环的时间复杂度。