前言

众所周知,之所以引入数据结构和算法,是为了让我们的程序更加地健壮,更“快”、更“省”。那么,怎么去考量一个算法的执行效率呢,那就是今天的主角:复杂度分析。

什么是复杂度分析

复杂度也叫渐进复杂度,是指算法在编写成可执行程序后,运行时所需要的资源,包括时间资源和空间资源(内存资源),所谓的分析就是用来分析算法执行效率和数据规模之间的增长关系,可以这么说越高阶复杂度的算法,执行效率越低。

为什么需要复杂度分析

你可能会这么想:我把自己写的代码跑一边,然后看看执行时间和内存使用情况不就知道自己写的如何了吗。

这么操作是没有问题的,但是这种方法有非常大的局限性。

依赖测试环境

如果通过执行结果来分析的话,在不同设备上,不同内存,不同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)

复杂度分析法则
  1. 单段代码看高频 比如上面例子的 循环
  2. 多段代码取最大 举个例子:
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!)阶乘阶
复制代码

笔记:复杂度分析(上)相关推荐

  1. 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念

    上一篇文章学习了:如何分析.统计算法的执行效率和资源消耗? 点击链接查看上一篇文章:复杂度分析上 今天的文章学习以下内容: 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 均摊时间复杂度 ...

  2. 【数据结构与算法-java实现】一 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

    今天开始学习程序的灵魂:数据结构与算法. 本文是自己学习极客时间专栏-数据结构与算法之美后的笔记总结.如有侵权请联系我删除文章. 我们都知道,数据结构和算法本身解决的是"快"和&q ...

  3. 渐进式复杂度分析-学习笔记

    渐进式复杂度分析 概念 目的 大O表示法 复杂度分析方法 常用复杂度级别 复杂度分析的4个概念 概念 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系,描述了当数据量趋近于无穷大的时候,算 ...

  4. 算法笔记(一):复杂度分析:最好、最坏、平均、均摊

    数据结构指的是"一组数据的存储结构", 算法指的是"操作数据的一组方法". 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 效率和资源消耗的度量衡- ...

  5. 03|复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

    目录 为什么需要复杂度分析? 大 O 复杂度表示法 时间复杂度分析 几种常见时间复杂度 空间复杂度分析 为什么需要复杂度分析? 事后统计法:代码跑一遍,通过统计.监控,就能得到算法执行的时间和占用的内 ...

  6. (渐进)复杂度分析(上)

    https://blog.csdn.net/qiaobinXU/article/details/83115072 数据结构和算法本身解决的是"快"和"省"的问题 ...

  7. Python 搜索、排序、复杂度分析

    Python 搜索.排序.复杂度分析 算法是计算机程序的一个基本的构建模块.评价算法质量的最基本的标准是正确性,另一个重要的标准是运行时间性能.当在一台真实.资源有限的计算机上运行一个算法的时候,经济 ...

  8. 【每日一学】复杂度分析

    文章目录 目标 什么是数据结构 复杂度分析 目标 建立时间复杂度.空间复杂度意识,写出高质量的代码 能够设计基础架构 提高编程技能 训练逻辑思维 什么是数据结构 广义:一组数据的存储结构 | 操作数据 ...

  9. 卷积神经网络的复杂度分析

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | Michael Yuan@知乎(已授权) 来源 | htt ...

  10. QIIME 2教程. 08差异丰度分析gneiss(2021.2)

    QIIME 2用户文档. 8差异丰度分析gneiss Differential abundance analysis with gneiss 原文地址:https://docs.qiime2.org/ ...

最新文章

  1. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程
  2. BootStrap自带的图标
  3. day 03 selenium与Beautifulsoup4的原理与使用
  4. Java中的Unsafe在安全领域的一些应用总结和复现
  5. index.html乱码问题,用apache打开文件index显示乱码为什么
  6. 用计算机来弹一首少年,辽宁省锦州市2018年中考语文试卷(word版,含答案)
  7. oracle 空间数据库说明
  8. UVA10302 Summation of Polynomials【数学】
  9. POJ1088(记忆搜索加dp)
  10. 【HTML5+MVC4】xhEditor网页编辑器图片上传
  11. Eclipse- 使用记录(1)
  12. 2018美赛C题论文学习笔记1
  13. LTE学习-信道均衡(ZF)
  14. rpg服务器无限刷金币bug,荆棘谷惊现无限刷金BUG 无脑跑商盆满钵满
  15. 两道非常容易理解错的OSPF问题. 加深理解LSA的概念和ABR/ASBR的概念.
  16. 168元 vsol 2.5G ONU光猫V2802RH G800-04G 修改GPON SN
  17. win10蓝牙故障无法正常使用的有效解决方法
  18. layui 怎么设置点击图片放大_layui图片如何放大
  19. 【XR】VR手柄定位技术
  20. 秋天来了,穿衣搭配。简单几件穿出独特气质

热门文章

  1. Atitit 标记语言ML(Markup Language) v6 目录 1. 标记语言ML Markup Language 1 1.1. 简介 1 2. 置标语言置标语言通常可以分为三类:标识性的
  2. Atitit it 互联网 软件牛人的博客列表
  3. Atitit  补充说明 sql知识图谱与线路图attilax总结补充说明
  4. paip.eclipse忽然启动报错的解决
  5. IT架构的本质--我的五点感悟
  6. Open Source Drives IOT From Device to Edge
  7. 【图像压缩】基于matlab GUI DCT图像压缩(压缩率可调)【含Matlab源码 1049期】
  8. 【优化算法】蝗虫优化算法(GOA)【含Matlab源码 936期】
  9. 【图像配准】基于matlab GUI Powell+蚁群算法图像配准【含Matlab源码 928期】
  10. 【优化算法】改进型的LMS算法-NLMS算法【含Matlab源码 631期】