课程目标
- 掌握数据结构与算法的理论知识
- 补齐面试的缺少点
- 编程与算法的结合
怎么掌握
- 理论
- 刷题
- 实战
重点关注:数据结构与算法的特点,应用场景,js实现,时间/空间复杂度
数据结构:
栈、队列、集合、链表、字典、树、图、堆
进阶算法:
冒泡算法、选择算法、插入算法、归并算法、快速算法、顺序算法、二分搜索
算法设计思想:
- 分而治之
- 动态规划
- 贪心
- 回溯
数据结构与算法是什么:
- 数据结构: 计算机存储、组织数据的方式
- 算法: 一系列解决问题的指令
- 程序 = 数据结构 + 算法
- 时间复杂度:
- 一个函数, 用大O表示,比如O(1)、O(n)、O(logN)...
- 其实就是该算法函数的运行时间
- n! > 2n > n2 > nlog2n > n > /n > log2n > 1
- 空间复杂度
- 一个函数, 用大O表示,比如O(1)、O(n)、O(n^2)...
- 算法在运行过程中占用存储空间
栈
- 栈是什么: 栈是一个后进先出的数据结构
- js没有栈的数据结构,可以使用array进行模拟
- 数组有push, pop[pop的含义是删除最后一个属性,并返回这个属性]
- js函数堆栈
- 函数调用也是使用栈进行调用的“callStack”, 如下图所示fun1开始执行进入fun2,fun2开始执行进入fun3,但是需要等fun3全部执行完成之后,fun2才能结束
- 函数调用也是使用栈进行调用的“callStack”, 如下图所示fun1开始执行进入fun2,fun2开始执行进入fun3,但是需要等fun3全部执行完成之后,fun2才能结束
队列
- 队列是什么:队列是一个先进先出的数据结构
- js没有栈的数据结构,可以使用array进行实现
- 数组有push, shift[shift的含义是删除第一个属性,并返回这个属性]
- 特点:
- 先进先出,保证有序
- 异步队列,js是单线程,无法处理异步函数第并发任务,需要使用队列有序处理
- eventLoop 首先会有一个callback queue (任务队列) -> js引擎会去任务队列里取,如果有异步函数,会存放在(webapi)异步队列,等主事件走完才会返回来走异步队列的回调函数
链表
- 链表简介:
- 多个元素组成的一个列表,元素存储不连续,用next指针连在一起
- 数组vs链表:
- 增删非首尾元素时候往往需要移动元素,如:删除第二个第三个会变成第二个
- 删除指针,不会改变元素位置
- js没有链表,可以使用obj进行代替
- js中的原型链,就是一个链表结构,(他只是根据proto走的不是next)
集合
- 集合简介:
- 集合是一种
无序且唯一的数据结构 - ES6有集合类型。 Set
- 集合常见的操作: 去重,判断某元素是否在集合中,求交集...
- 集合是一种
字典
- 字典简介:
- 与集合类似,字典也是存储唯一值的一种数据结构,但他是以键值对的形式来储存的
- ES6有字典:Map(映射)
- 键值对的增删改查
树
- 树的简介
- 一种分层数据的抽象模型
- 常见的树:DOM树,集联选择、树形控件
- js没有树这个结构,可以用obj与arr进行书写树结构{a:[{}] }
- 树的常用操作: 深度/广度优先遍历,先中后序遍历
- 树的深度优先遍历:尽可能深的搜索树的分支
- 访问根节点
- 对根节点的children挨个进行优先遍历
- 广度优先遍历:先访问离根节点最近的分支
- 新建一个队列,把根节点入队
- 把队头出队并访问
- 把队头的children挨个入队
- 重复二三步,直到队头为空
- 先中后序遍历
- 二叉树:每个节点最多有两个子节点
- 前序遍历
- 访问根节点
- 对根节点的左子树进行先序遍历
- 对根节点的右子树进行先序遍历
- 中序遍历
- 对根节点的左子树进行先序遍历
- 访问根节点
- 对根节点的右子树进行先序遍历
- 后续遍历
- 对根节点的左子树进行先序遍历
- 对根节点的右子树进行先序遍历
- 访问根节点
- 树的深度优先遍历:尽可能深的搜索树的分支
图
-
图是什么?
- 图是抽象模型,是一组有边连接的节点(比如路、航班)
- js没有图这个结构,可以用obj与arr进行书写图结构
- 图的表示法: 邻接矩阵,邻接表,关联矩阵...
- 邻接矩阵: 此表说明A能连接到B,B能连接到C,C也能连接到B
- / A B C
- A 0 1 0
- B 1 0 1
- C 0 1 0
- 邻接表:
{ A: ["B"], B: ["A", "C"], C: ["B"] } -
图的常用操作
- 深度优先遍历
- 尽可能深的搜索图的分支
- 访问根结点
- 对根结点没有访问过的相邻节点挨个进行深度优先遍历
- 广度优先遍历
- 先访问离根结点最近的节点
- 深度优先遍历