笔记:复杂度分析(上)
前言
众所周知,之所以引入数据结构和算法,是为了让我们的程序更加地健壮,更“快”、更“省”。那么,怎么去考量一个算法的执行效率呢,那就是今天的主角:复杂度分析。
什么是复杂度分析
复杂度也叫渐进复杂度,是指算法在编写成可执行程序后,运行时所需要的资源,包括时间资源和空间资源(内存资源),所谓的分析就是用来分析算法执行效率和数据规模之间的增长关系,可以这么说越高阶复杂度的算法,执行效率越低。
为什么需要复杂度分析
你可能会这么想:我把自己写的代码跑一边,然后看看执行时间和内存使用情况不就知道自己写的如何了吗。
这么操作是没有问题的,但是这种方法有非常大的局限性。
依赖测试环境
如果通过执行结果来分析的话,在不同设备上,不同内存,不同cpu的情况下,测试的结果就会出现很大的差异。
依赖数据规模
如果通过上述方法来检测代码的健壮性,需要大量的测试,对于数据的规模有很大要求。
和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高等特点。 掌握好复杂度分析,将编写出更加优质的代码。
如何进行复杂度分析
大O表示法
举一个累加的例子:
void add (int n) {int sum = 0;for(int i = 1 i <=n; i++) {sum+=i}return sum;
}
复制代码
我们来分析下这段代码的执行时间,用T(n) 表示执行的总时间,x表示每行代码执行的时间,可以得出:
T(n) = (n+ 1)x
复制代码
当n越大,所执行的时间就越久,可以看出:执行时间和代码的执行次数n成正比
总结一下:
T(n) = O(f(n))
复制代码
f(n)表示每行代码的执行次数总和,用一个公式表示。O表示执行时间和公式成正比
当n无限大时,公式中的常量和低阶的部分就可以忽略掉,所以上述代码的执行时间T(n) = O(n)
复杂度分析法则
- 单段代码看高频 比如上面例子的 循环
- 多段代码取最大 举个例子:
void add (int n) {int sum1 = 0;for(int i =1;i <= 50; i ++) {sum1+=i;}sum2 = 0;for(int j = 1;j <= n; j++) {sum2+=j;}sum3 = 0;for(int m = 1; m <=n; m ++) {for(int s = 1; s <=n; s++) {sum3+=s;}}return sum1+sum2+sum3;
}
复制代码
这是一个多段代码,有三个片段,时间复杂度分别是:50,n,n*n 取最大的复杂度就是 T(n) = O(n**n) 3. 嵌套代码求乘积:比如上述例子中的最后一个片段。 4. 多个规模求加法 再举个栗子:
void add (int n, int m) {sum1 = 0;for(int i = 1; i <=n; i ++) {sum1+=i;}sum2 = 0;for(int j = 1; j <=m; j++) {sum2+=j;}return sum1 + sum2;
}
复制代码
该代码的执行时间 T(n) = O(n + m)
时间复杂度和空间复杂度
时间复杂度
上述代码的执行时间都是一中时间复杂度,也叫渐进式时间复杂度,表示代码执行时间随着数据规模增长的变化趋势。
空间复杂度
空间复杂度,也叫渐进式空间复杂度,表示算法的存储空间与数据规模之间的增长关系。
int i = 0;int [] a = new int [n]
复制代码
可以看出第2行代码开辟了大小为n的空间,所以空间复杂度为O(n)
常用复杂度级别
虽然代码千差万别,但是大致分为一下几种: 根据数量级递增可以分为两类:多项式量级和非多项式量级。
多项式量级:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增加。包括:
O(1) 常数阶 O(logn) 对数阶
O(n) 线性阶 O(nlogn) 线性对数阶
O(n^2) 平方阶 O(n ^3) 立方阶
复制代码
O(1)
int i = 5;
int j = i +6;
复制代码
像上面这段代码的复杂度就是O(1),只要f(n)是一个常量,就是O(1)
非多项式量级:随着数据规模的增加,算法的执行时间和空间占用暴增,这类算法性能差。包括:
O(2^n) 指数阶 O(n!)阶乘阶
复制代码
笔记:复杂度分析(上)相关推荐
- 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念
上一篇文章学习了:如何分析.统计算法的执行效率和资源消耗? 点击链接查看上一篇文章:复杂度分析上 今天的文章学习以下内容: 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 均摊时间复杂度 ...
- 【数据结构与算法-java实现】一 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
今天开始学习程序的灵魂:数据结构与算法. 本文是自己学习极客时间专栏-数据结构与算法之美后的笔记总结.如有侵权请联系我删除文章. 我们都知道,数据结构和算法本身解决的是"快"和&q ...
- 渐进式复杂度分析-学习笔记
渐进式复杂度分析 概念 目的 大O表示法 复杂度分析方法 常用复杂度级别 复杂度分析的4个概念 概念 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系,描述了当数据量趋近于无穷大的时候,算 ...
- 算法笔记(一):复杂度分析:最好、最坏、平均、均摊
数据结构指的是"一组数据的存储结构", 算法指的是"操作数据的一组方法". 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 效率和资源消耗的度量衡- ...
- 03|复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
目录 为什么需要复杂度分析? 大 O 复杂度表示法 时间复杂度分析 几种常见时间复杂度 空间复杂度分析 为什么需要复杂度分析? 事后统计法:代码跑一遍,通过统计.监控,就能得到算法执行的时间和占用的内 ...
- (渐进)复杂度分析(上)
https://blog.csdn.net/qiaobinXU/article/details/83115072 数据结构和算法本身解决的是"快"和"省"的问题 ...
- Python 搜索、排序、复杂度分析
Python 搜索.排序.复杂度分析 算法是计算机程序的一个基本的构建模块.评价算法质量的最基本的标准是正确性,另一个重要的标准是运行时间性能.当在一台真实.资源有限的计算机上运行一个算法的时候,经济 ...
- 【每日一学】复杂度分析
文章目录 目标 什么是数据结构 复杂度分析 目标 建立时间复杂度.空间复杂度意识,写出高质量的代码 能够设计基础架构 提高编程技能 训练逻辑思维 什么是数据结构 广义:一组数据的存储结构 | 操作数据 ...
- 卷积神经网络的复杂度分析
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | Michael Yuan@知乎(已授权) 来源 | htt ...
- QIIME 2教程. 08差异丰度分析gneiss(2021.2)
QIIME 2用户文档. 8差异丰度分析gneiss Differential abundance analysis with gneiss 原文地址:https://docs.qiime2.org/ ...
最新文章
- 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程
- BootStrap自带的图标
- day 03 selenium与Beautifulsoup4的原理与使用
- Java中的Unsafe在安全领域的一些应用总结和复现
- index.html乱码问题,用apache打开文件index显示乱码为什么
- 用计算机来弹一首少年,辽宁省锦州市2018年中考语文试卷(word版,含答案)
- oracle 空间数据库说明
- UVA10302 Summation of Polynomials【数学】
- POJ1088(记忆搜索加dp)
- 【HTML5+MVC4】xhEditor网页编辑器图片上传
- Eclipse- 使用记录(1)
- 2018美赛C题论文学习笔记1
- LTE学习-信道均衡(ZF)
- rpg服务器无限刷金币bug,荆棘谷惊现无限刷金BUG 无脑跑商盆满钵满
- 两道非常容易理解错的OSPF问题. 加深理解LSA的概念和ABR/ASBR的概念.
- 168元 vsol 2.5G ONU光猫V2802RH G800-04G 修改GPON SN
- win10蓝牙故障无法正常使用的有效解决方法
- layui 怎么设置点击图片放大_layui图片如何放大
- 【XR】VR手柄定位技术
- 秋天来了,穿衣搭配。简单几件穿出独特气质
热门文章
- Atitit 标记语言ML(Markup Language) v6 目录 1. 标记语言ML Markup Language	1 1.1. 简介	1 2. 置标语言置标语言通常可以分为三类:标识性的
- Atitit it 互联网 软件牛人的博客列表
- Atitit 补充说明 sql知识图谱与线路图attilax总结补充说明
- paip.eclipse忽然启动报错的解决
- IT架构的本质--我的五点感悟
- Open Source Drives IOT From Device to Edge
- 【图像压缩】基于matlab GUI DCT图像压缩(压缩率可调)【含Matlab源码 1049期】
- 【优化算法】蝗虫优化算法(GOA)【含Matlab源码 936期】
- 【图像配准】基于matlab GUI Powell+蚁群算法图像配准【含Matlab源码 928期】
- 【优化算法】改进型的LMS算法-NLMS算法【含Matlab源码 631期】