数据结构
- 计算机存储,组织数据的方式
时间复杂度
- 一个函数,定性描述该算法的运行时间
大O表示法
- 大O表示法是一种特殊的表示法,指出了算法速度有多快
- 大O表示法指出了最糟糕情况下的运行时间
- 一些常见的大O运行时间
-
- O(logn),对数时间,这样的算法包括二分查找
- O(n),线性时间,这样的算法包括简单查找
- O(n*logn),这样的算法包括快速排序---一种比较快的排序算法。
- O(n2),这样的算法包括选择排序---一种比较慢的排序算法。
- O(n!),这样的算法包括旅行商问题的解决方案----一种非常慢的算法。
总结
- 算法的速度指的并非时间,二十操作数的增速。
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
- 算法的运行时间用大O表示法表示。
- O(logn)比O(n)快,当需要搜索的元素越多时,前者比后者快的越多。
空间复杂度
- 一个函数,算法在运行过程中临时占用存储空间大小的度量
栈
什么是栈
- 一个后进先出(先进后出)的数据结构
- js 中没有栈,但可以用 Array 实现栈的所有功能(push--入栈; pop--出栈)
使用场景
- 所有需要后进先出的场景: 十进制转二进制,判断字符串中的括号是否有效,函数调用堆栈
前端与栈:JS 中的函数调用堆栈
- 断点调试 callStack.js
队列
- 一个先进先出的数据结构
- js 中没有队列,但可以使用 Array 实现队列所有功能
使用场景
- 所有需要先进先出的场景,js 异步中的任务队列,计算最近请求的次数
链表
- 多个元素组成的列表。
- 元素存储不连续,用 next 指针连在一起。
- 与数组的区别:数组增删非首尾元素时往往需要易懂元素;而链表增删非收尾元素,不需要移动元素,只需要更改 next 的指向即可。
- js 中没有链表,可以用 Object 模拟链表
js 中的原型链
- 原型链本质是链表
- 原型链上的节点是各种原型对象,比如:Function.prototype、Object.prototype...
- 原型链通过
__proto__属性连接各种原型对象
原型链知识点
- 如果 A 沿着原型链能找到 B.prototype,那么
A instanceof B为 true - 如果 A 对象上没有 x 属性,则会沿着原型链往上找
集合
- 一种无序且唯一的数据结构
- ES6 中有集合,名为 Set
- 集合的常用操作:去重、判断元素是否在集合中,求交集
字典
- 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储
- es6 中有字典,Map
- 字典的常用操作:健值对的增删改查
树
- 一种分层数据的抽象模型
- 前端常见的树:DOM 树,级联选择,树形控件
- js 中没有树,可以通过 Object 和 Array 构建树
{
label: 'a',
value: 'aaa',
children: [
{
label: 'a-a',
value: 'a-aaa'
}
]
}
常用操作
- 深度/广度优先遍历;对于二叉树还是有先中后序遍历
深度优先遍历
-
尽可能深的搜索树的分支
- 访问根节点
- 对根节点的 children 挨个进行深度优先遍历
广度优先遍历
-
先访问离根节点近的节点
- 新建一个队列,把根节点入队
- 把队头出队并访问
- 把队头的 children 挨个入队。
- 重复第二,第三步知道队列为空
二叉树
- 树中每个节点最多只能有两个字节点
- 在 js 中通常用 Object 来模拟二叉树
先序遍历口诀
- 访问根节点
- 对根节点的左子树进行先序遍历
- 对根节点的右子树进行先序遍历
中序遍历口诀
- 对根节点的左子树进行中序遍历
- 访问根节点
- 对根节点的右子树进行中序遍历
后序遍历口诀
- 对根节点的左子树进行后序遍历
- 对根节点的右子树进行后序遍历
- 访问根节点
图
- 图是网络结构的抽象模型,是一组由边连接的节点
- 图可以表示任何二元关系,比如道路航班。。。
- js 中没有图,但是可以用 Object 和 Array 构建图
- 图的表示法:临接矩阵、临接表、关联矩阵。。。
常用操作
-
深度优先遍历:尽可能深的搜索图的分支
- 访问根节点。
- 对根节点的没有访问过的相邻节点挨个进行深度优先遍历。
-
广度优先遍历:现访问离根节点最近的节点。
- 新建一个队列,把根节点入队。
- 把队头出队并访问。
- 把队头的每访问过的相邻节点入队。
- 重复 2,3 直到队列为空
堆
- 堆是一种特殊的完全二叉树
- 所有的节点都大于等于(最大堆)或小于等于(最小堆)他的字节点
- js 中通常用数组表示堆
- 左侧字节点的位置是 2*index+1
- 右侧字节点的位置是 2* index+2
- 父节点位置是(index-1)/2
- 快速高效的找出最大值和最小值:时间复杂度:O(1)
- 找出第 k 个最大最小值
第 K 个最大元素
- 构建一个最小堆
- 当对的容量超过 k,就删除堆顶
- 插入结束后,堆顶就是第 k 个最大元素
js 实现最小堆类
- 在类里,申明一个数组,用来装元素。
- 主要方法:插入,删除堆顶,获取堆顶,获取堆大小
递归
- 检查元素中的每一层
- 如果没有找到想要的元素,返回1
- 如果找到想要的元素则大功告成