【软考笔记】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-T9X5xFQh-1680763022261)(/assets/image_fq9bd5m68.png)]

二叉树转树

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

扫描二维码关注公众号,回复: 14719186 查看本文章

查找二叉树

删除结点的方式:

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

哈夫曼树(最优二叉树)

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

概念:

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

构造哈夫曼树的方法

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

线索二叉树

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

分类:

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

平衡二叉树

定义(平衡度)

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

了解基本概念和操作即可

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

邻接矩阵
邻接表

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

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

图的最小生成树算法

普里姆算法

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

克鲁斯卡尔算法

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

排序与查找(必考)

查找

顺序查找

O(n)

二分查找

O ( l o g 2 n ) O(log_2n) O(log2n)

散列表查找

散列表冲突的解决方式

  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. 直到 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(n) 的额外空间

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

  1. 按照个位相同的顺序依次放入桶中
11 242 93 24 135 19
   192       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
排序完成

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

猜你喜欢

转载自blog.csdn.net/weixin_43544179/article/details/129960658