Skip to content

《学习JavaScript数据结构与算法(第2版)》精读笔记

写在前面

  • 书籍介绍:本书讨论了数组、栈、队列、链表、集合、字典、散列表、树、图等数据结构,之后探讨了各种排序和搜索算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序、顺序搜索、二分搜索,然后介绍了动态规划和贪心算法等常用的高级算法以及函数式编程,最后还介绍了如何计算算法的复杂度。
  • 我的简评:数据结构和算法知识可以说是编程的通识,不管学习哪门编程语言,理解好数据结构,会一些基本的算法,才算入门。并且深入数据结构和算法,才能在编程的路上走得更高、更远。
  • !!福利:文末有pdf书籍、笔记思维导图、随书代码打包下载地址哦

数据结构

  • 列表 List:斐波那契数列
  • 队列 Queue:对数据进行排序;优先队列
  • 栈 Stack:括号闭合; 进制转换;回文判断;递归演示;汉诺塔
  • 字典 Dictionary
  • 集合 Set:并集、交集、差集、子集
  • 散列表 HashTable:散列函数;处理冲突有几种方法:分离链接、线性探查和双散列法
  • 链表 LinkedList:双向链表;循环链表
  • 二叉树 Bst:访问树的所有节点有三种方式:中序、先序和后序;难点:移除一个节点;自平衡二叉查找树、AVL树、红黑树
  • 图 Graph:邻接矩阵;图遍历: 广度优先搜索(Breadth-First Search, BFS)和深度优先搜索(Depth-First Search, DFS)
  • 最短路径算法
  • 最小生成树

算法基础

基本算法:

  • 阶乘:return n * factorial(n - 1);
  • 斐波那契数列:return fibonacci2(n - 1) + fibonacci2(n - 2);;尾递归优化
  • 素数检测:遍历i < Math.sqrt(n); 判断n % i == 0;
  • 最大公约数:遍历i=Math.min(a, b);判断a % i == 0 && b % i == 0;
  • 最小公倍数:遍历从i=Math.max(a, b);到i <= a * b;判断i % a == 0 && i % b == 0;
  • 杨辉三角
  • 最长公共子串

排序算法:

  • 选择排序
  • 插入排序
  • 希尔排序
  • 归并排序
  • 堆排序
  • 快速排序

搜索算法:

  • 线性查找
  • 二分查找
  • 跳转查找
  • 插值查找
  • 深度优先搜索
  • 广度优先搜索

算法通识:

  • 算法模式:1、递归:递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题。递归通常涉及函数调用自身。ECMAScript 6有尾调用优化;2、动态规划(Dynamic Programming, DP)是一种将复杂问题分解成更小的子问题来解决的优化技术。能解决的一些著名的问题如下:背包问题、最长公共子序列、矩阵链相乘、硬币找零、图的全源最短路径;3、贪心算法遵循一种近似解决问题的技术,期盼通过每个阶段的局部最优选择(当前最好的解),从而达到全局的最优(全局最优解)。
  • 算法复杂度:1、大 O 表示法:一般考虑的是CPU(时间)占用。排序算法的时间复杂度;搜索算法的时间复杂度;2、NP 完全理论:多项式算法。

设计原则

  • 单一职责原则:SRP 原则体现为:一个对象(方法)只做一件事情;SRP 原则是所有原则中最简单也是最难正确运用的原则之一。
  • 最少知识原则:最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。
  • 开放封闭原则:定义如下:软件实体(类、模块、函数)等应该是可以扩展的,但是不可修改;几乎所有的设计模式都是遵守开放-封闭原则的,我们见到的好设计,通常都经得起开放-封闭原则的考验。
  • 接口与面向接口原则:接口是对象能响应的请求的集合;接口在 JavaScript 中的最大作用就退化到了检查代码的规范性。

写在后面