复杂度无非是空间,时间复杂度。 掌握了时间,空间复杂度的分析,基本算掌握了数据结构与算法的一半内容。

之所以引入这几个复杂度概念,是因为,同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。

分析一段代码的时间,空间复杂度时候,最需要关注的是循环次数最多的代码。

时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。

类比一下,空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

如何分析一段代码的时间复杂度?

1.  只关注循环执行次数最多的一段代码

2. 加法法则,总复杂度等于量级最大的那段代码的复杂度。

3. 乘法法则,嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。

对于上面罗列的复杂度量级,我们可以粗略地分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:

我们把时间复杂度为非多项式量级的算法问题叫作 NP(Non-Deterministic Polynomial,非确定多项式)问题。

  1. O(1)

首先你必须明确一个概念,O(1) 只是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。比如这段代码,即便有 3 行,它的时间复杂度也是 O(1),而不是 O(3)。

我稍微总结一下,只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度我们都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

2. O(logn)、O(nlogn)

对数阶时间复杂度非常常见,同时也是最难分析的一种时间复杂度。我通过一个例子来说明一下。

实际上,不管是以 2 为底、以 3 为底,还是以 10 为底,我们可以把所有对数阶的时间复杂度都记为 O(logn)。为什么呢?

我们知道,对数之间是可以互相转换的,

下面开始进行互换,首先设 a 为 2 将所有数换为以 2 为底的。将含有 n 的分母移出来。再使用换底公式将 log_23log2​3 换为以 3 为底的。又因为分母的 log_33=1log3​3=1 所以我们换底就成功拉。

参考: https://blackyau.cc/24.html#ologn-onlogn

如果理解了上面讲的 O(logn),那 O(nlogn) 就很容易理解了。O(nlogn) 也是一种非常常见的算法时间复杂度。比如,归并排序、快速排序的时间复杂度都是 O(nlogn)。

如何分析空间复杂度

我们常见的空间复杂度就是 O(1)、O(n)、O(n2 ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。而且,空间复杂度分析比时间复杂度分析要简单很多。所以,对于空间复杂度,掌握刚我说的这些内容已经足够了。

1.最好情况时间复杂度(best case time complexity):在最理想的情况下,执行这段代码的时间复杂度。

2.最坏情况时间复杂度(worst case time complexity):在最糟糕的情况下,执行这段代码的时间复杂度。

3.平均情况时间复杂度(average case time complexity)

最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大。为了更好地表示平均情况下的复杂度,我们需要引入另一个概念:平均情况时间复杂度。

4.均摊时间复杂度(amortized time complexity)

因为,要查找的变量 x 可能出现在数组的任意位置。如果数组中第一个元素正好是要查找的变量 x,那就不需要继续遍历剩下的 n-1 个数据了,那时间复杂度就是 O(1)。但如果数组中不存在变量 x,那我们就需要把整个数组都遍历一遍,时间复杂度就成了 O(n)。

所以,不同的情况下,这段代码的时间复杂度是不一样的。

为了表示代码在不同情况下的不同时间复杂度,我们需要引入三个概念:最好情况时间复杂度、最坏情况时间复杂度和平均情况时间复杂度。

数据结构整体概览

数据结构:复杂度分析以及数据结构整体概览相关推荐

  1. 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析

    这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正. 一.为何需要分析算法复杂度 挺多同学本科都学习过数据结构和算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构和算法 ...

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

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

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

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

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

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

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

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

  6. 【数据结构与算法】复杂度分析

    一.什么是复杂度分析? 1.数据结构和算法解决是"如何让计算机更快时间.更省空间的解决问题". 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 3.分别用时间复 ...

  7. 数据结构-复杂度(一)

    目录 一.什么是复杂度? 算法效率: 复杂度: 二.复杂度分类 一.时间复杂度 二.空间复杂度(Space Complexity) 了解数据结构之前需要了解复杂度. 一.什么是复杂度? 在介绍复杂度之 ...

  8. java-List集合的源码分析(数据结构方面,源码注释方面),迭代器快速失败机制

    List实现了Collection接口,产生三个子类:ArrayList,LinkedList,Vector 文章包含解释方面: 数据结构方面, 源码注释方面&迭代器快速失败机制 方面1-基于 ...

  9. 841南昌大学计算机考研,2020考研南昌大学841数据结构试题特点分析

    2020考研初试已正式开始,中公考研网初试后为大家整理发布"2020考研南昌大学841数据结构试题特点分析"考研试题内容,中公考研各科研究院老师将对2020考研试题进行试题变化及难 ...

最新文章

  1. 名片DIY官方认证代码_【教程】DIYQQ动态名片
  2. AB1601低功耗之IIC和PWM控制注意事项
  3. WIN7 64位系统注册银行支付组件
  4. Python基础学习笔记三
  5. jquery中prop()和attr()的使用
  6. 卧槽!这个价值百万的Github开源项目绝对要火!涵盖OCR、目标检测,NLP,语音合成多方向...
  7. robot连接mysql_Robotframework使用自写库连接mysql数据库
  8. 中小型研发团队架构落地实践18篇,含案例、代码
  9. 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用
  10. Word文件标尺工具不见了,怎么恢复
  11. vue 点击a链接 实现url下载文件
  12. 财务系统服务器计入什么科目,系统服务费入什么科目
  13. Jenkins自动集成
  14. 输入汉语星期几输出英文c语言程序,c输入1234567,输出英语星期日期
  15. 想知道录屏软件免费版有哪些?这4个工具能够做到,建议收藏备用
  16. Unity制作自己的Project Template
  17. .xb文件腾讯云备份恢复
  18. 一键解决重复性设计工作
  19. java 实现图片旋转_java实现图片旋转
  20. java版wifi下载电脑版_360wifi下载

热门文章

  1. python中为什么需要使用“if __name__ == '__main__'”语句
  2. maven 常用插件3
  3. 查询字符串中字母出现的个数
  4. AlertDialog.Builder选择对话框
  5. linux下添加自动启动项,linux 开机自动启动脚本方法
  6. centos6.0下ffmpeg的安装编译经历
  7. 机器之心助推长三角建设数据智能产业新高地:2018长三角数据智能盛典
  8. ASP.NET制作一个简单的等待窗口
  9. linux iscsi
  10. 【转载】企业级服务器设计与实现经验之插件系统基础篇