软考中级-软件设计师(三)数据结构 考点最精简

一、线性结构
1.1线性表

线性表是最简单、最基本也是最常用的一种线性结构。常采用顺序存储和链式存储,主要的基本操作是插入、删除和查找等

线性表的定义:一个线性表是n(n>=0)个元素的有限序列,通常表示为(a1,a2,a3…,an)

线性表的存储:

·顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,从而逻辑上相邻的两个元素物理位置上也相邻

·链式存储:通过指针链接起来的节点存储数据元素,地址不要求连续

空间方面:链式存储还需要存储指针,所以有空间浪费

时间方面:当需要对元素进行破坏性操作(插入,删除)时,链表效率更高;不改变结构操作(读取,查找)时,顺序表效率更高

根据节点中指针域的设置方式,还可以有以下几种分类:双向链表、循环链表、静态链表

1.2栈和队列

队列是“先进先出”的,分队头和队尾两个指针;栈是“先进后出”的,只有栈顶能进出。

可以将队列理解成一根“水管”,尾部放入元素,头部拿出元素;将栈理解成一个“盒子”,先放入的元素被压在底下,只能后拿出

循环队列:为降低运算复杂度,元素入队时只修改队尾指针,元素出栈时只修改队头指针,即将顺序队列假想成一个环状结构,称之为循环队列

设队列Q容量为MAXSIZE,初始为空,且Q.rear和Q.front都等于0:

元素入队时,修改队尾指针Q.rear=(Q.rear+1)%MAXSIZE,

元素出队时,修改队头指针Q.front=(Q.front+1)%MAXSIZE,

当出队操作导致队列变为空时/入队操作导致队列为满时,有Q.rear==Q.front

1.3串

定义:串是仅由字符构成的有限序列,是一种线性表。字符串是一种特殊的线性表,其数据元素全部为字符。

串的存储模式:可以进行顺序存储或链式存储

串的匹配模式:

·朴素的模式匹配算法:从第一个字符起逐个匹配

·KMP算法:出现相比较不等的字符,利用已得到的“部分匹配”,结果向右滑动尽可能远的距离

二、数组、矩阵和广义表
2.1数组

定义:数组是定长线性表在维数上的扩展,相当于二维“线性表”。

数据元素数目固定,一般不做插入和删除运算,适于采用顺序结构;数据元素类型相同;数据元素的下标关系具有上下界的约束且下标有序。

a[i][j]存储地址:按行存储:a+(i*n+j)*len 按列存储:a+(j*n+i)*len(选择题直接代入特殊值算)

2.2矩阵

特殊矩阵:矩阵中的元素的分布有一定规律。常见的有对称矩阵、三角矩阵等

稀疏矩阵:在一个矩阵中非0元素个数远少于0元素个数,且非0元素分布没有规律

(只出选择题,同样直接代入计算)

2.3广义表

定义:广义表是线性表的推广,是有0个或多个单元素或子表组成的有限序列

长度:最外层元素包含的元素个数;深度:所含括号的重数(没怎么考过)

三、树
3.1树与二叉树

树是n(n>=0)个节点的有限集合,当n=0时称为空树。树的定义是递归的,它表明了树本身的固有特性,也就是一棵树由若干子树构成,而子树又由更小的子树构成

二叉树:二叉树在树的定义上增加规定:一个根节点只能含有两个或以下的孩子节点,所以,二叉树的子树可以称之为左子树(左孩子)和右子树(右孩子)

3.2二叉树的性质与存储结构

1.二叉树的第i层上最多有2^(i-1)个节点

2.高度为k的二叉树最多有2^k-1个节点

3.对于任何一棵二叉树,若最终端节点数为n0,度为2的节点数为n2,则n0=n2+1

满二叉树:在高度为h的完全二叉树中,除了第h层其余层都是满的;

完全二叉树:在第h层上的节点必须从左到右依次放置,不能留空

二叉树存储结构:顺序存储,从上到下,从左到右依次存储

对于完全二叉树:没有编号为i的节点,共有n个节点

若i=1,则为根节点,无双亲;若i>1,则双亲节点为i/2;

若2i<=n,则为左孩子编号为2i,否则无左孩子节点;

若2i+1<=n,则右孩子编号为2i+1,否则无右孩子节点。


二叉树的链式存储结构:包含多种信息,可以用三叉链表或二叉链表存储

(二叉链表:左指针指向左子树,右指针指向右子树;三叉链表:多加一个指针指向双亲节点)


3.3二叉树的遍历

先序遍历、中序遍历、后续遍历中的“前中后”指的是根节点的次序

其中,只有中序遍历的集合和前或后序的集合才能反向构造出二叉树(中序为必须)

3.4线索二叉树

定义:可以在链式存储中再增加两个指针域,使其分别指向前驱和后继节点,但浪费存储空间

若n个节点的二叉树使用二叉链表存储,则必然有n+1个空指针域,需增加两个标识,以区分指针域存放的到底是孩子节点还是遍历节点。

3.5最优二叉树(哈夫曼树)

定义:一类带权路径最短的树

路径:树中一个结点到另一个结点之间的路径;

结点的路径长度:路径上的分支数目(之间有几条线);

树的路径长度:根结点到到达每一个叶子结点之间的路径长度之和;

权:结点代表的值;

结点的带权路径长度:该结点到根节点之间的路径长度乘以该结点的权值;

树的带权路径长度:树的所有叶子结点的带权路径长度之和

题型——哈夫曼树求法:给出一组权值,将其中最小的两个权值作为叶子结点,其和作为父结点,组成二叉树,而后删除这两个叶子结点权值,并将父结点的值添加到该权值中,重复至所有权值都用完(哈夫曼树中,度为2的节点比度为0的节点数正好少1)

四、图
4.1图的定义与存储

1)定义

·无向图:图的结点之间连线没有箭头,不分方向;

·有向图:图的节点之间是箭头,区分从A到B和从B到A;

·完全图:无向完全图中,结点两两之间都有连线,n个结点的连线数为(n-1)+(n-2)+...+1=n*(n-1)/2;有向完全图中,两两之间都有互相的箭头,箭头数为n*(n-1);

·度、出度和入度:顶点的度是关联与该顶点的边的数目,入度是以该顶点为终点的有向边的数目,出度指以该顶点 为起点的有向边的数目;

·路径:存在一条通路,可以从一个顶点到达另一个顶点;

·子图:有两个图G=(V,E)和G'=(V',E'),如果V'<=V且E'<=E,称G'为G的子图;

·连通图和连通分量:针对无向图,若从顶点v到顶点u中任意两个顶点相通,则称为连通图,无向图G的极大连通子图为其连通分量;

·强连通图和强连通分量:为上一概念针对有向图的变形;

·网:边带权值的图称为网

2)图的存储:

·邻接矩阵:假设一个图有n个结点,则使用n阶矩阵来存储这个图中各个节点的关系,规则是若结点i到结点j有连线,则矩阵R i,j = 1,否则为0


·邻接链表:先用一个一维数组将图中的所有顶点存储起来,然后对比此一维数组的每个顶点元素,使用链表挂上其出度到达的节点的编号和权值

4.2图的遍历

深度优先遍历:从任一顶点出发,遍历到底,直至返回,再选取任一其他结点重复此操作直至遍历完

广度优先遍历:先访问完一个顶点的所有邻接顶点,而后再依次访问其邻接顶点的所有邻接顶点,类似于层次遍历

4.3生成树及最小生成树

生成树:对于有n个顶点的连通图,至少有n-1条边,而生成树中恰好有n-1条边,所以连通图的生成树是该图的极小连通子图,图的生成树不唯一。


最小生成树:对于连通网来说,边是带权值的,生成树的各边也带权值,因此把生成树各边的权值总和称为生成树的权,把权值最小的生成树称为最小生成树


 

4.4拓扑排序和关键路径

拓扑排序:若图中一个结点入度为0,则应最先执行此次活动,而后删除掉此结点和其关联的有向边,再找其他没有入度的结点,依次重复上面步骤


关键路径:在从源点到汇点的路径中,长度最长的路径称为关键路径。关键路径上所有活动均是关键活动

五、查找
5.1静态查找表的方法

·顺序查找:将待查找的关键字key的元素从头到尾与表中元素进行比较,如果中间存在关键字为key的元素,则返回成功,否则查找失败


·折半查找:只适用于待查找序列中的元素是有序排序的情况(与表中元素比较,再比较前半/后半部分……)


·分块查找:是对顺序查找方式的一种改进,首先将表分为若干块,每块的关键字不一定有序,但块之间是有序的,即后一块中所有记录的关键字均大于前一个块中最大的关键字。在索引表中确定待查记录所在的块,在块内顺序查找

5.2动态查找表

·二叉排序树:又称二叉查找树,或者是一棵空树,或者是具有以下性质的树:1.若左子树非空,则左子树上的所有结点小于根节点的值;2.若右子树非空,则右子树上所有结点的值均大于根结点的值;3.左右子树本身是二叉排序树。


·平衡二叉树:又称AVL树,或是一棵空树,或具有如下性质:左右子树都是平衡二叉树,且左右子树高度之差的绝对值不超过1。

5.3哈希表

哈希表定义:通过一个以记录的关键字为自变量的函数(称为哈希函数表)得到该记录的存储地址,在表中查找时,用同一哈希函数计算得待查的地址

哈希函数的构造方法:线性探测法、直接定址法……主要需解决两个问题:应是一个压缩映像函数以节省存储空间,应具有较好的散列性。

处理冲突的方法:


还有链地址法、再哈希法、建立一个公共移除区,从未考过,不做赘述

六、排序
6.1简单排序

·直接插入排序:前 i-1 个元素是有序的,第 i 个元素依次从第 i-1 个元素向前比较,直到找到第一个比 i 大/小的元素,插入;当元素无序时,可以将第一个元素看作有序。

直接插入排序是一种稳定的排序算法,其时间复杂度为O(n^2),在排序过程中只需一个元素的辅助空间,空间复杂度为O(1)

·冒泡排序:对 n 个数据进行排序,先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换这两个记录的值,然后比较第二个记录和第三个记录的关键字,以此类推,知道全部比较完,上述被称为第一趟冒泡排序,此时最大的数据已在队尾,再对前 n-1 个数据进行第二趟冒泡排序,直到整个记录有序

冒泡排序是一种稳定的排序方法,其时间复杂度为O(n^2),在排序过程中只需一个元素的辅助空间,空间复杂度为O(1)

·简单选择排序:n个记录排序,通过 n-1 在次关键字中的比较,从 n-i+1 中选择出关键字最小的记录,并和第 i 个记录进行交换,当 i 等于 n 时所有记录有序排列

简单选择排序是一种不稳定的排序方法,其时间复杂度为O(n^2),在排序过程中只需一个元素的辅助空间,空间复杂度为O(1)

6.2希尔排序

希尔排序是对直接插入排序方法的改进。先将整个待排序记录分割成若干子列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序

6.3快速排序

设定一个基准值放在中间,左小右大,之后对每一半再进行如上操作,有比基准值小的交换到左边,大的交换到右边

快速排序是不稳定的排序方法,其时间复杂度为O(n log2 n),在所有算法复杂度为此数量级的排序方法中,快速排序被认为是平均性能最好的一种。但是,若初始记录序列按关键字有序或基本有序时,即每次划分都是将序列划分为一半序列长度为0的情况,此时快速排序的性能退化为时间复杂度是O(n^2)

6.4堆排序

堆本质上是树,大顶堆是左右孩子都小于根(每个节点都需要满足)使用数组存储大顶堆;同理,若左右孩子都大于根则为小顶堆


堆排序是一种不稳定的排序方法,算法时间复杂度为O(n log n),对于记录数据较少的文件来说,堆排序的优越性并不明显,但对于大量的记录来说,堆排序是很有效的

6.5归并排序

将两个或两个以上的有序文件合并成为一个新的有序文件。归并排序的一种实现方法是把一个有n个记录的无序文件看成是由n个长度为1的有序子文件组成的文件,然后进行两两归并,得到n/2个长度为2或1的有序文件,再两两归并,如此重复

整个归并排序需进行 log2 n趟,时间复杂度为O(n log n)

6.6基数排序

基于多个关键字进行多轮排序,如个、十、百位等

基数排序是一种稳定的排序方法,不同的基数所用时间是不同的

6.7内部排序方法小结


1.若待排序的数目n较小,可采用直接插入排序和简单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当记录本身信息量较大时,用简单选择排序方法较好;

2.若待排序的记录按关键字基本有序,宜采用直接插入排序或冒泡排序;

3.当n很大且关键字的位数较少时,采用链式技术排序较好;

4.若n较大,则应采用时间复杂度为O(n log n)的排序方法,例如快速排序、堆排序或归并排序

七、典型例题


​​​​​​​

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值