> 文章列表 > 【软考笔记】6. 数据结构与算法

【软考笔记】6. 数据结构与算法

【软考笔记】6. 数据结构与算法

数组与矩阵

线性表(必考)

栈

队列

广义表

了解基本概念和操作即可

广义表:表里的元素可以是表(子表)也可以是数据元素(原子)

LS1 = (a, (b, c), (d, e))

广义表的 长度:最外一层的表有几个元素(3)
广义表的 深度:有几层(2)

表头:第一个数据
表尾:除第一个数据之外的其他数据组成的表(不是只最后一个)

head(LS1) = a
tail(LS1) = ((b, c), (d, e))

例题

如何将 b 取出?

head(head(tail(LS1)))

树与二叉树(必考)

  1. 结点的度
  2. 树的度
  3. 叶子结点
  4. 分支结点
  5. 内部结点
  6. 父结点
  7. 子结点
  8. 兄弟结点
  9. 层次

树的度只看它有多少个儿子,不算父亲给它的那个支
兄弟节点只有亲兄弟算

满二叉树/完全二叉树

前序/中序/后序遍历

反向构造二叉树

给前序和中序遍历序列,构造二叉树

树转二叉树

第一个孩子结点变成左子树结点,其他孩子连成一串,变成左孩子的右孩子一支

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLvIwq3C-1680608743756)(/assets/image_fq9bd5m68.png)]

二叉树转树

连续撇向右的几个都转化成兄弟

查找二叉树

删除结点的方式:

  1. 找左子树上最大的那个点,进行交换
  2. 交换后
    1. 变叶子结点,直接删掉
    2. 变只有一个左叶子孩子的结点了
      1. 让左叶子孩子直接连上父亲
      2. 删掉

哈夫曼树(最优二叉树)

目标:构造最短的带权路径长度的树,用于哈夫曼编码

概念:

  1. 树的路径长度:树的根到结点的深度
  2. 权:叶子 结点上的数字
  3. 带权路径长度:权*路径长度
    1. 所以根结点、内部结点带权路径长度是 0(不算他们的带权路径)
  4. 树的带权路径长度:(权*路径长度)之和

构造哈夫曼树的方法

每次选取最小的两个结点结合起来形成一个新的结点(所有方形结点都是新创造出来的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4E82FG1r-1680608743757)(/assets/image_6wmwdvxyq.png)]

线索二叉树

将空闲的左/右指针指向上一个/下一个要遍历的结点,方便遍历

分类:

  1. 前序线索二叉树
  2. 中序线索二叉树
  3. 后序线索二叉树

平衡二叉树

定义(平衡度)

  • 左右子树深度相差<=1
  • 平衡度 为-1 0 1
    • 平衡度:左子树深度-右子树深度

图

了解基本概念和操作即可

无向图
有向图
完全图:任意两点有线连接,若是有向图,要连两个方向

邻接矩阵
邻接表

深度优先遍历
广度优先遍历

拓扑排序
AOV 网络:用顶点表示活动,有向边代表活动先后关系

图的最小生成树算法

普里姆算法

每次连接联通块相连的最短的边(要是联通块与外部点)

克鲁斯卡尔算法

先把所有的边都断掉,每次选取最小的边加上,加上形成环路的不连,直到选出 N-1 条

排序与查找(必考)

查找

顺序查找

O(n)

二分查找

O(log2n)O(log_2n)O(log2​n)

散列表查找

散列表冲突的解决方式

  1. 线性探测法
  2. 伪随机数法:随机放
  3. 再散列:冲突后用不同的散列函数再散列一次

排序分类

稳定排序 vs 不稳定排序
内排序 vs 外排序

插入类排序

直接插入排序 O(n²)

希尔排序 O(n^1.3) ~ O(n²)

本质上是分组插入排序

  1. d = n/2,向上取奇数
  2. mod d 为同一个值的下标的数作为一组
  3. 对每组进行插入排序
  4. d = d/2,取奇数
  5. …
  6. 直到 d == 1

交换类排序

冒泡排序 O(n²)

快速排序 O(nlogn) ~ O(n²)

分治法

  1. 任取一个记录
  2. 将比它小的记录移到它左边,比它大的记录移到它右边
  3. 递归左边,右边

选择类排序

简单选择排序 O(n²)

堆排序 O(nlogn)

利用小顶堆/大顶堆排序

小顶堆:每个结点都比两个孩子小
大。。。。。。。。。。。。。大

建堆

以大顶堆建立为例

  1. 按照完全二叉树的形式将各个值放在结点上
  2. 从 最后一个 非叶结点开始检查(最后一个指层次遍历的最后一个)
    1. 若 一个 子结点比它大,直接交换
    2. 若 两个 子结点都比它大
      1. 把最大的那个作为父结点
      2. 如果造成了下面的次序混乱,要向下继续调整

进行堆排序

以大顶堆为例

  1. 每次取走堆顶元素
  2. 将层次遍历的最后一个元素放到堆顶的位置
  3. 从上到下调整堆

归并排序 O(nlogn)(了解思路即可)

每次都把两个已经排好序的合并起来排序

基数排序 O(d(r+n))(了解思路即可)

  1. 按照个位相同的顺序依次放入桶中
11 242 93 24 135 19192       345

=>
11 242 192 93 24 135 345 19

  1. 按照十位相同的顺序依次放入桶中
11  24 135 242 192
19 245     345  93

这样,每桶 十位 相同的数,可以保证 个位 的顺序是对的
=>
11 19 24 135 242 345 192 93

  1. 按照百位相同的顺序依次放入桶中
11 135 242 345
19 192
24
93

这样,每桶 百位 相同的数,可以保证 十位和个位 的顺序是对的
=>
11 19 24 93 135 192 242 345
排序完成

算法基础常见算法(必考)