目录
💯前言
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
💯时间复杂度的概念
在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。
一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
请计算一下Func1中++count语句总共执行了多少次?
// 请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{
int count = 0;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
++count;
}
}
for (int k = 0; k < 2 * N; ++k)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
printf("%d\n", count);
}
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。
✨ 常见复杂度对比:
💯单层循环时间复杂度计算公式
⭐ 1.列出循环趟数 t ,以及每轮 i 的变化值
2.找到 t 和 i 的关系
3.确定停止条件
4.联立方程
【例题】:
//计算下面代码的时间复杂度
int i = 1;
while(i<=n)
i = i*2;
【解】:
👍列出循环趟数 t 及每轮 i 的变化值
t | 0 | 1 | 2 | 3 | 4 | 5 |
i | 1 | 2 | 4 | 8 | 16 | 32 |
👍找到 i 与 t 的关系:
❶ i=2^t
👍确定停止条件
❷ i<=n
👍联立❶,❷方程
得出 2^t<=n
即 t<=
以上就是单层循环时间复杂度的计算方法
【练习】:
//计算下面代码的时间复杂度
//练习1
int i=0;
while(i*i*i<=n)
i++;
【答案】:
//计算下面代码的时间复杂度
//练习2
y=0;
while((y+1)*(y+1)<=n)
y=y+1;
【答案】:
💯两层循环时间复杂度计算公式
⭐ 1.列出外层循环趟数 t1
2.列出外层循环中 i 的变化值
3.列出内层语句的执行次数 t2
4.求内层语句的执行次数 t2 之和 S
【例题】:
//计算下面代码的时间复杂度
int count=0;
for(k=1 ; k<=n ; k*=2)
for(j=1;j<=n;j++)
count++;
【解】:
👍列出外层循环趟数 t1 ,列出外层循环中 k 的变化值
t1 | 0 | 1 | 2 | 3 | 4 | 5 |
k | 1 | 2 | 4 | 8 | 16 | 32 |
👍找到 k 与 t1 的关系
k=2^t1
由外层循环可得 2 ^ t1<= n ,即 t1 =
⭐说明外层循环有次
👍列出内层语句的执行次数 t2
t1 | 0 | 1 | 2 | 3 | 4 | 5 |
k | 1 | 2 | 4 | 8 | 16 | 32 |
t2 | 1 | 2 | 3 | 4 | 5 | 6 |
👍求内层语句的执行次数 t2 之和 S
S =( ( 1 + n ) * t1 ) / 2 ——— 等差数列求和公式
t1 =
所以时间复杂度为
以上就是双层循环时间复杂度的计算方法
💯多层循环时间复杂度计算公式
【例题】:
//计算下面代码的时间复杂度
for(i=0;i<=n;i++)
for(j=0;j<=i;j++)
for(k=0;k<j;k++)
s++;
⭐方法一:抽象为计算三维物体体积
⭐方法二:列式求和
👍方法一:抽象为计算三维物体体积
计算该体积即为时间复杂度:O(n^3)
👍方法二:列式求和
题解如下:
以上就是多层循环时间复杂度的计算方法
感谢你看到最后,点个赞再走吧!
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨