【408】数据结构第一轮强化笔记

本文详述了数据结构的基础知识,包括线性结构、非线性结构、存储结构和数据运算。深入探讨了线性表、栈、队列、串、树与二叉树、图以及排序和查找算法,涵盖了它们的逻辑特性、物理存储、操作方法及复杂度分析。同时,提到了特殊矩阵的压缩存储、字符串模式匹配算法以及哈希表和二叉搜索树等高级主题。

数据结构第一轮强化笔记

根据天勤高分笔记所做

1 绪论

C / C++

  • 函数传参

    • 普通变量引用型

      • void f(int &x)
    • 指针型变量

      • void f(int *&x)
    • 二维数组

      • void f(int x[][length], int length)
    • 总结

      • 变量需要改变则加 &(数组) / *&(指针)

数据结构(三要素)

  • 逻辑结构

    • 线性结构

      • 线性表、队列、栈
    • 非线性结构

      • 集合、树、图
  • 物理结构(存储结构)

    • 顺序存储、链式存储、索引存储、散列存储
  • 数据的运算

复杂度排序

  • 1 < log2n < n < nlog2n < n^x < 2^n

算法的特性

  • 有穷性、确定性、输入、输出、可行性

算法的设计目标

  • 正确性、可读性、健壮性、高效率与低存储量

2 线性表

循环单链表最后一个结点的指针域指向头结点 / 开始结点(无头结点)
带头结点循环双链表无空指针

存储结构

  • 顺序表

    • 支持随机访问
    • 地址空间连续
  • 链表

    • 存储空间利用率较低

    • 动态分配,不支持随机访问

    • 形式

      • 单链表,双链表,循环单链表,循环双链表,静态链表

链表适合增删

顺序表适合随机访问

  • 第 i 位插入新元素,移动n-i + 1个元素
  • 第 i 位元素删除,移动n-i 个元素

3 栈和队列

最适合用作链队的结构是只带队尾指针的循环单链表

  • FILO

    • 卡特兰数:(1/(1 + n ))* C(n,2n)
  • 存储结构

    • 顺序栈
    • 链栈
    • 共享栈
  • 运算

    • 进栈 / 出栈
    • 栈满 / 栈空

队列

  • FIFO

  • 存储结构

    • 顺序队列

      • 循环队列

        • 删除元素,队首指针+1

          • Q·front=(Q·front+1)%MaxSize
        • 插入元素,队尾指针+1

        • 出队入队都按顺时针进1

        • 全满 元素:(rear-front+MaxSize)% MaxSize

        • 空位 元素:(rear-front+1+MaxSize)% MaxSize

      • 双端队列

    • 链式队列

  • 运算

    • 进队 / 出队
    • 队满 / 队空

矩阵的压缩存储

  • 压缩存储

    • 指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间
  • 特殊矩阵

    • 对称矩阵

    • 三角矩阵

    • 对角矩阵

    • 各矩阵的下标

      对称矩阵 k=i(i-1)/2 + j - 1 【下三角和主对角线】 k=j(j-1)/2 + i - 1 【上三角】
      三角矩阵 下三角 k=i(i-1)/2 + j - 1 【下三角和主对角线】 k= n(n+1) /2 【上三角】 上三角 k=(i-1)(2n-i+2)/2 + j - 1 【上三角和主对角线】 k= n(n+1) /2 【下三角】三对角矩阵(带状矩阵) k=2i+j-3 已知下标求矩阵中的位置:i=┗(k +1)/3+1┛ j =(k -2i )+3数组下标k均从0开始

稀疏矩阵

  • 三元组表示法

  • 伪地址表示法

  • 链式存储

    • 领接表表示法
    • 十字链表表示法

4 串

1.空格串不是空串

概念

  • 主串
  • 子串
  • 串长

存储结构

  • 字符数组

模式匹配算法

  • 暴力

    • O(nm)
  • KMP算法

    • O(n +m)

      • 掌握KMP算法的滑动
      • 前缀匹配,next数组
  • KMP算法进一步优化

    • nextVal

5 树与二叉树

二叉树前中后序遍历中,所有叶子节点在遍历序列中的先后顺序完全相同
二叉树采用二叉链表存储,交换所有分支结点左右子树位置,利用后序遍历方法最合适
单个根结点也算作叶子结点
叶子结点数为n,度为m的哈夫曼树非叶子结点个数为【n-1/m-1】
度 = n - 1

存储结构

  • 顺序存储

    • 双亲表示法

      • 数组
  • 链式存储

    • 孩子表示法

      • 邻接表
    • 孩子兄弟表示法

二叉树

  • 概念

    • 度为2的树和二叉树

      • 度为2的树至少有3个结点
      • 度为2的树若只有一个孩子无须确定左右次序
    • 完全二叉树

      • 除最后一层为满二叉树,最后一层结点从左到右
  • 性质

    • 结点数 n = n0 + n1 + n2
    • 出度为0(叶子结点)数 n0 = n2 + 1
    • 第 i 层上至多有2^(i-1)个结点
    • 高度为h至多有(2^h-1)个结点
    • Catalan:n个结点能构成 C(n,2n) / (n+1)
    • 具有n个结点的完全二叉树高度为log2n + 1
  • 存储

    • 顺序存储

      • 数组,最适合用于完全二叉树
    • 链式指针

  • 操作

    • 遍历

      • 前序遍历

        • 中左右
      • 中序遍历

        • 左中右
      • 后序遍历

        • 左右中
      • 层次遍历

        • 从上到下,从左到右
    • 线索化二叉树

      • 目的:利用指针空链域,方便遍历

      • 前序线索二叉树

      • 中序线索二叉树

        • 左空指前驱,右空指后继,双指针遍历
      • 后序线索二叉树

树/森林

  • 转换

    • 树->二叉树

      • 左孩子右兄弟表示法
    • 森林->二叉树

      • 先树->二叉树,再连接森林
    • 二叉树->树

      • 逆孩子兄弟表示法
    • 二叉树->森林

      • 根靠右边孩子断开
  • 遍历

    • 先序遍历

      • 先根后子树
    • 后/中序遍历

      • 先子树后根

应用

  • 二叉排序树

    • 平衡二叉树

      • 插入

        • 找离插入点最近的平衡因子>1的结点
        • 四种旋转
      • 查找

        • 比较次数最多是树的深度

        • 深度为h 最少结点: nʰ=n⁽ʰ⁻¹⁾+nʰ⁻²+1

          • 非叶子结点的平衡因子均为1
  • Huffman树

    • 特点:带权路径最短,n1 = 0,有同权则不唯一
    • 构造方法:每次取最小的两个结点生成新结点
  • Huffman编码

    • 最短前缀码
  • Huffman N叉树

    • 补充0结点个数为 ?
  • 并查集

    • Union
    • Find
  • 红黑树

6 图

最小生成树的结构不唯一,但图中各边权值不相等时,最小生成树唯一
最小生成树的权值之和总是唯一
最小生成树的边数等于顶点数-1
存在边权值相等的最小生成树也可能唯一,无相等边权值必唯一,有相等边权值可能唯一
DFS和拓扑排序可以检测环
各边权值都相等时可以用BFS解决单源最短路径问题(退化为跳数
回路不是简单路径
存在拓扑序列则图无回路

概念

  • 简单图

    • 不存在重复边
    • 不存在顶点到自身的边
  • 完全图

    • 无向完全图

      • n(n-1)/2条边
    • 有向完全图

      • n(n-1)条边
  • 简单路径

    • 路径序列中顶点不重复
  • 无向图

    • 连通图

      • 任意两个顶点连通
    • 连通分量

      • 非连通图中的极大连通子图

        • 包含连通子图所有的边,可能成环
    • 极小连通子图

      • 边数最少的连通子图,必无环,加一条边必成环
    • 边数小于n-1必是非连通图

  • 有向图

    • 强连通图

      • 任意两顶点之间互相有路径
    • 强连通分量

      • 非强连通图中的极大强连通子图

存储结构

  • 邻接矩阵

    • 顺序存储,时间复杂度:O(V²)
  • 邻接表

    • 链式存储,时间复杂度: O(V+E)

    • 多重链表

      • 加个标志域,每个结点只存一次
  • 十字链表

图的遍历

  • 深度优先遍历 DFS

    • 先序遍历 递归
  • 广度优先遍历 BFS

    • 层次遍历 队列
  • 连通图直接遍历,非连通图多次遍历

图的应用

  • 无向图—最小生成树

    • Prim

      • 选择当前代价最小的顶点加入
      • 时间复杂度O(V²)
    • Kruskal

      • 选择全局代价最小的顶点加入
      • 时间复杂度取决于排序算法(与边有关),适用稀疏图
      • 并查集判断是否成环
  • 有向图—最短路径

    • Dijkstra

      • 单源最短路径

        • 单个顶点到其余各顶点的最短路径
      • 每一轮加入一个路径最短的结点,类似Prim

      • 时间复杂度O(V²)

    • Floyd

      • 任意一对顶点间的最短路径
      • 动态规划,判定A[i][j]>A[i][k]+A[k][j]
      • 三重循环,时间复杂度O(V³)
  • AOV网

    • 顶点表示活动,边表示先后次序的有向无环图

    • 拓扑排序

      • 找入度为0的顶点输出
      • 序列不唯一
    • 逆拓扑排序

      • 找出度为0的顶点输出
      • DFS得到逆向的拓扑有序序列(优先出度0)
  • AOE网

    • 顶点表示事件,边表示活动,边权表示时间的有向无环图

    • 对于一个工程而言,只有一个入度0的源点和一个出度0的汇点

    • 关键路径

      • 源点到汇点的最长路径,也是工程的最短完成时间

      • ve(k)事件k最早发生时间

        • Max
      • v()最晚开始时间

        • 终点的vl-持续时间
      • e(i)活动 i 最早开始时间

        • 等于该狐起点的ve
      • vl(k)事件k最晚发生时间

        • Min
    • 关键活动

      • 关键路径上的活动

7 查找

m阶B树叶子结点在同一层
B树和B+树都可用于文件的索引结构
B树不支持顺序查找
m阶B树是m叉平衡查找树
平衡二叉树最少结点 Nh=Nh-1+Nh-2+1
N0=0;
N1=1;
N2=2;
N3=4;
N4=7;
N5=12;
N6=20;

概念

  • 记录|关键字

  • 平均比较次数|平均查找长度 ASL

    • 成功
    • 失败

线性结构

  • 顺序查找

    • 无序线性表

      • 成功,(n+1)/2
      • 不成功,n+1
    • 有序线性表

      • 成功,(n+1)/2
      • 不成功,n/2+n/(n+1)
  • 折半查找

    • 适用于有序的顺序表

    • 判定树

      • n个非叶子结点,n+1个叶子结点(失败结点)

      • 查找成功平均查找长度近似

        • (1x1+2x2+3x2²+…+hx2⁽ʰ⁻¹⁾)/n = log2(n+1) - 1
  • 分块查找|索引顺序查找

    • 线性表分成若干块,块间有序,块内无序
    • 建立索引表存储块信息及关系,先折半,再顺序查找

树形结构

  • 二叉排序树 BST

    • 二叉链表,中序遍历得到非递减序列

    • 插入

      • 查找失败位置增加新节点
    • 删除

      • 叶子结点,直接删除
      • 只有左子树或右子树,删除连接
      • 找到次大于或次小于结点更换值
  • 平衡二叉树 AVL

    • 平衡因子

      • 左右子树高度之差
    • 树中所有结点平衡因子≤|1|的二叉排序树

    • 插入平衡调整

      • 每次调整离插入结点最近的不平衡子树

      • LL型|RR型

        • 右单旋|左单旋
      • LR型|RL型

        • 先左后右|先右后左
    • 删除和二叉排序树类似

  • 红黑树

    • 性质

      • n个结点的红黑树高度至多:2log2(n+1)
      • NIL叶子结点
    • 插入

      • 新插入结点为红色

      • 叔父红

        • 叔父涂黑,爷变红
    • 删除

  • B树|多路平衡查找树

    • n个分支的结点有n-1个关键字

    • m阶结点关键字个数范围为m/2 - 1 ~ m - 1

    • 插入

      • 总是在终端结点上
    • 删除

      • 兄弟够借,父子换位
      • 兄弟不够,父子合并
  • B+树

    • n个分支的结点有n个关键字
    • 非叶子结点只是索引,不含有该关键字地址信息
    • 叶子结点指针相连构成记录链表

散列结构

  • 散列

    • 根据给定的关键字来计算关键字在表中地址
  • 散列表

    • 散列函数

      • 直接定址法|数学分析法|平方取中法|除留余数法
    • 处理冲突的方法

      • 开放定址法

        • 线性探测

          • 容易堆积
        • 平方探测

          • 减少堆积
        • 再散列法|伪随机序列法

      • 拉链法

        • 不堆积
  • 效率指标

    • 散列函数

    • 装填因子

      • 关键字个数和表长的比值
    • 处理冲突的的方法

8 排序

最佳归并树计算I/O次数需×2(读写)

概念

  • 稳定性

    • 相对位置不发生改变
  • 衡量标准:时间复杂度|空间复杂度

内部排序

  • 插入排序|空间复杂度O(1)

    • 直接插入排序

      • 思想:每次挑选一个数插入到部分有序序列中
      • 最坏比较次数n(n-1) / 2,适用于基本有序序列
    • 折半插入排序

      • 折半查找寻找插入位置,O(n²)
    • 希尔排序

      • 思想:子序列插排逐步有序,最后直接插入排序

      • 步长选取

        • 希尔:n/2向下取整,O(n²)
        • 帕斯:2^k + 1 < n,O(n^1.5)
        • 最后一步一定是1,直接插入排序
  • 交换排序

    • 冒泡排序|空间复杂度O(1)

      • 思想:每趟排序确定一个最大值/最小值
      • 最坏比较次数n(n-1) / 2,移动次数3n(n-1) / 2
    • 快速排序|空间复杂度O(log2n)

      • 思想:每次确定一个关键字界限,两边向中间交换
      • 越无序效率越高,排序趟数与初始序列相关
  • 选择排序|空间复杂度O(1)

    • 简单选择排序

      • 思想:每次选择最小值/最大值加入有序序列
      • 比较次数与初始状态无关,始终是(n-1)n / 2次
    • 堆排序

      • 大根堆:L(i) ≥ L(2i) 且 L(i) ≥ L(2i+1),完全二叉树
      • ①建堆:子树筛选,向上冒泡
        ②插入:插入到最底层最右边,向上冒泡
        ③删除:最底层最右边结点赋值,向下冒泡
        ④排序:输出堆顶,最底层最右边结点赋值,向下冒泡
      • 适用于关键字较多场景
  • 归并排序|空间复杂度O(n)

    • 二路归并
    • 分治递归
  • 基数排序|空间复杂度O(rd)

    • 多关键字排序,适用关键字很多但基数较少的场景

    • 最高位优先

      • 从高到低依次有序|先排后直接插入排序
    • 最低位优先

      • 从低到高依次有序

外部排序

  • 思想:将内存作为工作空间来辅助外存数据排序

  • 归并排序

    • 最常用

    • k路归并

      • 每k个记录分为一组
    • 子算法

      • 置换-选择排序

        • 获得初始归并段
      • 最佳归并树

        • 使归并次数最少
      • 败者树

        • 从当前k个值中挑选最值
  • 置换-选择排序

    • 每次从缓冲区中选出最小的V
    • 若V<归并段最大值,跳过继续选择
    • 缓冲区所有V都小于归并段最大值,开始下一轮
    • 所有归并段长度不一定相等
  • 最佳归并树

    • 思想:归并段长度不等,构造Huffman树最小化归并次数

    • 对k路归并构造k叉Huffman树

      • (n - 1) % (k - 1) = 0,可以构成k叉树
      • (n - 1) % (k - 1) = u,说明u个多余,加k-u-1虚段
  • 败者树

    • 不引入败者树每次需比较k-1次找最值,引入之后减少到log2k次

    • 叶子结点

      • 当前参与归并的归并段段首记录

      • k路归并叶子结点个数为k

        • 结点数不是偶数则每次剩余一个放下一趟比较
    • 非叶子结点

      • 二叉树,度为2,值为叶子结点序号
    • 胜者做父节点的父节点,败者做父节点

    • 调整

      • 叶子结点更新,非叶子结点向上比较

总结

  • 不稳定算法

    • 希尔|快排|简单选择|堆
  • 每次排序确定一个关键字位置

    • 冒泡|快排|简单选择|堆
  • 关键字比较次数和原始序列无关

    • 简单选择|折半插入
  • 排序趟数和原始序列有关

    • 交换排序:冒泡|快排

XMind: ZEN - Trial Version

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值