js数据结构与算法

69 阅读4分钟

课程目标

  1. 掌握数据结构与算法的理论知识
  2. 补齐面试的缺少点
  3. 编程与算法的结合
怎么掌握
  • 理论
  • 刷题
  • 实战
重点关注:数据结构与算法的特点,应用场景,js实现,时间/空间复杂度

数据结构:

栈、队列、集合、链表、字典、树、图、堆

进阶算法:

冒泡算法、选择算法、插入算法、归并算法、快速算法、顺序算法、二分搜索

算法设计思想:

  • 分而治之
  • 动态规划
  • 贪心
  • 回溯
数据结构与算法是什么:
  • 数据结构: 计算机存储、组织数据的方式
  • 算法: 一系列解决问题的指令
  • 程序 = 数据结构 + 算法
  1. 时间复杂度:
  • 一个函数, 用大O表示,比如O(1)、O(n)、O(logN)...
  • 其实就是该算法函数的运行时间
  • n! > 2n > n2 > nlog2n > n > /n > log2n > 1
  1. 空间复杂度
  • 一个函数, 用大O表示,比如O(1)、O(n)、O(n^2)...
  • 算法在运行过程中占用存储空间

  • 栈是什么: 栈是一个后进先出的数据结构
  • js没有栈的数据结构,可以使用array进行模拟
    • 数组有push, pop[pop的含义是删除最后一个属性,并返回这个属性]
  • js函数堆栈
    • 函数调用也是使用栈进行调用的“callStack”, 如下图所示fun1开始执行进入fun2,fun2开始执行进入fun3,但是需要等fun3全部执行完成之后,fun2才能结束 image.png

队列

  • 队列是什么:队列是一个先进先出的数据结构
  • 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"]
    }
    
  • 图的常用操作

    • 深度优先遍历
      • 尽可能深的搜索图的分支
      • 访问根结点
      • 对根结点没有访问过的相邻节点挨个进行深度优先遍历
    • 广度优先遍历
      • 先访问离根结点最近的节点

搜索排序

分而治之

动态规划

贪心算法

回溯算法