贴别鸣谢:
本期学习分享参考于哔哩哔哩UP:荣仔_最靓的仔 相关:链接
一.时间复杂度的定义
时间复杂度是用来衡量算法运行效率的一个重要指标。
时间复杂度描述了算法执行所需的时间随着输入规模的增长而增长的速度。
通俗地说,就是当问题的规模变大时,算法运行所需时间增加的快慢程度。
在分析算法时,我们通常关注最坏情况下的时间复杂度,以确保算法在任何输入下都能有可预期的性能表现。
二.常见的时间复杂度
1. 常数阶 O(1):
无论输入规模如何变化,算法的执行时间都恒定。
2. 对数阶 O(log n):
执行时间与输入规模的对数成正比。
3. 线性阶 O(n):
执行时间与输入规模成正比。
4. 线性对数阶 O(n log n):
是一些较高效排序算法的常见时间复杂度。
5. 平方阶 O(n²):
执行时间与输入规模的平方成正比。
三.时间复杂度的计算
(1)一层循环
解题思路:
1.列出循环趟数 t 以及每轮循环 i 值的变化
2.找到t与i之间的关系
3.确定循环停止条件
4.联立2,3,解方程
5.输出结果
例题
i = n * n ;
while(i ! = 1)
i = i / 2 ;
求解
1.列出循环趟数 t 以及每轮循环 i 值的变化
t = 0 , 1 , 2 , 3 , 4 , 5, 6.....
i =
,
,
,
.........
2.找到t与i之间的关系
3.确定循环停止条件
当i = 1时,循环停止
4.联立2,3,解方程
5.输出结果
注:
在计算基本语句执行次数的数量级时,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。 同时,用大0记号表示算法的时间性能。
所以,此例题时间复杂度为:
一层循环强化 :
Qus:求此循环的时间复杂度:
x = 0 ;
while (n >= (x + 1) * (x + 1) )
x = x +1
Ans:
(2)二层循环
解题思路:
1.列出外层循环中i的变化值
2.列出内层语句中的执行次数
3.求和,写出结果
例题
int m = 0 , i , j ;
for (i = 1 ; i <= n ; i++)
for (j = 1 ; j <= 2 * i ; j ++)
m++
求解
1.列出外层循环中i的变化值
由于外层的 i ,是从1开始,并且 i 一直自增,当 i = n时,停止外层循环。
所以,外层的 i 的变化为一直从1自增到n。
i 1 2 3 4 5 6 ......... n
2.列出内层语句中的执行次数
当 i = 1 时, j = 1 , j < 2 * 1, 内层循环,同时 j 自增1
并且由于当 j 自增1后,仍满足 j <=2 , 所以,j 再次循环,自增1
此时, j 值为 3 .因为 j = 3 > 2 ,所以内层跳出循环,执行外层.
由此类推:
i = 1 内层循环2次
i = 2 内层循环4次
i = 3 内层循环6次
.... .............
i = n 内层循环2n次
3.求内层执行次数的和,写出结果
所以此题时间复杂度为:
二层循环强化:
Qus:求下面循环的时间复杂度
for (i = 0 ; i < n ; i ++)
for (j = 0 ; j < m ; j ++)
a[i][j] = 0
Ans:
T = O(mn)
(3)多层循环
思路1.
抽象为计算三维体积
若为三层循环,则可以直接抽象为三维锥体,如下例所示
for (i = 0 ; i <= n ; i++)
for (j = 0 ; j<= i ; j++)
for (k = 0 ; k<j ; k++)
Qus:为什么要抽象为三维锥体,而不抽象为三维长方体呢
由上循环所示,内层的循环次数主要依靠的是最外层i的大小
当外层的i小时,内层的j,k循环次数就小,就会显示为递增,此时图像即为三棱锥
直接套用公式:
V = 1/3 S H
即:
T = O(
)
思路2.
列式求和
依然以上述例题为例:
求解:
T = O(
)