数据结构期末复习

第一章:数据结构绪论

  • 时间复杂度是衡量算法好坏的一个最重要的标准
  • 数据结构是为了在解决问题时让处理过程实现空间与时间上的最优

第二章:顺序表与单链表

  • 线性表: n个数据元素的有限序列
  • 线性表顺序表示: 用一组地址连续的存储单元依次存储线性表的数据元素
    • 随机存取
    • 增删时需要移动大量元素
  • 线性表链式表示:存储单元并不连续,通过指针等手段来表示数据之间的邻接关系
    • 不可随机存取
    • 增删时只需要修改前后节点

第三章:其它链表

  • 双向链表:使用 prior 和 next 指针表示邻接关系(我平时一般用的 prev)
  • 链表的优缺点:
    • 缺点:无法进行随机存取
    • 优点:相较于顺序表,能够更快得进行增删操作

第四章:栈

  • 栈:先进后出

    • 只在 top 端进行数据进栈与出栈的操作
  • 栈的应用:

    • 表达式的计算:先将中缀转后缀,再使用后缀进行计算
    • 递归算法

如何中缀转后缀

  • 中缀转后缀的核心要点是
    • 遇到数字直接写入后缀表达式
    • 遇到左括号直接入栈(左括号的优先级 = 空栈)
    • 遇到操作符
      • 如果栈为空直接入栈
      • 该操作符的优先级大于栈顶操作符就入栈,如果小于等于就让栈顶出栈,并写入后缀表达式,直到可以入栈为止
    • 如果遇到右括号就直接让栈顶出栈,写入后缀表达式,直到遇到左括号出栈结束
    • 最后结尾依次出栈即可

举个例子,中缀表达式:2 * ( 3 + 5 ) + 7 / 1 - 4 转后缀

中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2

栈:空

(数字直接写入后缀)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2

栈:*

(栈空直接入栈)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2

栈: (*

(左括号直接入栈)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3

栈: (*

(数字直接写入后缀)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3

栈: ( +*

(左括号 = 空栈,空栈直接入栈)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5

栈: ( +*

(数字直接写入后缀)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5 +

栈:*

(操作符出栈写入后缀,直到左括号)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

**后缀:2 3 5 + ***

栈:+

(操作符优先级小于等于栈顶,出栈写入;而后栈为空,操作符入栈)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5 + * 7

栈:+

(数字直接写入后缀)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5 + * 7

栈:+ /

(操作符优先级大于栈顶,直接入栈)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5 + * 7 1

栈:+ /

(数字直接写入后缀)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5 + * 7 1 / +

栈:-

(操作符优先级小于等于栈顶,出栈写入;而后栈为空,操作符入栈)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5 + * 7 1 / + 4

栈:-

(数字直接写入后缀)


中缀:2 * ( 3 + 5 ) + 7 / 1 - 4

后缀:2 3 5 + * 7 1 / + 4 -

(结尾依次出栈即可)


后缀如何计算

后缀的计算很简单,让数字不断入栈,遇到操作符就从栈中取两个数字计算,再让计算结果重新入栈,循环往复即可


第五章:队列

  • 队列:先进先出

    • 只在队尾端进行数据进队,只在队首进行数据出队
  • 队列的种类:

    • 顺序表示:使用简单但数组容易溢出
    • 链表表示:保留 front 和 rear 两个指针
    • 循环顺序表示:
      • front == rear 时为空
      • ((rear + 1) % MAXQSIZE == front 时为满
  • 队列的应用:

    • 活用先进先出特点

第六章:串

  • 串:字符串
    • 成员类型为 char 类型的线性表
  • 串的模式匹配
    • 查找子串在主串中出现的位置
    • 穷举法: O(nm)
    • KMP 算法
      • next 矩阵记录子串的跳转信息
      • 活用以匹配的信息进行查找
      • 时间复杂度: O(n+m)

KMP 算法

例题:模式串 p = “abcabx” 的 next 函数值序列为(以第一个字母序号为 “1” 计算)___

使用方法:最简单通俗易懂求 next 数组的方法 - CSDN 博客

0 a

0 ab

0 abc

1 abca

2 abcab

0 abcabx

分别计算每一层的最大前缀;在前面加一个 0,删去最后一个数,剩下的数全部 + 1 即可。

最终求的:0 1 1 1 2 3


第七章:树的概念和遍历

重要概念:

  • 结点:包含一个数据元素及若干指向其子树的分支
  • 分支:结点之间的连接
  • 结点的度:结点拥有的子树数
  • 树的度:树中结点度的最大值称为树的度
  • 叶子结点:度为 0 的结点就是没有子树的结点
  • 分支结点:度不为 0 的结点包括根结点,也称为非终端结点。除根外称为内部结点
  • 层次:根结点为第一层,其孩子为第二层,依此类推
  • 深度:树中结点的最大层次

解释一下什么是结点的度:

比如说一个节点没有孩子,他的度为 0;有一个孩子,度为 1;有两个孩子,度为 2。

树的度,看的是整棵树所有的节点,取其中度最大的节点作为树的度。


来看看二叉树的经典问题:

一棵有 124 个叶结点的完全二叉树最多有___个结点

解析:

1、根据二叉树的性质 叶子节点数 = 度为 2 的节点 + 1,因此度为 2 的结点数为 124 -1 = 123

2、而完全二叉树中度为 1 的结点数最多 1 个。

3、因此该完全二叉最多有:124+123+1 = 248 个结点。


深度为 5 的二叉树,其结点数最多为___个

2^(n-1)-1 = 31


当二叉树采用完全二叉树进行存储时(编号从 1 开始),其双亲编号为 k,则其右孩子编号为___

2k+1


第八章:赫夫曼树编码

根据使用频率,5 个字符的赫夫曼编码不可能是(C)
A. 111,110,10,01,00
B. 000,001,010,011,1
C. 100,11,10,1,0
D. 001,000,01,11,10

解析:

画图,1 往右,0 往左


设给定权值总数有 n 个(权值总数为待编码的字符数,也就是赫夫曼树的叶子结点数),其赫夫曼树的结点总数为(A)

A. 2n-1
B. 2n
C. 2n+1
D. 不能确定

解析:

现场画一棵树推导一下


数据结构期末复习笔记-LMLPHP

解析:

通过权值画图(这里权值截图截漏了)

(2)求其加权路径长度 WPL

解析:

将所有节点的权值*深度加在一起就是 WPL

(3)写出每个字符对应的赫夫曼编码

解析:

根据赫夫曼树向左为 0,向右为 1 求出每个字符的编码


第九章:图

以下说法中正确的是(C)
A. 连通分量是无向图中的极小连通子图
B. 有向图的遍历不可采用广度优先搜索方法
C. 连通图的生成树包含了图中所有顶点
D. 对 n 个顶点的连通图 G 来说,如果其中的某个子图有 n 个顶点和 n-1 条边,则该子图一定是 G 的生成树

解析:

A:

连通分量是图中的极大连通子图

B:

肯定可以用

D:

生成树具有连通图的全部 n 个顶点和连接它们的 n-1 条边。

如果它的一个子图有 n 个结点,也有 n-1 条边,但它们没有连接所有顶点,有的地方还出现了回路,则此子图不是生成树。


设图有 n 个顶点和 e 条边:

(1)采用邻接矩阵时,遍历图的顶点所需时间为___

(2)采用邻接表时,遍历图的顶点所需时间为___

解析:

(1)O(N^2)

(2)O(N+e)


设 G 是一个非连通无向图,有 15 条边,则该图至少有___个顶点

解析:

13


数据结构期末复习笔记-LMLPHP

(1)邻接矩阵,用表格表示

解析:

二维表格,谁(x)指向谁(y),就是(x,y)

(2)强连通分量,分别写出顶点的集合、连接这些顶点的所有弧的集合

解析:

强连通分量就是:A 节点能到 B 节点,B 节点也能到 A 节点

(3)从顶点 0 出发进行深度优先遍历序列

解析:

从 0 开始遍历每一个节点,visit

(4)从顶点 2 出发进行广度优先遍历序列

解析:

将没有走过的节点都入队列,走过的节点再次遇到就跳过


第十章:查找与排序

  • 查找
    • 查找简单的比较简单,难的又很难,战略放弃这部分:
    • 静态查找、二叉搜索树、二叉平衡树、B 数、哈希查找
  • 排序
    • 各种经典排序,主要了解:
    • 希尔排序、快速排序、堆排序、归并排序、基数排序
01-09 10:26