SCAU 数据结构2020年期末复习

第1章:概念理解:数据结构,时间复杂度
概念:
数据元素是数据的基本单位
一个数据元素可由若干个数据项组成
数据项是不可分割的最小单位
数据对象是性质相同的数据元素的集合
线性结构 结构中的数据元素之间存在一个对一个的关系
树形结构 结构中的数据元素之间存在一个对多个的关系
图状结构或网状结构 结构中的数据元素之间存在多个对多个的关系
一个算法需要具备五个重要特性:有穷性 确定性 可行性 输入 输出
好的算法应该考虑到:确定性 可读性 健壮性 效率和低储存量需求

时间复杂度:略🤧

第2章:表的顺序存储结构,链式存储结构(单链表、循环链表、双向链表),表的基本操作与应用,本章所占分值在15分左右,会考表的算法。
1.表的顺序储存结构:
代码:SCAU 8576 顺序线性表的基本操作
注意这个代码是没有判断超过默认空间的情况,但oj能过。
2.存储空间分配增量:以“顺序表”为例。首先向系统内存申请一块空间(比如可放100个元素),当空间已满,此时要插入一个新元素时,一般得再申请内存空间,比原有空间增加的部分称“分配增量”。注意并不是申请放多放一个元素大小的空间(即101),因为会出现过于频繁申请的问题,浪费CPU处理时间。所以可选择一个较大的合适增量,如100+10=110,“10”就是空间分配增量(相当于每插入10个元素才会对内存重新申请)。
故:在初始化的时候L.elem=(ElemType*)malloc(LIST_INIT_SIZE* sizeof(ElemType));,就是申请了LIST_INIT_SIZEElemType数据元素,然后如果空间不够的话,则增加LISTINCREMENT个数据元素(加就加10个,一个一个会浪费CPU处理时间)
3.在定义节点的时候,需要有一个指针elem(储存空间基址)、length(当前长度)、listsize(当前分配的储存容量(以sizeof(ElemType)为单位)
最后两个是用来判断插入元素的时候,是否空间越界
4.初始化分配是L.elem = (ElemType*)malloc(LIST_INT_SIZE * ElemType)
增加分配时 L.elem = (ElemType)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType)
5.链式存储结构(单链表、循环链表、双向链表)
代码:SCAU 8579 链式线性表的基本操作
6.有时在单链表的第一个结点之前附设一个结点,称为头结点,作用是指向第一个元素结点的储存位置
7.循环列表的特点是最后一个结点的指针指向头结点;
双向链表则是有两个指针域,其一指向直接后继,另一指向直接前驱。

第3章:栈的实现,栈的应用(数制转换,括号匹配),Hanoi塔不考,队列的实现(其中循环队列重点)。本章所占分值在10分左右,可能会考算法。
1.代码:SCAU 8583 顺序栈的基本操作
2.一个栈里面有一个头指针和一个尾指针以及一个int stacksize //当前已分配的储存空间,以元素为单位 分配的时候是S.base=(ElemType*)malloc(STSCK_INT_SIZE*sizeof(ElemType))
注意建立一个空栈的时候,头指针和尾指针是指的一样的。
3.代码:SCAU 8585 栈的应用——进制转换
4.十进制数N 和其他d进制的转换 N = (N div d) + N mod d
也就是说,将N数字先取模d,放入栈中,然后再将N整除d,直到N为0,就可以进到d进制的数
5.代码:SCAU 8586 括号匹配检验 这个就比较简单 略了🤕

第4章:只考计算模式串的NEXT值,不考算法,本章所占分值在5分左右
我们能确定next数组第一二位一定分别为0,1,后面求解每一位的next值时,根据前一位进行比较。
从第三位开始,将前一位与其next值对应的内容进行比较,
如果相等,则该位的next值就是前一位的next值加上1;
如果不等,向前继续寻找next值对应的内容来与前一位进行比较,
直到找到某个位上内容的next值对应的内容与前一位相等为止,
则这个位对应的值加上1即为需求的next值;
如果找到第一位都没有找到与前一位相等的内容,那么求解的位上的next值为1。

第5章:数组的存储位置计算,压缩矩阵的存储(不考算法)本章所占分值在5分左右
对称矩阵:结合数据结构压缩存储的思想,我们可以使用一维数组存储对称矩阵。由于矩阵中沿对角线两侧的数据相等,因此数组中只需存储对角线一侧(包含对角线)的数据即可。
上(下)三角矩阵:主对角线下的数据元素全部相同的矩阵为上三角矩阵),主对角线上元素全部相同的矩阵为下三角矩阵)。
对于这类特殊的矩阵,压缩存储的方式是:上(下)三角矩阵采用对称矩阵的方式存储上(下)三角的数据(元素 0 不用存储)。
稀疏矩阵:如果矩阵中分布有大量的元素 0,即非 0 元素非常少,这类矩阵称为稀疏矩阵。
压缩存储稀疏矩阵的方法是:只存储矩阵中的非 0 元素,与前面的存储方法不同,稀疏矩阵非 0 元素的存储需同时存储该元素所在矩阵中的行标和列标。

第6章:二叉树的二叉链表存储,二叉树的遍历(重点),霍夫曼树(重点),本章肯定会考二叉树相关算法本章所占分值在20分左右
二叉树的存储有顺序存储结构和链式存储结构
遍历二叉树则分为先序排列,中序排列和后序排列
代码:SCAU 8606 二叉树的构建及遍历操作
代码:霍夫曼树
若一个二叉树是二叉排序树,则它的中序排序一定是 有序递增序列(充分必要条件)

第7章:图的四种存储结构,图的遍历,最小生成树,拓扑排序,关键路径与最短路径,本章所占分值在15分左右,可能会考算法,但算法主要考察图的遍历算法,其他算法不考。
代码:图的深度遍历
图的广度遍历
最小生成树:此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。
1.图的所有顶点集合为VV;初始令集合u={s},v=V−uu={s},v=V−u;
2.在两个集合u,vu,v能够组成的边中,选择一条代价最小的边(u0,v0)(u0,v0),加入到最小生成树中,并把v0v0并入到集合u中。
3.重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。
拓扑排序:就是把如度为0的结点一个一个输出形成一个排序。
关键路径:路径长度最长的路径叫做关键路径

第9章:顺序查找表,折半查找表,二叉排序树(重点),平衡二叉树,哈希表(重点),本章所占分值在15分左右,会考表的算法(顺序查找,折半,二叉排序树相关算法)。
二叉排序树:
1.若它的左子树不为空,则左子树的所有结点均小于它的根结点的值;
2.若右子树不为空,则右子树所有结点的值均大于它的根节点的值
3.它的左右子树分别也为二叉排序树。
代码:SCAU 8607 实现二叉排序树的各种算法(1)
哈希表:
除留余数法用的较多
H(key)=key MOD p (p<=m m为表长)
如果遇到重复的就往地址后面加1
代码:SCAU 8622 哈希查找

第10章:所有的排序方法,本章所占分值在15分左右,会考算法(所有的排序方法)。
直接插入排序:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
插入排序:在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=m+1),如此直至low<=high不成立,即将此位置之后所有元素后移一位,并将新元素插入a[high+1]。
希尔排序:其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成。
希尔排序的实质就是分组的插入排序
简单选择排序:它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
堆排序:
归并排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
时间复杂度为O(nlogn),空间复杂度为 O(n),归并排序比较占用内存,但却效率高且是稳定的算法。
基数排序:
快速排序:1、算法思想
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
2、实现原理
2.1、设置两个变量 low、high,排序开始时:low=0,high=size-1。
2.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面

默认数组的第一个数为基准数据,赋值给key,即key=array[low]。
因为默认数组的第一个数为基准,所以从后面开始向前搜索(high–),找到第一个小于key的array[high],就将 array[high] 赋给 array[low],即 array[low] = array[high]。(循环条件是 array[high] >= key;结束时 array[high] < key)
此时从前面开始向后搜索(low++),找到第一个大于key的array[low],就将 array[low] 赋给 array[high],即 array[high] = array[low]。(循环条件是 array[low] <= key;结束时 array[low] > key)
循环 2-3 步骤,直到 low=high,该位置就是基准位置。
把基准数据赋给当前位置。
2.3、第一趟找到的基准位置,作为下一趟的分界点。
2.4、递归调用(recursive)分界点前和分界点后的子数组排序,重复2.2、2.3、2.4的步骤。
2.5、最终就会得到排序好的数组。

问题描述:假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即CC或[([ ] [ ])]等为正确格式,[( ))或((()均为不正确的格式。检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列:    [ ( [ ] [ ] ) ]    1 2 3 4 5 6 7 8 当计算机接受了第1个括号以后,他期待着与其匹配的第8个括号的出现,然而等来的却是第2个括号,此时第1个括号“[”只能暂时靠边,而迫切等待与第2个括号相匹配的 第7个括号“]”的出现,类似的,因只等来了第3个括号“[”,此时,其期待的紧迫程度较第2个括号更紧迫,则第2个括号只能靠边,让位于第3个括号,显然第3个括号的期待紧迫程度高于第2个括号,而第2个括号的期待紧迫程度高于第1个括号;在接受了第4个括号之后,第3个括号的期待得到了满足,消解之后,第2个括号的期待匹配就成了最急迫的任务了,…… ,依次类推。可见这个处理过程正好和栈的特点相吻合。 要求:设置一个栈,每读入一个括号,若是左括号,则作为一个新的更急迫的期待压入栈中,若是右括号,则或者是和当前栈顶的括号相匹配,或者是不合法的情况,输出“此串括号匹配不合法”。在初始和结束时,栈应该是空的。 测试数据:输入 #([ ]())#,结果“匹配”  输入 #[( )]#,结果“此串括号匹配不合法”  #为起始和结束标志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值