全国软考中级软件设计师 学习笔记-数据结构部分

想要电子版本的同学可以留言或者私信我获取,辛苦整理资料,欢迎点赞、收藏和评论

 

数据结构

1. 数组

数组地址的计算

 

例题:

 

答案:根据公式a+(i*n+j)*len,即存储地址=0+(2*5+3)*2 = 13*2 = 26 是数组的第14个元素,有13个偏移量

2. 稀疏矩阵

 

稀疏矩阵:矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵(sparse matrix),该比值称为这个矩阵的稠密度;与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对角矩阵),则称该矩阵为特殊矩阵。

例题:

 

答案:A

3. 线性表

3.1 顺序表与链表

 

3.2 链表的基本操作

 

对于单链表删除操作:p->next =q->next

对于单链表插入操作:s->next =p->next

p->next=s 

注意:1)需要先将插入节点指针指向a2,不然一修改a1指针a2就会丢失

      2)链表增加头节点是保证对各节点操作可以一致

3.3 顺序存储与链式存储对比

 

3.4 队列与栈

队列(Queue):是限定只能在表的一端进行插入和另一端删除操作的线性表

栈(Stack):是限定之能在表的一端进行插入和删除操作的线性表

循环队列

 

例题:

 

答案:D

 

3.5 广义表

 

例题:

有广义表LS1=(a,,(b,c), (d,e)),则其长度为?深度为?

答案:  长度为3,深度为2

例题:有广义表LS1=(a,,(b,c), (d,e)),要将其中的b字母取出,操作为?

答案:head(head(tail(LS1)))

 

4. 树与二叉树

4.1 基本概念

 

注意:树的度是指结点的度的最大值

 

4.2 二叉树

 

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。

完全二叉树:是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

 

4.3二叉树的重要特性

 

4.4 二叉树的遍历

四种遍历方式:前序、中序、后序和层次遍历。

注意:前序、中序、后序指根结点被遍历的时间

 

例题:

 

前序遍历:1 2 4 5 7 8 3 6

中序遍历:4 2 7 8 5 1 3 6

后序遍历:4 8 7 5 2 6 3 1

层次遍历:1 2 3 4 5 6 7 8

 

4.5 反向构造二叉树

根据前序和中序或者中序和后序来构造一棵二叉树

注意根据前序和后序无法构造二叉树

例题:

由前序序列为ABHFDECG;中序序列为HBEDFAGC构造二叉树

答案:先确定好根结点为A,则根据中序序列可知HBEDF为左子树,GC为右子树。同理,可进一步推理剩下的结点。

 

 

 

4.6 树转二叉树

孩子结点– 左子树结点

兄弟结点– 右子树结点

 

注意:也可以使用连线法,然后再做树旋转

 

4.7 查找二叉树(二叉排序树)

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的结点。

 

插入和删除操作:

 

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

树的路径长度:从树根到树中每一结点的路径长度之和。

结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。

结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。

树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。

例题:

 

答案:5*5 + 3*5 + 7*4 + 14*3 + 29*2 + 8*3 + 11*3 + 23*2  = 25 + 15 + 28 + 42 + 58 + 24 + 33 + 46 = 40 + 70 + 82 + 79 = 110 + 161 = 271

注意:根据哈夫曼树的定义,一棵二叉树要使其WPL值越小,必须使权值越大的叶结点靠近根结点,二权值越小的叶结点越远离根结点。

 

4.9 线索二叉树

为了解决无法直接找到该结点在某种遍历序列中的前驱和后继结点的问题,在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。

 

注意:对于某种遍历方式,左孩子为遍历次序中的前一个结点,右孩子为遍历次序中的后一个结点

 

4.10 平衡二叉树

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

 

 

 

5. 图

5.1 基本概念

在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图。

在有向图中,若每对顶点之间都有两条有向边相互连接,则称该图为完全图。

 

5.2 图的存储

5.2.1 邻接矩阵

 

5.2.2 邻接表

 

5.3 图的遍历

 

5.4 拓扑排序

5.5. 图的最小生成树

5.5.1普里姆算法

此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。

 

5.5.2 克鲁斯卡尔算法

此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

 

6. 算法复杂度

6.1 时间复杂度

6.2 空间复杂度

7. 查找

7.1 顺序查找

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

时间复杂度O (n)

7.2 二分查找

例题:

请给出在含有12个元素的有序表{1, 4, 10, 16, 17, 18, 23, 29, 33, 40 ,50, 51}中二分查找关键字17的过程

时间复杂度O(log2n)

7.3 散列表

例题

8.排序

8.1基本概念

稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。如果是不稳定排序,则需要第二次排序,会增加系统开销。

 

8.2 直接插入排序

时间复杂度:O(n^2) 属于稳定排序

8.3 希尔排序

希尔排序是直接插入排序的高级版本,由于当数据量大时,直接插入排序效率低

时间复杂度:O(n^(1.3—2)) 属于不稳定排序

8.4 简单选择排序

时间复杂度:O(n^2) 属于不稳定排序

8.5 堆排序

时间复杂度:O (nlogn) 属于不稳定排序

 

二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:

1)父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值

2)每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)

父结点大于任何子节点的称为大顶堆,相反,父结点小于任何子节点的称为小顶堆。堆排序对于大数据量中,只需要排出前n个时比较有用。

堆排序方法:

主要分为两步:

1)初始化构建堆时间复杂度:O(n)

2)调整堆

8.6 冒泡排序

时间复杂度:O(n^2) 属于稳定排序

8.7 快速排序

快速排序是对冒泡排序算法的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

时间复杂度:O (nlogn) 最坏时间复杂度:O(n^2)属于不稳定排序

8.8 归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。排序的思想就是将元素无限拆分,直到无可拆分为止,再将拆分的元素两两按序合并。

时间复杂度:O (nlogn)  属于稳定排序

 

8.9 基数排序

时间复杂度:O (d(n+k)),其中n表示待排序列的规模,d表示待排序列的最大位数,k表示每一位数的范围属于稳定排序

注意:基数排序是从低位到高位,如果从高位到低位是错误的

8.10 排序算法小结

 

想要电子版本的同学可以留言或者私信我获取,辛苦整理资料,欢迎点赞、收藏和评论

 

 
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值