数据结构—时间、空间复杂度
什么是数据结构?
数据结构是计算机储存、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素集合。
什么是算法?
算法效率
一般用时间复杂度和空间复杂度来衡量一个算法的好坏。其中,时间复杂度主要衡量一个算法的运行的快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。因为在计算机的早期,计算机的储存容量很小,所以十分在乎空间复杂度。但是随着计算机行业的发展,计算机的储存容量已经达到了很高的水平,因此如今我们不再需要特别关注一个算法的空间复杂程度而更侧重于算法的时间复杂度。
时间复杂度
算法中的基本操作执行次数就为算法的时间复杂度。
例如:Func1中++count的执行次数为 N*N+3*N+10
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);
}
实际上当当我们评判时间复杂度时并不一定需要精确的执行次数,而只需要大概的执行次数。有点类似于函数里取极限的思想,我们需要的是N趋向于正无穷时仍占主体的。所以我们使用的是大O的渐进表示法。
大O符号:是用于描述函数渐进行为的数学符号。
推导大O阶方法:
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中·,只保留最高阶项。
3.如果最高阶项存在且不是1,则除去与这个项目相乘的常数。得到的结果就是大O阶。
使用大O阶渐进表示法后,Func1的时间复杂度为O(N^2)
此外还要注意,有些算法的时间复杂度存在最好、平均和最坏情况:
最好情况:任意输入规模的最小运行次数(下界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最大运行次数(上界)
在实际情况中一般关注的是算法的最坏运行情况
示例1:计算BubbleSort的时间复杂度
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}
执行次数为等差数列求和, N+N-1+......+2+1 次,即[(N+1)*N]/2 次。时间复杂度为O(N^2)
示例2:计算BinarySearch的时间复杂度
int BinarySearch(int* a, int n, int x)
{assert(a);int begin = 0;int end = n-1;// [begin, end]:begin和end是左闭右闭区间,因此有=号while (begin <= end){int mid = begin + ((end-begin)>>1);if (a[mid] < x)begin = mid+1;else if (a[mid] > x)end = mid-1;elsereturn mid;}return -1;
}
二分查找法的时间复杂度,最好情况为1次,最坏情况为O(logN)。计算方法为如下:
示例3:计算阶乘递归Fac的时间复杂度
long long Fac(size_t N)
{if(0 == N)return 1;return Fac(N-1)*N;
}
时间复杂度为O(N)
示例4:计算斐波那契递归Fib的时间复杂度
long long Fib(size_t N)
{if(N < 3)return 1;return Fib(N-1) + Fib(N-2);
}
时间复杂度为O(2^N),计算方法如下:
空间复杂度
空间复杂度是一个算法在运行过程中临时占用储存空间大小的量度。算的是变量的个数,也采用大O渐进表示法。
注意:函数运行是所需要的栈空间(储存参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
示例1:计算BubbleSort的空间复杂度
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}
使用了常数个额外空间,所以空间复杂度为O(1)。
示例2:计算阶乘递归Fac的空间复杂度
long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}
由图知先调用到底再返回,由Fib(N)到 Fib(N-1) 到 Fib(N-1) 下的Fib(N-2)........所以空间复杂度为O(N).
注意:时间是累积的,而空间是可以重复利用的
数据结构—时间、空间复杂度相关推荐
- 数据结构时间空间复杂度笔记
- 数据结构与算法的时间空间复杂度
提到数据结构与算法就不得不提时间复杂度和空间复杂度,本人看大部分文章介绍都比较晦涩难懂,就想着用简单的代码示例快速让你理解数据结构与算法的时间空间复杂度. 首先,时间复杂度表示的是使用某个数据结构或者 ...
- 算法设计与分析课程的时间空间复杂度
算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...
- 排序算法 之四 分类、时间/空间复杂度、如何选择
写在前面 现在网上关于排序算法的文档不计其数,为什么要写这篇文章呢?主要是因为一些算法虽然在平时有用到,但是从来没有细细整理过,没有个统一.整体的认识.写这篇文章一来是进行一下总结,二来趁机再系统 ...
- Algorithm Master Road:算法的时间/空间复杂度
很多同学都觉得算法很难,难以入门,难以理解,更难以掌握和运用,其实归根溯源,我们可以把所有的问题都通过枚举法来解决,但是受困于「时间」和「空间」的因素,有的时候并不能枚举所有的情况,所以需要通过精妙的 ...
- (二) 时间/空间复杂度计算
时间/空间复杂度计算 时间复杂度是什么? O(1) O(n) O(1)+O(n)=O(n) O(n)*O(n)=O(n^2) O(logN) 空间复杂度是什么? O(1) O(n) O(n^2) 思考 ...
- 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...
- 二叉树中序遍历习题引发的时间空间复杂度思考:内存角度
今天做了一道简单的二叉树遍历. 首先我们需要了解什么是二叉树的中序遍历:按照访问左子树--根节点--右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树.因此 ...
- 大话数据结构(1)——时间空间复杂度
算法时间.空间复杂度 文章目录 算法时间.空间复杂度 算法时间复杂度 时间复杂度分类 常见时间复杂度 算法时间复杂度 时间复杂度分类 常数阶 顺序结构的时间复杂度为O(1) 单纯的分支结构时间复杂度为 ...
最新文章
- JAVA_OPTS 参数
- php链接页面时加..,怎么给一个PHP密码访问页面加超链接
- Hello World!团队第四次会议
- mysql 临时表 汉字_转MySQL临时表的简单用法
- 互联网常识(持续更新)
- 期货与期权(part5)--期货市场机制
- java的配置文件后缀,Java - 敏感配置文件位置
- Cell Reports:CRISPR-Cas12k引导的细菌普适性靶向遗传筛选系统
- Spring Cloud与微服务学习总结(6)——认证鉴权与API权限控制在微服务架构中的设计与实现(四)
- c++ enum 给定类型_C++ 枚举类型详解
- IOS开发-jqeurey mobile
- 麦克风阵列技术(转载)
- P1563 [NOIP2016 提高组] 玩具谜题
- 什么是php递归算法_PHP递归算法(三)
- PHP 实现发送短信验证码(CI框架)
- 垃圾食品对身体的影响可不仅仅是减慢新陈代谢这么简单
- 网格模型obj文件及其纹理解析
- android设置管理员权限设置,android 获取超级管理员权限,进行锁屏、恢复出厂设置...
- 用php计算身体质量指数,BMI计算器,身体质量指数BMI在线计算
- 干货!结构化知识的统一建模和多任务学习
热门文章
- java实现图片镜像翻转
- ENSP模拟实验OSPF虚链路
- 7-3 三维向量运算设计一个三维向量类,实现向量加法、减法以及向量与标量的乘法和除法运算。
- booting和adbboost
- 整理了一些常用的免费 API 接口,不限次数,收藏备用!(持续更新...)
- 文件上传漏洞 — ::$DATA绕过、点和空格绕过
- JFreeChart饼图, java程序中加载宋体字库
- LED背光学习_标准和白光LED的基础知识与驱动
- vue+vantUI模板
- MATLAB小技巧(9) 图片合成视频与视频分帧