数据结构期末复习

树的定义:n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:

  • 有且仅有一个特定的称为根的结点。

  • 当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。

树的术语:
在这里插入图片描述
结点的深度是从根结点开始自顶向下逐层累加的。
结点的高度是从叶结点开始自底向上逐层累加的。
(不同教材对结点的高度定义不同,有的从叶结点开始从1计数,有的从叶结点开始从0计数)

二叉树

二叉树:有限的结点的集合,由根结点和不相交的二叉子树组成在这里插入图片描述
存储结构
顺序存储:通过数组下标进行访问,适用于满二叉树和完全二叉树,一般的二叉树会造成空间浪费
链式存储:按某种搜索路径,使二叉树每个结点均被访问且仅被访问一次。二叉树的遍历按其构成以及访问结点的顺序分为四种方式,即先序遍历、中序遍历、后序遍历、层次遍历在这里插入图片描述

完全二叉树

区分满二叉树与完全二叉树

  • 满二叉树:每层结点均满,每层均具有最大结点数,又称完美二叉树
  • 完全二叉树:与满二叉树的编号对应,但不要求每层均具有最大结点数

二叉搜索树

前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉排序树

AVL树(平衡二叉树)

平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

最小生成树

一个图中可能存在多条相连的边,我们一定可以从一个图中挑出一些边生成一棵树。这仅仅是生成一棵树,还未满足最小,当图中每条边都存在权重时,这时候我们从图中生成一棵树(n - 1 条边)时,生成这棵树的总代价就是每条边的权重相加之和。

Prim算法

在这里插入图片描述

Kruskal算法在这里插入图片描述

哈夫曼树(最优二叉树)

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

简而言之,就是按照一个贪心思想和规则进行树的构造,而构造出来的这个树的权值最小!

  • 权值越大的叶子结点,越靠近根结点,权值越小的叶子结点越远离根结点。
  • 只有度为 0 (叶子结点)和度为 2 (分支节点)的结点,不存在度为 1 的结点

构建:

1.在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
2.在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
3.重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。

排序算法

1、稳定性比较

归并排序、冒泡排序、插入排序、基数排序是稳定的

选择排序、快速排序、希尔排序、堆排序是不稳定的

2、时间复杂度

最基础的四个算法:冒泡、选择、插入、快排中,快排的时间复杂度最小O(nlogn),其他都是O(n2)
在这里插入图片描述
3.排序算法的思想:

(1)冒泡排序:

是相邻元素之间的比较和交换,两重循环O(n2);
如果两个相邻元素相等,是不会交换的。
所以它是一种稳定的排序方法
最快的情形:本来就是正序

(2)选择排序:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。

每个元素都与第一个元素相比,产生交换,两重循环O(n2);
举个栗子,5 8 5 2 9,第一遍之后,2会与5交换,那么原序列中两个5的顺序就被破坏了。
所以不是稳定的排序算法

(3)插入排序:

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。
刚开始这个小序列只包含第一个元素,事件复杂度O(n2)。
所以相等元素间的顺序没有改变,是稳定的。

(4)快速排序

在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。

从数列中挑出一个元素,称为 “基准”(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

快速排序是一个不稳定的排序算法

(5)归并排序

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

设定两个指针,最初位置分别为两个已经排序序列的起始位置;

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

重复步骤 3 直到某一指针达到序列尾;

将另一序列剩下的所有元素直接复制到合并序列尾。

归并排序也是稳定的排序算法。

(6)基数排序
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。

(7)希尔排序(shell)

选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

按增量序列个数 k,对序列进行 k 趟排序;

每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1
时,整个序列作为一个表来处理,表长度即为整个序列的长度。

希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

(8)堆排序

创建一个堆 H[0……n-1];

把堆首(最大值)和堆尾互换;

把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

重复步骤 2,直到堆的尺寸为 1。

我们知道堆的结构是节点i的孩子为2i和2i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。在一个长为n的序列,堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n/2-1, n/2-2, …1这些个父节点选择元素时,就会破坏稳定性。有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没有交换,那么这2个相同的元素之间的稳定性就被破坏了。所以,堆排序不是稳定的排序算法。

完全图

在这里插入图片描述

无向完全图

在n个顶点的无向图中,若有n(n-1)/2条边,即任意两个顶点之间有且仅有一条边,则称此图为无向完全图。

有向完全图

在n个顶点的有向图中,若有n(n-1)条边,即任意两个顶点之间有且仅有方向相反的边,则称此图为有向完全图。

连通图

在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1与v2是连通的。
如果图中任意一对顶点都是连通的,则称此图是连通图。
在这里插入图片描述

强连通和弱连通的概念只在有向图中存在

强连通图

在有向图中, 若对于每一对顶点v1和v2, 都存在一条从v1到v2和从v2到v1的路径,则称此图是强连通图。
在这里插入图片描述

弱连通图

将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。
在这里插入图片描述

极大连通子图

1.连通图只有一个极大连通子图,就是它本身。(是唯一的)
2.非连通图有多个极大连通子图。(非连通图的极大连通子图叫做连通分量,每个分量都是一个连通图)
3.称为极大是因为如果此时加入任何一个不在图的点集中的点都会导致它不再连通。

连通分量

非连通图的极大连通子图叫做连通分量
在这里插入图片描述

强连通分量

在这里插入图片描述

极小连通子图

1.一个连通图的生成树是该连通图顶点集确定的极小连通子图。(同一个连通图可以有不同的生成树,所以生成树不是唯一的)
(极小连通子图只存在于连通图中)
2.用边把极小连通子图中所有节点给连起来,若有n个节点,则有n-1条边。如下图生成树有6个节点,有5条边。
3.之所以称为极小是因为此时如果删除一条边,就无法构成生成树,也就是说给极小连通子图的每个边都是不可少的。
4.如果在生成树上添加一条边,一定会构成一个环。
也就是说只要能连通图的所有顶点而又不产生回路的任何子图都是它的生成树。

生成树

一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点和n - 1条边
在这里插入图片描述

最小生成树

一个连通图的生成树可能有多个。边的权值之和最小的生成树是最小生成树
在这里插入图片描述

拓扑序列

拓扑序列是对于有向图而言的,有向图的拓扑序是其顶点的线性排序,使得对于从顶点u 到顶点v 的每个有向边u v , u 在序列中都在v 之前。

  • 每个顶点只出现一次。
  • 对于图中的任何一条边,起点必须在终点之前。
    在这里插入图片描述

散列(计算装填因子)

在这里插入图片描述

解析:5/11=0.45

在这里插入图片描述

解析:4/13=0.31

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值