一、什么是复杂度分析?

1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。
2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。
3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。
4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。

二、为什么要进行复杂度分析?

1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。
2.掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。

三、如何进行复杂度分析?

1.大O表示法
1)来源
算法的执行时间与每行代码的执行次数成正比,用T(n) = O(f(n))表示,其中T(n)表示算法执行总时间,f(n)表示每行代码执行总次数,而n往往表示数据的规模。
2)特点
以时间复杂度为例,由于时间复杂度描述的是算法执行时间与数据规模的增长变化趋势,所以常量阶、低阶以及系数实际上对这种增长趋势不产决定性影响,所以在做时间复杂度分析时忽略这些项。
2.复杂度分析法则
1)单段代码看高频:比如循环。
2)多段代码取最大:比如一段代码中有单循环和多重循环,那么取多重循环的复杂度。
3)嵌套代码求乘积:比如递归、多重循环等
4)多个规模求加法:比如方法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。

四、常用的复杂度级别?

多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,
O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n2)(平方阶)、O(n3)(立方阶)
非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括,
O(2^n)(指数阶)、O(n!)(阶乘阶)

五、如何掌握好复杂度分析方法?

复杂度分析关键在于多练,所谓孰能生巧。

六 、时间复杂度分析

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

口诀

  1. 只关注循环执行次数最多的一段代码
  2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
  3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

非多项式量级的算法问题叫作 NP(Non-Deterministic Polynomial,非确定多项式)问题

常见的多项式时间复杂度举例

1. O(1)

一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

int i = 8;int j = 6;int sum = i + j;

2. O(logn)、O(nlogn)

//O(logn)i=1;while (i <= n)  {i = i * 2;}

归并排序、快速排序的时间复杂度都是 O(nlogn)

3. O(m+n)、O(m*n)

代码的复杂度由两个数据的规模来决定

//O(m+n)
int cal(int m, int n) {int sum_1 = 0;int i = 1;for (; i < m; ++i) {sum_1 = sum_1 + i;}int sum_2 = 0;int j = 1;for (; j < n; ++j) {sum_2 = sum_2 + j;}return sum_1 + sum_2;
}

七、 空间复杂度

空间复杂度的时候,是指除了原本的数据存储空间外,算法运行还需要额外的存储空间
空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

八、 最好、最坏、平均、均摊情况时间复杂度

1.同一段代码在不同情况下时间复杂度会出现量级差异,为了更全面,更准确的描述代码的时间复杂度,所以引入这4个概念。
2.代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度。大多数情况下,是不需要区别分析它们的。

最好情况时间复杂度(best case time complexity):最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度
最坏情况时间复杂度(worst case time complexity):最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。
平均情况时间复杂度(average case time complexity):平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度

//最好 O(1) 最坏 O(N)
//平均 n+1 情况)(找不到)
//概率相等 (1+···+n+n) / (n+1) =  n(n+3)/2(n+1)
//概率不等  找到和找不到各占二分之一  3(n+1)/4// n表示数组array的长度
int find(int[] array, int n, int x) {int i = 0;int pos = -1;for (; i < n; ++i) {if (array[i] == x) {pos = i;break;}}return pos;
}


均摊时间复杂度(amortized time complexity):摊还分析法,一种特殊的平均复杂度

在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。

//最好O(1) 最坏O(N) 平均 O(1) 均摊// array表示一个长度为n的数组// 代码中的array.length就等于nint[] array = new int[n];int count = 0;void insert(int val) {if (count == array.length) {int sum = 0;for (int i = 0; i < array.length; ++i) {sum = sum + array[i];}array[0] = sum;count = 1;}array[count] = val;++count;}

这段代码实现了一个往数组中插入数据的功能。当数组满了之后,也就是代码中的 count == array.length 时,我们用 for 循环遍历数组求和,并清空数组,将求和之后的 sum 值放到数组的第一个位置,然后再将新的数据插入。但如果数组一开始就有空闲空间,则直接将数据插入数组。
平均复杂度计算

九、 如何分析平均、均摊时间复杂度?

1.平均时间复杂度
代码在不同情况下复杂度出现量级差别,则用代码所有可能情况下执行次数的加权平均值表示。
2.均摊时间复杂度
两个条件满足时使用:1)代码在绝大多数情况下是低级别复杂度,只有极少数情况是高级别复杂度;2)低级别和高级别复杂度出现具有时序规律。均摊结果一般都等于低级别复杂度。

【数据结构与算法】复杂度分析相关推荐

  1. 算法复杂度分析看这一篇就够了

    执行效率是算法一个非常重要的考量指标,而时间复杂度和空间复杂度则是衡量算法代码的执行效率. 为什么需要复杂度分析 通常情况下,我们可以在写完代码的情况下把程序跑一遍,通过统计.监控,就能得出算法执行的 ...

  2. 数据结构与算法——复杂度

    算法是用于解决特定问题的一系列的执行步骤.使用不同算法,解决同一个问题,效率可能相差非常大.为了对算法的好坏进行评价,我们引入 "算法复杂度" 的概念. 1.引例:斐波那契数列(F ...

  3. 算法复杂度分析(下)

    前一篇文章算法复杂度分析(上)讲述了复杂度的大 O 表示法和几个分析原则,这篇文章我们来讲讲另外几种复杂度,最好情况时间复杂度(best case time complexity).最坏情况时间复杂度 ...

  4. 八大排序:Java实现八大排序及算法复杂度分析

    目录 QUESTION:八大排序:Java实现八大排序及算法复杂度分析 ANSWER: 一:冒泡排序 1.算法分析 2.时间复杂度分析 3.代码 二:选择排序 1.算法分析 2.时间复杂度分析 3.代 ...

  5. 网络流问题以及EK算法复杂度分析

    网络流问题以及EK算法复杂度分析 一.网络流算法 通过一个例子引入网络流问题. 现有一个自来水厂要往家里通水,自来水厂用Vs表示,家用Vt表示.从自来水厂到家之间连接了很多水管,并且中途经过很多转接点 ...

  6. 算法之如何进行算法复杂度分析

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

  7. 怎么算matlab算法复杂度,算法复杂度分析

    1. 何为数据结构?何为算法? 简单来说,数据结构就是数据的存储方式,比如数组就是把数据存在一段连续的内存上,而链表则是通过指针的关联将数据存在任意可用的内存上:栈是先进后出,队列是先进先出. 而算法 ...

  8. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  9. 算法复杂度分析(3600字)

    文章目录 前言 一.复杂度分析的意义 二.复杂度分析基础 1. 大 O O O复杂度表示法 2. 时间复杂度分析方法 2.1 加法法则 2.2 乘法法则 3. 空间复杂度 总结 1. O ( 1 ) ...

  10. 第3课:算法复杂度分析(下):最好、最坏、平均、均摊时间复杂度

    目录 最好.最坏时间复杂度 平均情况时间复杂度 均摊时间复杂度 小结 最好.最坏时间复杂度 我们先看一个例子: /*例1:查找x在数组中出现的位置,如果没有找到,返回-1.n表示数组array的长度 ...

最新文章

  1. css层叠样式表(一)
  2. 通过scatter图寻找噪音
  3. java 分布式事务_Java核心知识 Spring原理十五 JPA 原理
  4. python argparse nargs_Python | 使用argparse解析命令行参数
  5. JS获取浏览器信息及屏幕分辨率
  6. linux学习之路之使用脚本来复制二进制程序和所需的库文件
  7. 20201008:力扣209周周赛题解(下)
  8. 杭电1081_二维dp
  9. 如何从Windows中访问Linux硬盘,干货:如何从 Windows 系统访问 Linux 文件
  10. 挺有意思的文章。。。
  11. 在 VS Code 中开始使用 Python
  12. STL容器底层数据结构
  13. qq音乐——获取歌曲图片和名称
  14. 【科软课程NLP】自然语言处理复习
  15. 做了8年前端,感谢那些优秀的后端,陪伴我工作,教会我成长
  16. python数据分析就业班_云开见明 2020Python数据分析师特训营全套课程84节
  17. 数据库之数据库和表的创建
  18. 2021 年广东省职业院校技能大赛(中职组) 网络搭建与应用赛项国赛遴选赛卷(B)
  19. 私域电商个人号IP运营指南 私域流量池之微信个人号基础操作手册
  20. 考研英语核心词汇梳理二

热门文章

  1. 如何在intellj Idea中给新建的项目添加jar包?
  2. CozyRSS开发记录8-解析一份RSS
  3. 一款研发管理软件的对象标签介绍
  4. HK-2000 数采仪系统说明之 7.HK7710 DTU 简单配置说明
  5. 6、jeecg 笔记之 自定义excel 模板导出(一)
  6. js正则表达式匹配span标签
  7. Java调用ElasticSearch 7.2.1 保存、统计、多字段分组聚合
  8. java调用dubbo服务器_dubbo源码分析-服务端注册流程-笔记
  9. dentity在Java里是什么意思_注释@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)的用途是什么?为什么世代类型是身份?...
  10. java数组排序源码_Java 数组工具类排序,最大值最小值等