909 字
5 分钟
代码里的逻辑森林:「数据结构」课程笔记·期末

数据结构与算法#


顺序表【算法】#

  • 定义
  • 结构
  • 实现

链表【算法】#

  • 结构
  • 实现
  • 双链表
  • 循环链表

栈与队列#

  • 概念
  • 存储结构

#

  • 概念
  • 匹配(简单模式;KMP)
  • 压缩存储

树和二叉树#

  • 概念和性质(树&特殊二叉树)

  • 存储结构

  • 树的应用(哈夫曼;并查集;二叉排序树;(平衡二叉树;红黑树;B&B+树;堆排序))

  • nn 个符号构造哈夫曼树,共新建 n1n-1 个节点,结点总数为 2n12n-1

  • nn 个节点的树会有 n1n-1 条边

  • 树性质:

    • 总结点数 =n0+n1+n2++nm=n_0+n_1+n_2+\dots+n_m
    • 总分支数 =1n1+2n2++mnm=1n_1+2n_2+\dots+mn_m
    • 总结点数 == 总分支数 +1+1
  • 二叉树性质:

    • 叶子结点 n0=n2+1n_0=n_2+1
    • kk 层节点数至多 2k12^{k-1}
    • 高度为 hh 二叉树至多 2h12^h-1 个节点
  • 前序+后序只能确定祖先关系,不能唯一确定二叉树。前序 XYXY,后序 YXYX,可推 XXYY 祖先

  • 森林转换为二叉树,前序对应前序,后序对应中序

  • 二叉排序树:左子树节点值都小于根节点;右子树节点值都大于根节点

  • 平衡二叉树

    • 平衡因子:左子树高度-右子树高度(绝对值小于 1)
    • 平衡二叉树的旋转
  • B树

    • ![image-20240111010148399](Data Structure/image-20240111010148399.png)

#

  • 概念

  • 存储结构

  • 遍历

  • 图的应用(最小生成树;最短路;拓扑排序;关键路径)

  • nn 个顶点和 n1n-1 条边可以使无向图联通但无环, nn 条边便一定会有环

  • nn 个顶点的无向完全图有 Cn2C_n^2 条边,有向完全图有 2Cn22C_n^2 条边

  • 图bfs生成树比dfs生成树高小或相等;bfs生成树在所有生成树中树高最小

  • 最小生成树:

    • Prim算法(贪心):任取一节点,每次走连通分量集合中节点出发的权值最短的的路径,直到走完所有顶点
    • Kruskal算法:每次选择一条边,要求 1) 未被选取,合法路径中权值最小;2) 落在不同连通分量
  • 最短路(Dijkstra算法):

    • 三个数组记录:S[n] 标记是否访问过;dist[n] 当前最短路长度;pre[n] 当前节点最短路的前驱元素(当 dist 更新时随之更新)
    • 每次选择 未访问过distance 最小 的节点访问
  • 拓扑排序:

    • 每次取出没有入度的节点
    • 时间代价:邻接表存储 O(n+e)O(n+e);邻接矩阵存储 O(n2)O(n^2)
  • 关键路径:

    • 正拓扑求所有节点最早发生时间 ve(k)ve(k)
    • 逆拓扑求所有节点最迟发生时间 le(k)le(k)
    • 事件最早开始时间是起点节点的最早时间 e(a)e(a)
    • 事件最迟开始时间是终点节点的最迟时间-持续时间 l(a)l(a)
    • 事件最早和最迟相等(差额为 0 )则为关键活动,对应路径节点组成关键路径

查找#

  • 顺序查找
  • 折半查找
    • ![image-20240111005718788](Data Structure/image-20240111005718788.png)
  • 散列查找(哈希)

排序#

  • 插入排序(直接插入排序;希尔排序)
  • 交换排序(冒泡排序;快速排序)
  • 选择排序(简单选择排序;堆排序):每次选择最值放在最终位置
  • 归并排序
  • 内部排序算法间的比较
    • 稳定:插入 归并 冒泡 基数
    • ![image-20240111015205785](Data Structure/image-20240111015205785.png)
  • 外部排序(基本概念方法;多路归并树&败者树;置换-选择排序;最佳归并树)
    • ![image-20240111014133926](Data Structure/image-20240111014133926.png)
    • 置换选择排序:先一次塞满工作区,然后放最小的出去,同时记录“MINIMAX”,让每个归并段都可以升序,直到升序不了,创造新的归并段

算法设计:

  1. 堆排序 or 二分排序
  2. 并查集
  3. 链表 & 二叉树
代码里的逻辑森林:「数据结构」课程笔记·期末
https://leehenry.top/posts/debug_2_deploy/notesarchive/data-structure/
作者
伏枥 | Henry Lee
发布于
2024-04-28
许可协议
CC BY-NC-ND 4.0