这几天开始刷力扣上面的算法题,有些题目上面限制时间复杂度和空间复杂度,题目虽然写出来了,但是很没底。印象里数据结构老师讲过一点,沉睡的记忆苏醒了。只记得一个时间复杂度是O(n),空间复杂度是S(n)。for循环常常是O(n),具体是怎么算的不清楚。所以在看了相关的视频教学后,总结一下时间复杂度的计算公式,希望能给大家的学习带来帮助!
目录
时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。
时间复杂度大小比较:

时间复杂度分类:
时间复杂度基本计算规则:
解题步骤
例题分析
例一:
- i = n*n;
- whlie(i != 1)
- i = i/2;
第一步:列出循环趟数t及每轮循环i的变化值:
| t | 0 | 1 | 2 | 3 |
| i | ![]() | ![]() | ![]() | ![]() |
第二步:找到t与i的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:


所以得到时间复杂度为:

例二:
- x = 0;
- while (n>=(x+1)*(x+1))
- x = x+1;
第一步:列出循环趟数t及每轮循环x的变化值:
| t | 0 | 1 | 2 | 3 | 4 |
| x | 0 | 1 | 2 | 3 | 4 |
第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

![t = \sqrt[]{n}-1](https://1000bd.com/contentImg/2024/04/17/bb38774f6affad27.png)
所以得到时间复杂度为:
![T=O(\sqrt[]{n})](https://1000bd.com/contentImg/2024/04/17/40d89948dc55ee50.png)
例三:
- int i = 1;
- while (i<=n)
- i = i *2
第一步:列出循环趟数t及每轮循环i的变化值:
| t | 0 | 1 | 2 | 3 | 4 |
| i | 0 | 1 | 2 | 3 | 4 |
第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:


所以得到时间复杂度为:

例四:
- int i = 0;
- while (i*i*i<=n)
- i ++;
第一步:列出循环趟数t及每轮循环i的变化值:
| t | 0 | 1 | 2 | 3 | 4 |
| i | 0 | 1 | 2 | 3 | 4 |
第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

![t = \sqrt[3]{n}](https://1000bd.com/contentImg/2024/04/17/ac8548d304a9e9ff.png)
所以得到时间复杂度为:
![T=O( \sqrt[3]{n})](https://1000bd.com/contentImg/2024/04/17/a16840ea8f7f7963.png)
例五:
- y = 0;
- while (y+1)*(y+1) <= n
- y = y+1;
第一步:列出循环趟数t及每轮循环y的变化值:
| t | 0 | 1 | 2 | 3 | 4 |
| y | 0 | 1 | 2 | 3 | 4 |
第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

![t = \sqrt[]{n}-1](https://1000bd.com/contentImg/2024/04/17/bb38774f6affad27.png)
所以得到时间复杂度为:
![T=O(\sqrt[]{n})](https://1000bd.com/contentImg/2024/04/17/40d89948dc55ee50.png)
解题步骤
例题分析
例一:
- int m=0,i,j;
- for (i=1;i<=n;i++)
- for(j=1;j<=2*i;j++)
- m++;
第一步列出循环中i的变化值:
第二步列出内层语句的执行次数:
| i | 1 | 2 | 3 | 4 | 5 | ...... | n |
| 内层语句执行次数 | 2 | 4 | 6 | 8 | 10 | ...... | 2*n次 |
第三步 求和,写结果


例二:
- for (i=0;i
- for(j=0;j
- a[i][j] = 0;
第一步列出循环中i的变化值:
第二步列出内层语句的执行次数:
i 0 1 2 3 4 ...... n-1 内层语句执行次数 m m m m m ...... m次
第三步 求和,写结果


例三:
- count = 0;
- for (k=1;k<=n;k*=2)
- for(j=1;j<=n;j++)
- count ++;
这里k*=2,不再是++,所以要先用单层循环求出变换趟数:
t 1 2 3 4 k 1 2 3 4


内层每个都是n,求和则可以得到:

例四:
- for (i=n-1;i>=1;i--)
- for(j=1;j<=i;j++)
- if A[j] > A [j+1]
- A[j]与A[j+1]交换;
第一步列出循环中i的变化值:
第二步列出内层语句的执行次数:
i n-1 n-2 ...... 2 内层语句执行次数 n-2 n-3 ...... 1次
第三步 求和,写结果


四、多层循环时间复杂度计算公式
方法一:抽象为计算三维物体体积
方法二:列式求和
例一:
- for(i=0;i<=n;i++)
- for(j=0;j<=i;j++)
- for(k=0;k
方法一:抽象为计算三维物体体积:

i依赖于n,j依赖于i,k依赖于j,三者都可以看成是n,再由体积公式
可以求出
。
方法二:列式求和:
∑ i = 0 n ∑ j = 0 i ∑ k = 0 j − 1 = ∑ i = 0 n ∑ j = 0 i \( j − 1 − 0 + 1 ) = ∑ i = 0 n ∑ j = 0 i \j " role="presentation">


-
相关阅读:
JavaSE基础加强、常用类补充
c++ 变量常量指针练习题
网络安全等级保护基本要求 第1部分:安全通用要求
P4867 Gty的二逼妹子序列(莫队+值域分块)
机器学习开源工具BatteryML,一站式分析与预测电池性能
使用 Python为你的在线会议创建一个假的摄像头
【JAVA开发规范】日志规范
[论文精读|博士论文]面向文本数据的关系抽取关键技术研究
Jupyter Notebook修改默认浏览器方法
基于Fomantic UI Web构建 个人导航站点网站源码 网站技术导航源码
-
原文地址:https://blog.csdn.net/weixin_63866037/article/details/128087397