如何判断程序的复杂程度:时间和空间复杂度
文章目录
- 如何判断程序的复杂程度:时间和空间复杂度
- 1. 时间复杂度:
- 如何判断一段代码的时间复杂度
- 小练习1:求和计算1~n的和
- 小练习2:求斐波那契数列
- 主定理
- 常用算法中的应用
- 2. 空间复杂度
- 如何判断一段代码的空间复杂度
- 3. 数组和链表的时间复杂度分析
- 数组
- 链表
- 跳表
如何判断程序的复杂程度:时间和空间复杂度
1. 时间复杂度:
使用大O表示法来表示程序的时间复杂度
常见的7种时间复杂度(复杂度由低到高排序)
O(1):常数时间复杂度
O(log(n): 对数时间复杂度
O(n): 线性时间复杂度
O(n^2):平方时间复杂度
O(n^3):立方时间复杂度
O(k^n):指数时间复杂度,k表示常数
O(n!):阶乘时间复杂度
ps:
这里我们并不考虑前边的系数;O(1) 并不表示复杂度为1,也可以 是2、3等常数;O(n)表示程序运行了n次或者2n、3n次;以此类推其他时间复杂度
时间复杂度的判断,以一段代码的最高复杂度为准;
如何判断一段代码的时间复杂度
简而言之就是看内部某段代码的执行次数
O(1):常数复杂度
int n = 1; System.out.println(n);
int n = 1; System.out.println(n); System.out.println(n+1) System.out.println(n+2)
O(n):线性时间复杂度
for (int j = 0; j < n; j++) {System.out.println(j); }
for (int i = 0; i < n; i++) {System.out.println(i); } for (int j = 0; j < n; j++) {System.out.println(j); }
O(n^2):平方时间复杂度
for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.println(i + j);} }
O(n^3):立方时间复杂度
for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < n; k++) {System.out.println(i + j);}} }
O(log(n)): 对数时间复杂度
这里演示的是以2为底n的对数
for (int i = 0; i < n; i = i * 2) {System.out.println(i); }
O(2^n):指数时间复杂度
/*** 递归求斐波那契数列的第n项;可以通过画运行树的方式获得时间复杂度*/ int fib(int n) {if (n < 2) return n;return fib(n - 1) + fib(n - 2); }
O(n!):阶乘时间复杂度
- todo
小练习1:求和计算1~n的和
O(n)
int y = 2; for (int i = 0; i < n; i++) {y+=i; }
O(1)
使用了求和公式:sum = n(n+1)/2
int y = 2; for (int i = 0; i < n; i++) {y+=i; }
小练习2:求斐波那契数列
O(2^n):
int fib(int n) {if (n < 2) return n;return fib(n - 1) + fib(n - 2); }
O(n):该方法比递归要快得多
int fib2(int n) {if (n == 1 || n == 2) {return 1;}int a = 1, b = 1, result = 0;for (int i = 3; i <= n; i++) {result = a + b;a = b;b = result;}return result; }
主定理
主定理(英语:master theorem)提供了用渐近符号(大O符号)表示许多由分治法得到的递推关系式的方法
常用算法中的应用
算法 | 递回关系式 | 运算时间 |
---|---|---|
二分搜寻算法 | ||
二叉树遍历 | ||
最佳排序矩阵搜索(已排好序的二维矩阵) | ||
合并排序 |
所有排序的最优算法都是O(nlog(n))
2. 空间复杂度
如何判断一段代码的空间复杂度
主要通过两部分进行判断:
数组的长度
如果代码中应用了数组,那么数组的长度,基本上就是空间复杂度;
e:一维数组的空间复杂度是O(n);二维数组的空间复杂度是O(n^2)递归的深度
如果代码中有递归,那么递归的深度,就是代码的空间复杂度的最大值
ps:如果代码中既有数组,又有递归,那么两者的最大值就是代码的空间复杂度
leecode有个爬楼梯的复杂度分析情况;可以进行练习
3. 数组和链表的时间复杂度分析
数组
随机增加:O(n)
随机查询:O(1)
随机删除:O(n)
链表
随机增加:O(1)
随机查询:O(n)
随机删除:O(1)
跳表
跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。
简单来说,跳跃表是有序链表的一种扩展,在有序列表的基础上进行了升维处理
以上图片来自公众号:程序员小灰
随机增加:O(log(n))
随机查询:O(log(n))
随机删除:O(log(n))
如何判断程序的复杂程度:时间和空间复杂度相关推荐
- 微信小程序获取当前系统时间以及判断周几
微信小程序获取当前系统时间以及判断周几 首先获取当前日期 在utils文件加中创建问价util.js function formatTime(date) {var year = date.getFul ...
- 千万不要相信程序员在加班时间写的代码!
其中最重要的就是这条:不要相信一个程序员在加班时间写出来的代码. (软件工程的学说表明,连正常时间好好写的代码,也不要太相信.不过这不是本文的重点,略过不提.) (不懂代码的人,看到本文中的Java代 ...
- 不要相信程序员在加班时间写的代码
http://www.cocoachina.com/programmer/20161215/18359.html 不要相信程序员在加班时间写的代码 2016-12-15 00:01 编辑: suili ...
- java开发有不加班的吗_千万不要相信程序员在加班时间写的代码!
作为一个最底层的程序员,我先记录一些只有底层程序员才会知道的事情.如果多年后,我违背自己进入这个行业的初心,走上管理岗位,也能回想起一些禁忌,避免一些错误. 其中最重要的就是这条:不要相信一个程序员在 ...
- (转载)不要相信程序员在加班时间写的代码
作为一个最底层的程序员,我先记录一些只有底层程序员才会知道的事情.如果多年后,我违背自己进入这个行业的初心,走上管理岗位,也能回想起一些禁忌,避免一些错误. 其中最重要的就是这条:不要相信一个程序员在 ...
- 判断程序是否已经运行
近段时间,需要写一个小功能,就是需要判断程序是否已经运行. 某个程序安装后,也许被多个用户运行.那怎样判断当前用户已经运行了此程序了呢? 下面是Insus.NET的做法,就是: <VB.NET ...
- 有经验的面试官都是如何快速判断程序员能力的?
程序员是一个技术含量特别高的职位,优秀的程序员对每个公司来讲同样可遇不可求.而这就需要技术面试官的火眼精金,为企业挖掘人才. 程序员面试者那么多,如何快速分辨他们的能力,为双方都节省时间和精力,也成为 ...
- 微信小程序实现缓存过期时间
微信小程序实现缓存过期时间 前言 一.设置缓存 二.得到缓存 总结 前言 先来看看官方文档 wx.setStorageSync(string key, any data) 将数据存储在本地缓存中指定的 ...
- HR怎么通过简历判断程序员是否优秀?
阅过无数技术简历,仍然做不好技术招聘. 技术面试官无数次强调要从简历中判断是否为技术大牛,可是大牛.小牛真的可以从简历上判断吗? 为此,很多HR都会有这样的想法:看到有卓越的项目经历,哇!这个人肯定是 ...
最新文章
- [MySQL FAQ]系列 -- Too many open files
- draw.io创建自定义形状
- jQuery选择器之可见性过滤选择器Demo
- python numpy官网_Python Numpy 教程(上)
- 现代谱估计:多窗口谱
- 小米笔记本服务器系统,小米笔记本Pro GTX版
- windows7系统适合哪个python_Python3.6.4在Windows7系统下安装配置教程
- Linux: chmod 和 chown用法小结
- c语言解数独算法递归,How to think:递归和数独试探算法
- oracle 查表的用户名和密码,查看Oracle数据库中的所有用户名
- 在linux桌面上显示图标
- python3读文件编码格式_使用不同的编码格式读取文件系统标准在Python3中
- 杭电2002(我们没有什么不同)
- 《HTML5+CSS3网页设计入门必读》——1.11 小结
- 有限元分析法matlab,用MATLAB进行结构的有限元法分析
- SAP官方考试认证报名,如何报名?
- 罗永浩“吓尿”大会上,我裤子真湿了
- ionic 3 http htpps
- Remix-IDE安装开发环境与使用文档(Windows环境)
- 数据库构造器之查询构造器构建
热门文章
- express 什么是中间件(浅显易懂)
- php-使用函数array_walk_recursive处理多维数组的键值后返回一个新数组
- 北航程序设计决赛(虽然。。。。但是)补题。
- uniapp mx-datepicker时间范围选择器禁用部分时间
- 1. Hello World!
- 第一次投稿(Elsevier)爱斯维尔期刊经验(持续更新)
- 核雕图案的寓意(下)
- 2020最新智能客服|聊天机器人算法、架构及应用分享
- 官方也无力回天?“SharedPreferences 存在什么问题?”
- 刷题总结——松鼠的新家(bzoj3631)