![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构期末复习
文章平均质量分 81
伦比兔
这个作者很懒,什么都没留下…
展开
-
作业24-归并排序与基数排序(防止题目重复)
1-3对N个记录进行归并排序,归并趟数的数量级是O(NlogN)。()[解析]归并的数量级在O(logN)?每上下相邻的两层之间,从上层到下层的过程就是一趟归并满二叉树深度为k的二叉树的最后一层结点个数为2^k - 1所以叶子数为N的完全二叉树,它的深度为log2N归并的趟数就是O(logN) void Merge(SqList L, int low, int mid, int high, SqList &res_L){ p_left = low; p_right = mid原创 2020-12-12 19:43:54 · 5236 阅读 · 0 评论 -
作业23-快速排序与堆排序
1-1对N个记录进行堆排序,需要的额外空间为O(N)。(F)[解析]辅助空间是O(1)需要用到的辅助空间有: rc(根节点的关键值)head的左孩子lchildhead的右孩子rchild需要注意的是,随着堆调整的进行,head是不断变化的堆排序算法实现void HeapAdjust(HeapType &H, int head, int tail){ rc = H.r[head]; lChild = 2 * head; rChild = 2 * head + 1; whi原创 2020-12-11 19:14:34 · 1831 阅读 · 0 评论 -
作业22--插入类与交换类排序(防止标题重复)
1-1对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。(F)[解析]当序列本身就是从大到小排列的时候, 冒泡排序不需要进行交换void bubble_sort(int *a, int size){ int i, j, t; //最坏情况复杂度分析:外部循环n-1次, 比较的次数是 (n-1)n/2 //交换的次数是 3*((n-1)n/2) //时间复杂度是 两者的加和, 因为 整个排序 进行了 (n-1)n/2次比较 //和3((n-1)n/2)原创 2020-12-11 17:20:20 · 1332 阅读 · 0 评论 -
作业16-图的遍历与最小生成树(防止标题重复)
作业16-图的遍历与最小生成树2-1给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:©A.22B.20C.15D.8[解析]求最小生成树,根据prim算法,先加入任意一个顶点到集合U,然后每次从 与结合U 相连的边中 找权值最小的边以及 这条边的端点,将端点加入到集合U中,直到将所有顶点都加入到U中2-3给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:(A)A.24B.23C.18D.172-4给定有权无向图如下。关于其最小生成树,下列哪句是对的?(A)A.最原创 2020-12-10 17:15:14 · 797 阅读 · 0 评论 -
作业14-Huffman树及其应用(防止标题重复)
1-1对N(≥2)个权值均不相同的字符构造哈夫曼树,则树中任一非叶结点的权值一定不小于下一层任一结点的权值。(T)[解析]我会想到 {1,1,3,5}这个序列 , 第一次构造的结点的权值确实小于{3,5}但是之后是 2和3 构造结点,之后是 5和5 构造结点,所以还是符合条件的2-1对N(N≥2)个权值均不相同的字符构造哈夫曼树。下列关于该哈夫曼树的叙述中,错误的是:(D)A.树中一定没有度为1的结点B.树中两个权值最小的结点一定是兄弟结点C.树中任一非叶结点的权值一定不小于下一层任一结原创 2020-12-10 11:46:38 · 5586 阅读 · 0 评论 -
作业10-数组和广义表(防止标题重复)
2-1设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为(B)A.13B.33C.18D.40[解析]loc(i, j) = loc(1, 1) + (i-1)(i)/2sizeof(ElemType) + j - 1loc(8, 5) = 1 + 28 + 5 - 1 = 332-2设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序原创 2020-12-12 23:24:27 · 976 阅读 · 0 评论 -
huffma树及其应用-笔记(.)
huffma树及其应用1 编码性质与最优二叉树1.1 前缀码:某个前缀码不会在另一个前缀码中出现,否则会造成歧义.1.2 编码长度:如果可以,我把带权路径长度理解成:结点的权值为结点被访问的次数,那么结点的带权路径长度就是访问这个节点总共走了多长的路: 权值(次数) * 每次的长度二叉树的带权路径长度 = ∑(叶子结点的权值 与 该节点的路径长度的乘积)1.3 最优编码即带权路径长度的最小值2 huffman树2.1 huffman树的构造原理核心策略是让权值大的节点路径短,权值小的结原创 2020-12-10 11:09:54 · 98 阅读 · 0 评论 -
dijkstra算法求最短路(防止标题重复)
1 Dijkstra算法思想首先找距离源点最近的点此点必然是与源点直接相连的点借助邻接矩阵S对应的行,找最小值即得距离源点最近的点接下来找距离源点第二近的点或者是从S出发先到Y再到达的点,或者是与源点直接相连的点否则与Y最近相矛盾对于每个点,两类路比较距离取最小此时得到从S出发经可选跳点集{y}到各点的最短路表中最小值即得距离S第二近的点Z2 Dijkstra算法实现越看越像 Prim算法finish[v0] = TRUE;D[v0] = 0;for (v = 0; v &原创 2020-12-09 17:03:38 · 148 阅读 · 0 评论 -
Floyd算法实现(.)
最短路径算法Floyd算法实现const int INF = 65535;void GetShortestPath_Floyd(MGraph G, PathMatrix &P, DistancMatrix &D){ for (int i = 1; i <= G.vexnum; i++) { for (int j = 1; j <= G.vexnum; j++) { D[i][j] = G.arcs[i][j]; if (D[i][j] != IN原创 2020-12-09 16:45:41 · 90 阅读 · 0 评论 -
最小生成树Prim实现(.)
最小生成树1 最小生成树的概念生成树: 极小连通子图(边数最少,且删除任意一条边不再连通)最下生成树:生成树的权值之和是最小的2 Prim算法2.1 原理算法思想:任意一个顶点开始放入集合U,每次选测一个与U中顶点最近的一个顶点,比你高将两个顶点之间的边极爱入到树中重复,直到所有顶点都加入到生成树顶点集合U中为止2.2 算法实现://记录U中点到个点最近边的信息(边的信息包括顶点和边的权值)struct { VertexType adjvex; VRTtype lowcost;}原创 2020-12-09 16:44:34 · 111 阅读 · 0 评论 -
拓扑序和关键路径-笔记(.)
拓扑排序概念AOV网:顶点表示活动,弧表示活动先后关系的 有向图结点表示事件,是时刻;所以一个节点包含了: 前一个活动的结束事件和下一个活动的开始事件而弧表示过程,代表活动的持续时间有某个集合上的一个偏序(<=关系)的到该集合上一个全序,该操作称为拓扑排序拓扑排序-方法(计算各顶点的入度, 将度为零的顶点入栈)1 从图中没有前驱的顶点中选择一个并输出(出栈,更新后继结点的入度,若入度为0,入栈)2 从图中 删除此顶点 及所有从其出发的弧3 重复上述两步,至图空 或图不空但原创 2020-12-09 16:27:44 · 180 阅读 · 0 评论 -
归并排序(MergeSort)(防止标题重复)
归并排序(MergeSort)1 归并排序原理分解成最小的记录块(长度为0或1),必须要排序,就是有序块然后再归并2 归并排序算法的实现//归并的实现//有序子序列R[low...mid]与R[mid + 1...high]归并到S[low...high]void Merge(Rcd R[], int low, int mid, int high, Rcd &S[]){ P_left = low; P_right = mid + 1; P_result = low; whil原创 2020-12-09 09:18:27 · 120 阅读 · 0 评论 -
堆排序-笔记(防止标题重复)
选择类排序简单选择排序:每一趟选出当前最小的记录, 将其交换到无序块的最前面.如此,无序块逐渐变小,N-1 趟完成(贪心,递归,动态规划)引入:每一趟选择极值记录时,能否对序列做些特殊处理,方便后续各趟求极值的操作呢?1 堆排序的原理1.1 一个序列,设它对应某完全二叉树的层序序列,若该二叉树任意节点局比起左右孩子结点大则称该序列为大顶堆1.2 堆排序原理:原始序列 -> 初始大顶堆 -> 由于根节点是无序块的最大值,堆顶和堆尾互换-> 调整建堆,筛选 ->原创 2020-12-09 08:57:58 · 182 阅读 · 0 评论 -
快速排序-笔记(防止题目重复)
快速排序冒泡排序每次循环,相邻两元素两两比较,不符合则交换,最大元素沉底//随便写的,好像不对void BmbleSort(SqList &L){ for (int k = 1; k <= L.length - 1; k++) { for (int i = 1; i < L.length - k; i++) { if (L.r[i].key > L.r[i + 1].key) swap(L.r[i], L.r[i + 1]); } }}原创 2020-12-08 23:52:46 · 99 阅读 · 0 评论 -
希尔排序-笔记(防止题目重复)
希尔排序子序列内部移动依次可能会消除多个逆序对(同时造成排序的不稳定)1 算法思想设一个递减的增量序列 如{5, 3, 1}每一趟都将序列分成若干子序列,各子序列分别进行直接插入排序每一趟增量为1,对全部记录进行直接插入排序2 算法实现void ShellSort(SqList &L, int dlta[], int length){ //选择增量 for (k = 0; k < length; k++) ShellInsert(L, dlta[k]);}void原创 2020-12-08 23:12:15 · 111 阅读 · 0 评论 -
排序引入,插入类排序笔记
排序排序: 若干元素 根据其对应的关键字的值的大小, 从小到大或从大到小的顺序对记录序列重新排列.排序的稳定性:若 keyi = keyj排序后 这两个记录是否保持原次序不变存储结构的设计#define MAXSIZE 20typedef int KeyType;typedef struct { KeyType key; InfoType otherinfo;}RcdType; //记录的类型(recordtype)//顺序存储,经常排序操作, 很少增删操作typedef st原创 2020-12-08 22:43:38 · 112 阅读 · 0 评论 -
二叉搜索树的相关笔记
二叉搜索树1 二叉搜索树的概念1.1 二叉搜索树(二叉排序树 二叉查找树)根节点值大于其左子树中的所有节点的值根节点值小于其右子树中的所有节点的值左右子树都是二叉搜索树1.2 二叉搜索树的存储结构typedef * KeyType;typedef struct { //用来比较结点的大小 KeyType key;}ElemType;//这是二叉树的结点定义typedef struct BiTNode{ ElemType data; struct BiTNode *lTree原创 2020-12-08 16:44:33 · 97 阅读 · 0 评论 -
作业8-栈与递归(防止题目重复)
2-1令P代表入栈,O代表出栈。若利用堆栈将中缀表达式3*2+8/4转为后缀表达式,则相应的堆栈操作序列是:©A.PPPOOOB.POPOPOC.POPPOOD.PPOOPO[解析]没看懂题目什么意思(ps: 我好想又看懂了, 栈用来存放暂时没有进行运算的 运算符,另外还有一个存放输出内容的队列, 输出的内容就是后缀表达式)栈:# *§ (O) + § /§ (O) (O)输出队列:3 2 * 8 4 / +所以答案是POPPOO2-2若借助堆栈将中缀表达式a+bc+(de+f)原创 2020-12-06 19:35:52 · 4809 阅读 · 0 评论 -
栈的相关笔记
栈和队列3.1 栈的抽象数据类型定义与实现3.2 栈的应用举例3.3 栈的应用–栈与递归3.4 队列的抽象数据类型定义和实现3.5 队列的应用–离散事件模拟3.1 栈的抽象数据类型定义与实现栈的相关概念概念:栈是定义在线性结构上的抽象数据类型,其操作类似线性表操作但元素的插入,删除和访问都必须在表的一端进行,为形象期间,称允许操作端为栈顶(Top),另一端为栈底(base)注意Top指向的不是最后一个元素的位置,而是指向待插入位置特性:Last In First Out 后进先原创 2020-12-06 14:29:34 · 117 阅读 · 0 评论 -
作业7-栈及其应用(防止题目重复)
1-1通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S),Push(S,3), Pop(S), Pop(S)。输出的序列为:123。(F)[解析]输出序列为2311-2若一个栈的输入序列为1,2,3,…,N,输出序列的第一个元素是i,则第j个输出元素是j−i−1。()[解析]查到的一个看法是不确定,但是这是判断题…https://blog.csdn.net/qq_46088286/article/details/1066330241-3若一个栈的输入序列为{1,原创 2020-12-06 14:27:46 · 3642 阅读 · 0 评论 -
作业13-树与森林
1-1对于一个有N个结点、K条边的森林,不能确定它共有几棵树。(F)[解析]设边的数目 EdgeNum, 树的数目为 TreeNum根据 NodeNum - 1 = EdgeNum所以 (NodeNum1 - 1) + … + (NodeNumi - 1) = K即 N - TreeNum = K2-2若森林F有15条边、25个结点,则F包含树的个数是:©A.8B.9C.10D.11[解析]运用1-1得到的公式可求出树的个数TreeNum = N - K = 25 - 15 = 1原创 2020-12-04 10:23:28 · 4447 阅读 · 1 评论 -
树和森林(森林的部分已经看不懂了)
树和二叉树树的概念:结构特点:有且仅有一个根节点无前驱,有一个或多个叶节点无后继其余结点有唯一前驱和若干后继递归描述:空是树,不空时,树由唯一根节点和若干子树组成,每个子树满足树的定义int NodeCount(Tree T){ if (T == NULL) return 0; else { return 1 + NodeCount(T->lTree) + NodeCount(T->rTree); }}树的相关术语空树:根节点:叶子结点:结点的子树树的原创 2020-12-03 23:16:21 · 323 阅读 · 0 评论 -
作业12-二叉树的遍历
1-1某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无右孩子。(T)[解析]后序:L,R,root 中序:L,root,R 要想两个序列一样一定无R1-2某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。(F)1-4若A和B都是一棵二叉树的叶子结点,则存在这样的二叉树,其前序遍历序列为…A…B…,而中序遍历序列为…B…A…。()[解析]前序遍历A在B前面,假设 A和B在同一个双亲结点x下面那么在中序遍历的时候,在访问到这个双亲结点的时候,原创 2020-12-02 20:32:28 · 12020 阅读 · 6 评论 -
作业11-树与二叉树概念与基本操作
1-3存在一棵总共有2016个结点的二叉树,其中有16个结点只有一个孩子。(F)[解析]既然16个结点只有一个孩子,那么剩下的2000个要么没有孩子要么有两个孩子,又因为二叉树满足n0 = n2 + 1, 且 n0 + n2 = 2000联立求得呢n2不是个整数,所以不存在2-1如果一棵非空k(k>=2)叉树T中每个非叶子结点都有k个孩子,则称T为正则k叉树。若T的高度为h(单结点的树h=1),则T的结点数最多为:()A.(k^h−1)/(k−1)B.(k^(h−1)−1原创 2020-12-01 16:30:24 · 1728 阅读 · 4 评论 -
作业6-改进的单链表及其应用
作业6-改进的单链表及其应用2-1对于一非空的循环单链表,h和p分别指向链表的头、尾结点,则有:(A)A.p->next == hB.p->next == nullC.p == nullD.p == h2-2在双向循环链表结点p之后插入s的语句是:(D)A.p->next=s; s->prior=p; p->next->prior=s ; s->next=p->next;B.p->next->prior=s; p->ne原创 2020-11-30 17:11:23 · 1162 阅读 · 0 评论 -
作业5-单链表
1-1在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。(F)1-2若用链表来表示一个线性表,则表中元素的地址一定是连续的。(F)1-3将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。(F)[解析]只考虑合并操作的话 是O(1),就是把一个链表的尾指针指向下一个链表的首元素.1-4(neuDS)单链表不是一种随机存取的存储结构。(T)2-1设h为不带头结点的单向链表。在h的头上插入一个新结点t的语句是:(D)A.h=t;原创 2020-11-29 19:35:06 · 3809 阅读 · 0 评论 -
顺序表II
6-1 线性表元素的区间删除 (20分)//特殊的情况之一就是一个都不用删除List Delete( List L, ElementType minD, ElementType maxD ){ int k = 0; for (int j = 0; j <= L->Last; j++) { if (L->Data[j] <= minD || L->Data[j] >= maxD) { L->Data[k] = L->Data[j];原创 2020-11-29 17:09:56 · 85 阅读 · 0 评论 -
线性表抽象数据类型定义与顺序表操作
作业3-线性表抽象数据类型定义与顺序表操作1-1对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。(T)[解析]增加结点,不同位置复杂度不同,但平均复杂度在O(N)1-2若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用顺序表存储最节省时间。(T)[解析]顺序表的一个很大的缺点就是增删结点需要移动,但是此题只在表的末尾插入和删除,不需要移动,访问任意指定序号的元素用顺序表更方便1-3对于顺序存储的长度为N的线原创 2020-11-28 20:54:01 · 1426 阅读 · 1 评论 -
算法的时间复杂度和空间复杂度(防止题目重复)
1-1算法分析的两个主要方面是时间复杂度和空间复杂度的分析。(T)1-2N2logN和NlogN2具有相同的增长速度(F)[解析]一个N^2logN 一个2NlogN,肯定第一个快1-32N和NN具有相同的增长速度。(F)[解析]求导1-6在任何情况下,时间复杂度为O(n^2) 的算法比时间复杂度为O(n*logn)的算法所花费的时间都长。(F)[解析]数据规模小的时候n^2要快1-7对于某些算法,随着问题规模的扩大,所花的时间不一定单调增加。(T)原创 2020-11-28 20:23:33 · 1305 阅读 · 0 评论 -
线性表不完整总结
线性表定义: 相同 数据类型的数据元素的 有限 序列空表位序表头元素 表尾元素前驱后继线性表的基本操作InitList(&L): 初始化线性表, 构造空表,分配内存空间DestroyList(&L): 销毁线性表,释放内存空间ListInsert(&L, i, e): 插入操作,在第i个位置上插入指定元素ListDelete(&L, i, &e): 删除第i个位置的元素,并用e返回删除元素的值LocateElem(&原创 2020-11-28 17:32:30 · 231 阅读 · 0 评论 -
作业1-数据结构的基本概念及顺序表基本操作
1-1若用链表来表示一个线性表,则表中元素的地址一定是连续的。(F)1-2数据的逻辑结构是指数据的各数据项之间的逻辑关系。(F)[解析]逻辑结构就是数据元素之间的逻辑关系而不是数据元素内部的数据项之间的关系1-3抽象数据类型中基本操作的定义与具体实现有关。(F)[解析]抽象数据类型的定义不涉及到存储结构以及具体实现2-1数据的()包括集合、线性结构、树形结构和图形结构四种基本类型。(B)A.存储结构B.逻辑结构C.基本运算D.算法描述[解析]存储结构指在内存中的存储方式,包括连原创 2020-11-28 19:32:09 · 590 阅读 · 0 评论