1、数据结构是用来干嘛的?

数据结构与算法的诞生是让计算机「执行的更快」、「更省空间」的。

2、用什么来评判数据结构与算法的好坏?

从「执行时间」和「占用空间」两个方面来评判数据结构与算法的好坏。

3、什么是复杂度?

用「时间复杂度」和「空间复杂度」来描述性能问题,两者统称为复杂度。

4、复杂度描述了什么?

复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。

1、和性能分析相比有什么优点?

辅助度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。

2、为什么要复杂度分析?

复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。

1、什么方法可以进行复杂度分析?

方法:「大 O 表示法」

2、什么是大 O 表示法?

算法的「执行时间」与每行代码的「执行次数」成正比【T(n) = O(f(n)) 】=》其中T(n)表示算法执行总时间,f(n)表示每行代码执行总次数,而n往往表示数据的规模。

3、大 O 表示法的特点?

由于时间复杂度描述的是算法执行时间与数据规模的增长变化趋势,常量阶、低阶以及系数实际上对这种增长趋势不产决定性影响,所以在做时间复杂度分析时忽略这些项。

4、复杂度分析法则
  • [单段代码看频率]:看代码片段中「循环代码」的时间复杂度。

  • [多段代码看最大]:如果多个 for 循环,看「嵌套循环最多」的那段代码的时间复杂度。

  • [嵌套代码求乘积]:循环、递归代码,将内外嵌套代码求乘积去时间复杂度。

  • [多个规模求加法]: 法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。

时间复杂度

1、什么是复杂度?

所有代码的「执行时间 T(n)」 与每行代码的「执行次数n」 成正比【T(n) = O(f(n)) 】。

#####2、分析的三个方法 ■ 最多法则

忽略掉公式中的常量、低阶、系数,取最大循环次数就可以了,也就是循环次数最多的那行代码。

▍Example

1 // 求n个数字之和
2 int xiaolu(int n) {
3   int sum = 0;
4   for (int i = 1; i <= n; ++i) {
5     sum = sum + i;
6   }
7   return sum;
8 }
复制代码

▍分析 第二行是一行代码,也就是常量级别,与 n 没有关系,可以忽略,四、五行代码是我们重点分析对象,与 n 有关,时间复杂度就是反映执行时间和 n 数据规模的关系。求 n 个数据之和需要执行 n 次。所以时间复杂度为 O(n)。

■ 加法法则

总复杂度等于循环次数最多的那段复杂度。

▍Example

 1 int xiaolu(int n) {2   int sum = 0;3   //循环一4   for (int i = 1; i <= 100; j++) {5     sum = sum + i;6   }7   //循环二8   for (int j = 1; j <= n; j++) {9      sum = sum + i;
10   }
11 }
复制代码

▍分析 上边有两个循环,一个循环 100 次,另一个循环 n 次,我们选择循环次数最多的那一个且和「数据规模 n 」相关的循环。由上可知,我们很容易选出循环二,即和数据规模 n 有关,循环次数最多,循环次数最多的那段代码时间复杂度就代表总体的时间复杂度,为 O(n) ;

■ 乘法法则

当我们遇到嵌套的 for 循环的时候,怎么计算时间复杂度呢?那就是内外循环的乘积。

▍Example

1 for (int j = 1; j <= n; j++) {
2     for(int i = 1; i <= n; i++)
3     sum = sum + i;
4 }
复制代码

▍分析 外循环一次,内就循环 n 次,那么外循环 n 次,内就循环 n*n 次。所以时间复杂为 O(n²)。

空间复杂度

1、什么是空间复杂度?

表示算法的「存储空间」与「数据规模」之间的增长关

▍Example

  int i = 0;int[] a = new int[n];for (i; i <n; ++i) {a[i] = i * i;}
复制代码

▍分析 在所有代码中,我们很容易寻找到存储空间相关的代码,就是第二行,申请了一个 n 大小的存储空间,所以空间复杂度为 O(n)。

2、最常见的空间复杂度

O(1)、O(n)、O(n²)。

■ O(1)

常量级的时间复杂度表示方法,无论是一行代码,还是多行,只要是常量级的就用 O(1) 表示。

▍Example

1 int i = 1;
2 int j = 2;
3 int sum = i + j;
复制代码

▍分析 因为这三行代码,也就是常量级别的代码不随 n 数据规模的改变而改变。(循环、递归除外)

■ O(logn) | O(nlogn)

「对数阶时间复杂度」,最难分析的一种时间复杂度。

▍Example

1 i=1;
2 while (i <= n)  {
3   i = i * 3;
4 }
复制代码

▍分析 要求这段代码的时间复杂度就求这段代码执行了多少次,看下图具体分析。

▍补充 不管是以 2 为底、以 3 为底,还是以 10 为底,可以把所有对数阶的时间复杂度都记为 O(logn),因为对数之间可以转换的,参照高中课本。

■ O(m+n) | O(m*n)

参照上边讲到的加法和乘法法则。

1、最好、最坏时间复杂度

所谓的最好、最坏时间复杂度分别对应代码最好的情况和最坏的情况下的执行。

▍Example

1 //在一个 array 数组中查找一个数据 a 是否存在
2for (int i = 1; i < n; i++) {
3    if (array[i] == a) {
4       return i;
5    }
6 }
复制代码

▍分析 ① 最好情况就是数组的第一个就是我们要查找的数据,上边代码之执行一遍就可以,这种情况下的时间复杂度为最好时间复杂度,为 O(1)。

② 最坏的情况就是数组的最后一个才是我们要查找的数据,需要循环遍历 n 遍数组,也就对应最坏的时间复杂度为 O(n)

2、平均时间复杂度

平均时间复杂度需要借助概率论的知识去分析,也就是我们概率论中所说的加权平均值,也叫做期望值。

▍分析 比如上方的例子,假设我们查找的数据在数组中的概率为 1/2;出现在数组中的概率为 n/1,根据下边的公式就可以算出出现的概率为 1/2n

然后我们再把每种情况考虑进去,就可以计算出平均时间复杂度。

■ 几种复杂度性能对比

公众号:一个不甘平凡的码农

记录了三本学渣从 0 到 1 的编程故事,是一个致力于原创「数据结构与算法」之美的「web 前端」 技术号。

公众号回复 “葵花宝典” 即可领取小鹿收藏的自学资料。

【小猪佩奇漫画】| 复杂度分析原来那么简单!相关推荐

  1. 网恋吗?我小猪佩奇音

    导语:是不是觉得微博.抖音红人.朋友圈里的同学.同事的身上,频频出现了一只粉红色小猪的纹身贴?放心,这不是他们加入了什么邪教组织,而是想靠这种方式保护自己.毕竟,小猪佩奇身上纹,你就算个"社 ...

  2. 《小猪佩奇拜年歌》在QQ音乐和网易云音乐上线

    2021牛年春节马上就要到来,为了陪伴大家共度这个团圆美好的节日,孩之宝全球娱乐工作室eOne旗下动画品牌"小猪佩奇"正式推出<小猪佩奇拜年歌>.目前,这首极具中国年味 ...

  3. c语言画猪程序,数学思维+C语言画小猪佩奇,来试试?

    用C语言画小猪佩奇, 你能想到什么实现方式? No, no, no~ 让我们玩点生猛的. 直接编辑代码, 用命令行(CMD)编译及运行! (此处安利Sublime,瞬间提升逼格的神器) 然而, CMD ...

  4. 用 Python 20秒画完小猪佩奇“社会人”

    Python中文社区全球Python中文开发者的精神部落 今年社交平台上最火的带货女王是谁?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇. 如果你经常用抖音.快手.B站.知乎.微博--或 ...

  5. 「小猪佩奇」:成功儿童IP背后的商业逻辑和方法论

    作者:周佳晓 全文共 5343 字 6 图,阅读需要 12 分钟 一个成功的儿童IP需要来自儿童端和家长端的双向驱动力,缺一不可. 对于儿童端,业界已经有充分的实践和探索,并摸索出成熟套路:然而对于家 ...

  6. 2021年全球社交应用支出排行榜TikTok列榜首;小猪佩奇和抖音推出防沉迷系列视频 | 美通社头条...

    要闻摘要:2021年全球社交应用支出排行榜TikTok列榜首.小猪佩奇和抖音推出防沉迷系列视频.中国首个新冠病毒中和抗体联合治疗药物获国家药监局批准上市.GSK与Medicago宣布新冠植物源性佐剂候 ...

  7. 【Python】用Python画小猪佩奇,落叶树和动漫人物

    本文目录:小猪佩奇-落叶树-魔法少女 本文作者:小赖同学 最近在浏览Python文章时,无意中发现了一个好玩的画图工具turtle,看到各路大神竟然用Python画了一个图片出来,无法用言语来形容心中 ...

  8. 用python画小猪佩奇代码_Python turtle模块实例:绘制小猪佩奇(上)

    在上一节教程中,我们已经对小猪佩奇进行了分析,现在我们就来进行绘制. 设置画布和画笔 首先,我们定义一个 setting() 函数,用它来设置画布和画笔.setting() 函数的代码如下所示. de ...

  9. 用Python画小猪佩奇,看完别说你不会

    作者 | 上海小胖,四大咨询TechLead,mongoDB Professional 获得者.「Python专栏」专注Python领域的各种技术:爬虫.DevOps.人工智能.Web开发等. 今天闲 ...

最新文章

  1. 两篇大而全的SLAM综述
  2. Java protect属性
  3. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(二)转载自码农网
  4. Unofficial Windows Binaries for Python Extension Packages
  5. 使用BootStrapValidator来完成前端输入验证
  6. 使用WCF建立起Silverlight客户端与服务端的桥梁
  7. python基础小白题3
  8. html代码type,HTML中type是什么意思
  9. CV_LOAD_IMAGE_COLOR 和 CV_BGR2RGBA找不到定义
  10. mysql typedefinition_深入浅出Mysql——基础篇
  11. ​为什么你应该申请去小型的初创公司实习?
  12. nginx+keepalived构建主备负载均衡代理服务器
  13. (转)这是转型AI的励志故事,从非科班到拿下阿里云栖一等奖!
  14. 惠农网_破译反爬虫_使用代理IP爬取数据(源码)_一蓑烟雨任平生
  15. Android学习笔记(四十):Preference的使用
  16. 数分下第4讲 (8.2节): 平面和直线
  17. 【jquery-跨域】
  18. Linux内核裁剪机制优化(make menuconfig)
  19. 软件测试小黑指北-知识点复习
  20. 真无线蓝牙耳机哪款适合新手?数码发烧友最全盘点,高实用性蓝牙耳机

热门文章

  1. 重庆微企获5000万元风投-平板电脑和手机菜单系统-家庭智能信息终端
  2. IDEA插件之输入法自动切换【Smart Input Source】
  3. 最大概率法分词中词频惩罚因子的作用探究
  4. 疫情期间,大型企业如何保障日常会议的正常进行?
  5. 无锡设计培训——室内设计的三色原则
  6. 自动驾驶步入运营阶段,腾讯给出“车图云”的新解法
  7. android会中病毒吗,安卓手机浏览网页中病毒几率多大
  8. 【C语言】判断三角形形状
  9. c语言数组太大,如何处理c语言大数组
  10. 解决win10系统 3dMax只能渲染一次的问题