原文:https://www.freecodecamp.org/news/the-complexity-of-simple-algorithms-and-data-structures-in-javascript-11e25b29de1e/

译者:zhicheng

校对者:Chengjun.L

在之前的文章迈向计算科学的一步:JS 里的简易算法和数据结构里,我们讨论了简易的算法 (线性和二分搜索;冒泡、选择、插入排序) 以及数据结构 (数组、键值对对象),这里将继续讨论算法和数据结构的复杂度概念及其应用。

复杂度

复杂度是衡量程序复杂程度的一个指标。对于算法和数据结构来讲,它代表运行指定任务(如搜索、排序、访问数据)花费的时间和空间 (计算所消耗的内存)。任务的执行效率取决于执行完整程序需要的操作数。

扔垃圾需要 3 步 (打包垃圾袋,拎出去,扔进垃圾桶里)。 扔垃圾很简单,但是如果扔装修一周后攒的垃圾,会发现不能完成这个简单的任务,因为垃圾桶空间不足 。

房屋吸尘需要一些重复的步骤 (打开开关,使用吸尘器头重复的在地板上刮扫,关闭开关)。越大的房间就需要在地板上刮扫越多次,房屋除尘也就要耗费越多的时间 。

执行的操作数和执行元素的数量有一定的关系。垃圾 (元素) 越多花费的时间越多。这就产生了空间复杂度问题。面积 (元素) 越大,吸尘器头刮扫的次数就越多,这就产生了时间复杂度问题。

不管是扔垃圾还是房间吸尘, 操作数 (O) 和 元素的数量 (n) 成正比。如果只有一个垃圾袋,那么一次只能携带一袋垃圾。如果有两个垃圾袋,那么同时就能携带两袋垃圾,当然这是在体力足以同时拎两袋垃圾的前提下。这些家务活的大 O 就是 O = n,也可以写成 O = function(n) 或者 O(n) 。在这里复杂度是线性的 (操作数和元素是一一对应的关系),即 30 个操作对应 30 个元素 (上图的黄线)。

在算法和数据结构里情况是一样的。

搜索

线性搜索

元素搜索的最好情况是有序列表,假设要搜索的元素就在列表的第一项,这时复杂度是常数 O(1) 。因此,如果搜索的元素总是第一个被索引到,和列表长度无关,元素会当即被搜索到。搜索的复杂度是和列表长度相关的常数。这种搜索平均最坏的情况是线性复杂度 O(n),换言之,n 个元素,要遍历 n 次才能找到,因此叫线性搜索。

二分搜索

对于二分搜索, 最好的情况也是 O(1) ,此时搜索的元素位于中点,平均最坏的情况是 n 以 2 为底的对数:

对数或者 log 是幂运算的逆运算。所以如果有 16 个元素 (n=16),这时至少要花费,最坏情况下是 4,4 步就能找到数字 15 (基数 = 4)。

或者, O(log n)

排序

冒泡

在冒泡排序里,元素和剩下的元素集合对比来找更高的元素向上冒泡,所以,平均最坏的情况,复杂度是 O(n²) ,也就是嵌套循环。

每一个元素都要和剩下元素的集合进行对比,4 个元素一共对比 16 次 (4² = 16)。 最好的情况是集合除了一个元素外其余都已经排好序了,那么只需进行一轮对比,也就是说四个元素需要和集合里剩下的 3 个分别元素对比,复杂度也就是 O(n) 。

选择排序

冒泡排序高值冒泡不同, 选择排序把最低值放在未排序元素的最前面,因为需要和剩下集合的每个元素对比,它的复杂度是 O(n²) 。

插值排序

冒泡&选择排序不同, 插值排序把元素直接插入到正确的位置,和上一个排序一样,需要和集合里剩下的元素对比,因此平均最坏的复杂度 是 O(n²) 。和冒泡排序类似,如果只有一个元素需要排序,只需要一轮对比来把元素插入到正确的位置,复杂度为 O(n) 。

数据结构

数组

因为通过索引访问、添加或者删除末位数据元素只需要一步, 访问、推入、弹出数组里的值的复杂度是 O(1) ,因此,在数组里通过索引来线性搜索的复杂度是 O(n) 。

另外,在数组在前面 shift 或者 unshift 值需要重新索引 之后的每一个元素 (比如,移除索引为 0 的元素需要重新给索引为 1 的元素标记为 0,依次直到第四个),它的复杂度是 O(n) ,需要重新标记所有元素。

健 - 值对对象

通过健访问、插入或者删除值是瞬间发生的,因此,复杂度是 O(1) 。通过索引健在 “存储箱” 中搜索特定的项目本质是线性搜索,因此它的复杂度是 O(n) 。

结论

复杂度不只是既定算法和数据结构里面的一个论题。运用恰当,它会是衡量代码的效率的一个利器。


推荐阅读:

原生JS实现DOM爆炸效果

Code Review 礼节

是哪些工具和资源帮我拿下第一份前端工作的?

点击阅读原文访问 freeCodeCamp 中文论坛的更多内容

js 冒泡排序_JS 里的简易算法和数据结构之复杂度相关推荐

  1. 各种算法和数据结构的复杂度

    从liuyuanhao那里转过来的. 转载于:https://www.cnblogs.com/jz-597/p/11145210.html

  2. Caché 算法与数据结构

    第一章 Caché 算法与数据结构 基础和概念 ☆☆☆☆☆ 第二章 Caché 算法与数据结构 数组原理 ☆☆☆☆☆ 第三章 Caché 算法与数据结构 链表原理 ☆☆☆☆☆ 第四章 Caché 算法 ...

  3. 国家税务总局全国增值税发票查验平台网站js逆向分析及全逆向算法还原

    本文教程针对的是2021年7月2日时国税查验平台的js分析,其中版本号为V2.0.06_009.主要分析内容为key9和flwq39以及fplx这3个参数的算法,其中key9分为获取验证码阶段和查验阶 ...

  4. 【算法与数据结构】JS基础——数组

    前言 Hello,大家好,这里是成功在家隔离四天的GIS宇宙,最近趁着不怎么忙碌,可以好好学习一下算法和数据结构了,本科期间基本学了和没学一样,所以接下来会出一个关于JavaScript算法和数据结构 ...

  5. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  6. C语言求最大公约数欧几里得Euclid算法(附完整源码)

    最大公约数欧几里得Euclid算法 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) #inclu ...

  7. JS删除String里某个字符的方法

    关于JS删除String里的字符的方法,一般使用replace()方法.但是这个方法只会删除一次,如果需要将string里的所以字符都删除就要用到正则. 1 2 3 4 var str = " ...

  8. halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...

    作者:  博观厚积 简书专栏:https://www.jianshu.com/u/2f376f777ef1 1. 关于集成学习算法 集成学习算法,通俗地讲就是:三个臭皮匠,顶个诸葛亮,这在很多地方都有 ...

  9. js判断数组里是否有重复元素的方法

    转: js判断数组里是否有重复元素的方法 https://blog.csdn.net/longzhoufeng/article/details/78840974 第一种方法:但是下面的这种方法数字字符 ...

最新文章

  1. 数据挖掘试题(150道) (1)
  2. centos安装JDK与Tomcat
  3. Vita Helper v0.08 Build 20140722
  4. 【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程
  5. kill无法杀死某个进程
  6. “云”端的语雀:用 JavaScript 全栈打造商业级应用
  7. Python命令行之旅:使用argparse实现git命令
  8. python get()函数_C++使用ffpython嵌入和扩展python(python2和python3)
  9. python网络爬虫基础day01
  10. python字符子串_子字符串和子序列(Python),子串,python
  11. SVN中trunk,branches,tags用法详解
  12. 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)...
  13. python画正切函数图像_python的pygal模块绘制反正切函数图像方法
  14. C++ ACM程序设计大赛--练习1
  15. 信息系统项目管理师考试心得
  16. 骂人不带脏字的80后
  17. String format格式化
  18. Java应用开发全栈工程师
  19. Unity新手必备!推荐一些免费模型、音乐等素材网址,推荐开发工具,故障、报错处理,推荐的官方资源包教程学习
  20. Mysql数据库常用的词汇,新手必备

热门文章

  1. word打开老是配置进度_word怎么转pdf?两个值得学习的高效转换法
  2. 5v 3.3v电平转换电路_3.3V与5V系统电平兼容的方法探究
  3. python 文件读写 newline_「Python」:文件读写
  4. WireShark 查看UDP码流的丢包率
  5. Azure PaaS服务密钥的安全性
  6. ADC 电路板布线注意事项
  7. MySQL 5.6.21 最新版的安装
  8. ASP.NET MVC 3—一切的开始MvcHandler、MvcHttpHandler
  9. Git(2)-- Git安装后首次配置与第一次使用Git和Github管理自己的代码(超详细纯小白图文教程)
  10. Ubuntu修改su和sudo密码