三、上午题 #3 数据结构
1. 大O表示法
1)加法规则:多项相加,保留最高阶项,并将系数化为1
2)乘法规则:多项相乘都保留,并将系数化为1
3)混合规则:小括号>乘法规则>加法规则
例如:
T(n) = 5n^3 + 6n^2 + 7n + log2n + 20 的时间复杂度是O( n^3)
渐进符号
(1)O记号:渐进上界 O > n^3
(2)Ω记号:渐进下界 Ω < n^3
(3)Θ记号:渐进紧致界 O = n^3 Ω = n^3
例题
2. 递归式时间、空间复杂度
1.展开式 在每次地柜的事件复杂度不变的情况下:
递归式的时间复杂度 = 递归的次数 × 每次递归的时间复杂度
2.主方法,也称为主定理(***天书,看不懂o(╥﹏╥)o***)
3. 真题
1、
解析:题干说的是重复次数,T(n)是作为循环次数的条件
2、
解析:
3、
3 线性结构
线性结构是一种基本的数据结构,主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。
线性结构的特点是数据元素之间呈现一种线性关系,即元素“一个接一个排列”。
1. 线性表
一个线性表是n(n>0)个元素的有限序列,通常表示为(a1,a2,......,an),非空线性表 的特点如下:
(1)存在唯一的一个称作“第一个”的元素
(2)存在唯一一个称作“最后一个”的元素
(3)除第一个元素外,序列中的每个元素均只有一个直接前驱
(4)除最后一个元素外,序列中的每个元素均只有一个后驱
2. 线性表的存储结构
线性表的存储结构分为顺序存储和链式存储
1)线性表的顺序存储
指用一组地址连续的存储单元一次存储线性表中的数据元素
特点:逻辑上相邻的两个元素物理地址也相邻,元素间的逻辑关系无须占用额外的空间
①顺序表的优缺点
优点:可以随机存取表中的元素
缺点:插入和删除操作时可能要移动元素
在表长为n的线性顺序表中插入新元素,移动元素个数的期望为
在表长为n的线性顺序表中删除元素,移动元素个数的期望为
②顺序表插入删除的时间复杂度
最好的情况:尾部插入 O(1)
最坏的情况:头部插入 O(n)
平均: O(n)
③顺序表查找及时间复杂度:O(1)
2)线性表的链式存储
线性表的链式存储是用通过指针链接起来的节点来存储数据元素,其结构包括数据域和 指针域。
特点:数据域用于存储元素的值,指针域存储当前元素的直接前驱或直接后继的位置信息
存储各数据元素的节点的地址不需要是连续的,节点空间只有在需要时才申请。
①链式表的优缺点
优点:插入快
缺点:查询慢
②单链表插入删除的时间复杂度
最好的情况:头部插入 O(1)
最坏的情况:尾部插入 O(n)
平均: O(n)
③单链表查找及时间复杂度
最好的情况:O(1)
最坏的情况:O(n)
平均: O(n)
3)循环单链表
尾节点指针域指向头结点
4)双链表
每个节点有两个指针,分别指向直接前驱和直接后继
4. 栈
1. 定义:栈是只能通过访问它的一端来实现数据存储和检索的线性数据结构。
栈又称为后进先出的线性表,不含元素的栈称为空栈
在栈中进行插入和删除的一端称为栈顶(TOP),另一端称为栈底(Bottom)
特点:先进后出,后进先出
入栈(Push(S,x)):将元素x加入栈顶,并更新栈顶指针
出栈(Pop(S)):将栈顶元素从栈中删除,并更新栈顶指针。
递归需要用到栈
2. 共享栈:两个栈共享一片存储空间,这片空间不单独属于任何一个栈,某个栈需要带的多 一 点,它就可能得到更多的存储空间。
特点:栈底在两端,栈顶在中间
栈空:top1 = -1 top2 = maxsize
栈满:top1 = top2
5. 队列
(1)定义:队列是一种先进先出的线性表,只允许在表的一端插入元素(队首Front),在 表的另一端删除元素(队尾Rear)
队首Front 指向的是队首元素的前一个位置
队尾Rear 指向的是队尾的最后一个元素
(2)队列的存储结构
1)顺序存储:也叫顺序队列,是用一组地址连续的存储单元存放元素,插入删除在两 端进行,因此设置队首指针和队尾指针,分别指出队首和队尾
2)循环队列:首尾相接的数组结构
3)队列的基本运算
①初始化队列initQueue(Q):创建一个空的队列Q
②判队空 isEmpty(Q):当队列为空时返回true
③入队 EnQueue(Q,x):将元素x插入到队列Q的队尾,并更新队尾指针
④出队 DelQueue(Q):将队首元素从队列Q删除,并更新队首指针
⑤读队首元素 FrontQue(Q):返回队头元素的值,但不更新队首指针
4)队列的链式存储
5)双端队列
(4)难题
1、
2、
3、
6. 串
(1)定义:串是仅由字符构成的有限序列,是一种特殊的线性表,一般记为
S = 'a1a2a3......an'
(2)空串:长度为零的串
(3)空格串:由一个或多个空格组成的串
(4)子串:由串种任意长度的连续字符构成的序列称为子串
(5)串的模式匹配的时间复杂度
主串 n 模式串 m
最好:O(m) 最坏:O((n-m+1)×m) 平均:O(n+m)
(6)串的前缀:包含第一个字符并且不包含最后一个字符的子串
串的后缀:包含最后一个字符并且不包含第一个字符的子串
第 i 个字符的next值 = 从1 ~ i - 1串种最长相等前后缀的长度 + 1
特殊情况:next[i] = 0
7. 数组
(1)一维数组(略)
(2)二维数组
1) 二维数组的存储位置
二维数组 a[n] [m], 首地址为Loc,单元存储大小为L
按行优先存储时,元素a[i] [j]的存储位置为
下标从0开始: Loc + (i×m + j)×L
下标从1开始: Loc + ((i-1)×m + (j-1))×L
按列优先存储时,元素a[i] [j]的存储位置为
下标从0开始: Loc + (j×n + i)×L
下标从1开始: Loc + ((j-1)×m + (i-1))×L
(3)稀疏矩阵的三员组表的顺序存储结构称为三元组顺序表,常用的三元组表的链式存储 结构是十字链表
(4)解题技巧:直接把前几个元素下标代入答案里面算
8.树
(1)树结构是一种非线性结构(一个元素可以有两个以上的直接后继元素)
定义:树是n(n>=0)个节点的有限集合,当n=0时称为空树。在任一非空树种,有且仅 有一个称为根的节点;其余节点可分为m(m>=0)个互不相交的有限子集 T1T2,.......Tn,其中,每个Ti又都是一个树。
树的定义是递归的,它表明了树本身的固有特性,也就是一棵树由若干颗子树构成,而 子树又由更小的子树构成。
(2)树的基本概念
①根节点、父节点、子节点、兄弟节点,
②节点的度:该节点的子节点个数
树的度:节点度的最大值
③叶子结点:也称为终端节点,指度为0的节点
④分支节点:也称内部节点,指度不为0的节点
⑤节点的层次:根为第一层,根的孩子为第二层,依此类推
⑥树的高度:一棵树的最大层数记为树的高度
(3)树的性质
①树种的节点总数等于树中所有节点的度数之和+1(+根节点)
②度为m的树中第i层上最多有m^(i -1)个节点(i>=1)
③高度为h的m次树最多有(m^h - 1)/m-1个节点
④具有n个节点,度为m 的树的最小高度为[logm(n(m-1)+1)]
(4)二叉树
1)定义
二叉树是n(n>=0)个节点的有限集合,它或者是空树,或者是由一个根节点及两棵不想 交的且分别成我左右子树的二叉树所组成。二叉树同样有递归性质
特点:二叉树节点的度最大为2,即使节点只有一个子树也要指出是左还是右子树。
2)性质
①二叉树的第i层上最多有2^(i-1)个节点
②高度为h的二叉树最多有2^h - 1
③对于任何一颗二叉树,度为0的节点数等于度为2的节点数+1
④具有n个节点的完全二叉树的高度为(log2 n )+1或log2 (n+1)
3)满二叉树
若深度为k的二叉树有2^k -1个节点,则称其为满二叉树
4)完全二叉树
深度为k,有n个节点的二叉树,当且仅当其每一个节点斗鱼深度为k的满二叉树编 号从1至n一一对应时,称其为完全二叉树。
在一个高度为h的完全二叉树中,除了最后一层,都是满节点,在第h层必须从左 到右依次放置叶子结点,否则是非完全二叉树
假设有编号为 i 的节点,总节点个数为n的完全二叉树则有:
①若i=1,则该节点为根节点,无双亲,若i>1,则该节点的双亲节点为i/2向下取整
②若2i < n,则该节点的左孩子节点编号为2i,否则无左孩子节点
③若2i +1< n,则该节点的右孩子节点编号为2i+1,否则无右孩子节点
5)二叉树的顺序存储I结构
完全二叉树采用顺序存储结构既简单又节省空间,对于一般二叉树,则不宜采用顺 序存储结构,可能会存一些虚浪费空间
最坏的情况下,一个深度为k且只有k个节点的二叉树(单支树)需要2^k-1个存储单 元。
6)二叉树的链式存储结构
由于二叉树的节点包含数据元素、左子树的根、右子树的根及双亲等信息,新词可 以用三叉链表或二叉链表来存储二叉树,链表的头指针指向二叉树的根节点
7)二叉树的遍历算法
①先序遍历:根左右
②中序遍历:左根右
③后序遍历:左右根
④层次遍历:从上往下,从左往右
8)平衡二叉树
二叉树中的任意一个节点的左右子树高度之差的绝对值不超过1
9)二叉排序树(二叉查找树、二叉检索树)
根节点的关键字
①大于左子树所有节点的关键字
②小于右子树所有节点的关键字
③左右子树也是一个二叉排序树
④中序遍历得到的序列是有序序列
10)最优二叉树(又称为哈夫曼树)
最优二叉树又称为哈夫曼树。它是一类带权路径长度最短的树。路径是从树中一 个节点到另一个节点之间的通路,路径上的分支数目称为路径长度。
树的带权路径长度为树中所有子节点的带权路径长度之和,记为
11)最优二叉树的构造
构造规则:
①从前往后找两个最小的权值
②小左大右
③加入末尾
④权值相同,取前面两个
特点:
①只有度为0、2的节点
②总节点个数2n+1
12)哈夫曼编码(霍夫曼编码)
若对每个字符编制相同长度的二进制码,则称为等长编码。
例如
a:0 b:101 c:100 d:111 e:1101 f:1100
13)线索二叉树 干扰选项 不要选
(5)真题易错
1、
2、
9. 图
(1)图的定义
图G是由集合V和E构成的二元组,记作G=(V,E),其中,V是图中顶点的非空有限 集合,E是图中边的有限集合。图中的任一顶点都有可能与其他顶点有关系。
(2)有向图
若图中每条边都是有方向的,那么顶点之间的关系用<vi,vj>表示,它说明从vi到vj有一 条 有向边(也称为弧)。vi是有向边的起点,称为弧尾;vj称为有向边的终点,称为弧 头。
(3)无向图
若图中的每条边都是无方向的,那么顶点之间的关系用(vi,vj)表示。因此,有向图中的 <vi,vj>和<vj,vi>分别表示两条边,而在无向图中的(vi,vj)和(vj,vi)表示同一条边
(4)完全图
若一个无向图具有n个顶点,而每一个顶点与其他n-1个顶点之间都有边,则称之为无向 完全图。显然含有n个顶点的五香完全图共有n(n-1)/2条边。类似地,有n个顶点的有向 完全图中的弧的数目为n(n-1),即任意两个顶点之间都有方向相反的两条弧存在。
(5)顶点的度
度:无向图里指关联于顶点边的数量,有向图指定点的出度和入度之和
出度:以该顶点为起点的有向边的数目
入度:以该顶点为终点的有向边的数目
无论是有向图还是无向图,定点数n、边数e与各顶点的度D(vi)之间有以下关系
(6)路径
第一个顶点和最后一个顶点相同的路径称为回路或环。
若一条路径上除了vp和vq可以相同外,其余顶点均不相同,则称其为简单路径。
(7)连通图
在无向图G中,若从顶点vi到顶点vj有路径,则成顶点vi和vj是连通的。如果无向图G中 任意两个顶点都是连通的,则称其为连通图。无向图G的极大联通子图称为连通分量。
顶点数为n,最少有n-1条边,最多有n(n-1)/2条边
(8)强连通图
在有向图G中,若果对弈每一对顶点vi,vj ∈ V且vi≠vj,从顶点vi到顶点vj和从vj到vi都存 在路径,则称图G为强连通图。有向图中的极大连通子图称为有向图的强连通分量。
顶点数为n,最少有n条边,最多有n(n-1)条边
(9)图的存储结构
图的基本存储结构有邻接矩阵表示法和邻接链表表示法两种。
1)邻接矩阵表示法
图的邻接矩阵表示法是指用一个矩阵来表示图中顶点之间的关系。对于具有n个顶点的 图G=(V,E),其邻接矩阵是一个n阶方阵,且满足:
由邻接矩阵的定义可知,无向图的邻接矩阵是对称的,有向图的邻接矩阵则不一定对 称。
2)邻接链表表示法
邻接链表表示法指的是为图的每个顶点建立一个单链表。
3)稠密图与稀疏图
稠密图:边多的图,用邻接矩阵存,例如完全图
稀疏图:边少的图,用邻接链表存
(10)网
边或弧带权值的图称为网
(11)图的遍历
指从某个顶点出发,沿着某条路径对图中的所有顶点进行访问且只访问一次的过程
1)深度优先遍历(Depth First Search, DFS)
深度优先遍历图的过程实质上是对某个顶点查找其临界点的过程,其耗时取决于所采用 的存储结构。
采用的是递归的思想。
2)深度优先遍历的时间复杂度
由n个顶点,e条边的图
邻接矩阵:O(n^2) 邻接表:O(n+e)
3)广度优先搜索(Breadth First Search,BFS)
用队列实现的,会先访问每个顶点的所有邻接点
时间复杂度与深度优先遍历是一样的
(12)拓扑排序
10. 查找
静态查找表有:顺序查找,拆半(二分)查找,分块查找
动态查找表有:二叉排序表,平衡二叉树,B_树,哈希表
(1)拆半查找(二分查找)
要求表顺序存储,关键字有序排列
最多比较的次数:log2 n向下取整 +1
平均查找长度 log2 (n+1) -1
(2)真题
1、
2、
3、
(3)哈希表
1)哈希函数的构造方法
直接定址法、数字分析法、平方取中法、折叠法、随机算法和除留取余法
2)处理冲突的方法
开放定址法
Hi = (H(key)+di)%m i = 1,2,3......,k(k<m-1)
①d = 1,2,3......,m-1,称为线性探测法
②d = 1^2,-1^2,2^2,-2^2......±k^2,称为二次探测法
③d = 伪随机序列,称为随机探测法
其中,最简单的是线性探测,也就是发生冲突时,顺序地到存储区的下一个单元 进行探测
链地址法
(4)真题
1、
(5)小顶堆和大顶堆
n个关键码构成的序列{k1,k2,......,kn},当且仅当满足下列关系时称为堆
小顶堆:ki <= k2i && ki <= k(2i+1)
大顶堆:ki >= k2i && ki >= k(2i+1)
真题1
11.排序
(1)直接插入排序
能归位
真题1
(2)简单选择排序
能归位
(3)堆排序
能归位
大根堆排完 序之后是一个递增的序列
小根堆排完序之后是一个递减的序列
(4)冒泡排序
能归位
(5)快速排序
能归位、分治的思想,递归的算法
真题1
(6)归并排序
不能归位,分治法,递归
真题1
真题2
12. 杂题
1、
2、
3、
4、
5、
6、
7、