中级软件设计师 备考笔记(持续更新)

版权声明:转载请在博客上说明! https://blog.csdn.net/weidong_y/article/details/89414895

此文章已经同步更新到个人博客上,喜欢有侧边栏目录的同学,可以点击下面的链接跳转到个人博客上读阅噢。建议到个人博客读阅,CSDN这边更新比较慢,个人博客上,每天都有更新。需要教学视频和真题的,也可以点击下面的个人博客地址,在文末有免费的百度云链接分享。
个人博客地址:http://zwd596257180.gitee.io/blog/2019/04/20/soft_exam/


中级软件设计师 备考笔记(持续更新)

Markdown

数据结构与算法基础

线性表

基本数据结构

Markdown

顺序表

在内存中是顺序存储的。内存划分出来的区域是连续的区块。

Markdown

链表

在内存中是离散存储的。

  • head:头结点
  • 结点:包括数据域和指针域(next 域)

Markdown

链表的分类

单链表

头结点 head 指向第一个结点的数据域,第一个结点的指针域指向下一个结点的数据域…

注意:单链表的最后一个结点的指针域为空(null)!!!

Markdown

循环链表

注意:循环表的最后一个结点的指针域不为空,而是指向了头结点!!!

Markdown

双链表

Markdown

链表的操作

单链表的结点删除

需求:删除 a2 结点

具体操作:将要删除的结点(a2)的前一个结点(a1)的 next 域指向 a2 的后一个的结点(a3)的数据域,然后释放(free)掉 a2 即可。

Markdown

单链表的结点插入

需求:在 a1 结点后面插入一个新的结点 x

具体操作:将 a1 的 next 域指向 x 的数据域,将 x 的 next 域指向 a2 的数据域即可。

Markdown

顺序表与链表的比较

性能类别 具体项目 顺序存储 链式存储
空间性能 存储密度 =1,更优 < 1
容量分配 事先确定 动态改变,更优
时间性能 查找运算 O(n/2) O(n/2)
读运算 O(1) O([n+1]/2),最好情况为1,最坏情况为n
插入运算 O(n/2)最好情况为0,最为情况为 n O(1),更优
删除运算 O([n-1]/2) O(1),更优

  • 思想:先进后出

队列

线性队列

  • 思想:先进先出

循环队列

head:头指针(队头)

tail:尾指针(队尾)

  • 当队列中没有存入值的时候,head 指针和 tail 指针指向同一个元素,并且该元素的值是空的!!!
  • 当循环队列开始存入值时,head 指针是不动的,tail 指针是后移一个位置。
注意:
循环队列中为了能够区别队空和队满,牺牲了队列的最后一个空间。
判空条件:head = tail
判满条件:head = tail+1

Markdown

树和二叉树

树的一些基本概念

(结合下面的图进行解释)

  1. 结点的度:结点1与下一层的3个结点相关联,所以结点1的度为3。
  2. 树的度:所有结点度当中,度数最高的一个,所以如图树的度为3。
  3. 叶子结点:度为 0 的结点。
  4. 分支结点:除了叶子节点外,其它都属于分支结点。
  5. 内部结点:除了根节点和叶子结点外,其它都属于内部结点。
  6. 父结点
  7. 子结点
  8. 兄弟结点
  9. 层次:如图所示。

Markdown

树的遍历

前序遍历

访问顺序:先访问根节点再访问子结点。

如上图的前序遍历为:1,2,5,6,7,3,4,8,9,10

后序遍历

访问顺序:先访问子结点再访问跟结点

如上图的后序遍历为:5,6,7,2,3,9,10,8,4,1

层次遍历

访问顺序:从上往下,一层一层访问

如上图的层次遍历为:1,2,3,4,5,6,7,8,9,10

二叉树

注意:二叉树并不是一种特殊的树,而是一种独立的数据结构,有明确的左结点和右结点。

Markdown

二叉树的重要特性:

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

  2. 深度为 k 的二叉树最多有 2^k - 1 个结点(k>=1)

  3. 对任何一颗二叉树,如果其叶子结点数为 n0,度为 2 的结点数为 n2,则 n0=n2+1

  4. 下图中的运算符号为向下取整。

    Markdown

二叉树的遍历

前序遍历

  • 先访问根结点,接着访问左结点,最后访问右结点。

中序遍历

  • 先访问左结点,接着访问根结点,最后访问右结点。

后序遍历

  • 先访问左结点,结合访问右结点,最后访问根结点。

树与二叉树的转换

  1. 加线:在兄弟之间加一连线
  2. 抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系
  3. 旋转:以树的根结点为轴心,将整树顺时针转45°

Markdown

注意:转换后,树和二叉树的前序遍历一样。

二叉排序树

左子树的值小于根结点的值,右子树的值大于根结点的值。

在常用的描述二叉排序树的存储结构中,关键字值最大的结点的右指针一定为空

最优二叉树(哈弗曼树)

  • 需要了解的基本概念

树的路径长度:从根结点到某结点的边数

权:人为赋值

带权路径长度:权值乘于边数

树的带权路径长度:所有的叶子结点的带权路径长度相加


例子:由权值为9,2,5,7的4个叶子结点构造一棵哈弗曼树,该树的带全路径长度为(44)。

解析:

构造哈夫曼树的方法是依次从提供的权值中(9,2,5,7)选取两个权值最小(2,5)的最为左右结点,组合成一个新的根节点(2+5=7)也要参与到第二次权值选择中。也就是说,第二次要从(9,7,7)中选取两个最小的权值。

最后生成的树如下图:

Markdown

例子:若一颗哈夫曼树共有9个顶点,则其叶子节点的个数为(5)。

n0 = n2 +1

9 = n0 + n2


平衡二叉树

基本概念

它或者是一颗空数,或者是一颗这样的树:树中任一结点的左、右子树的深度相差不超过1(即平衡查找树的每个结点的平衡度只能为 -1,0,1 三个值之一)。

平衡树的建立

Markdown

平衡树调整

LL 型平衡旋转(单向右旋平衡处理)

  • 第一种情况:

Markdown

  • 第二种情况

Markdown

RR 型平衡旋转(单向左旋平衡处理)

Markdown

LR 型平衡旋转(双向旋转,先左后右)

Markdown

RL 型平衡旋转(双向旋转,先右后左)

Markdown

图的构成

  • 一个图是由两个集合:V和E组成,V是有限的非空顶点集合,E是用顶点对表示的边集合,图G的顶点集和边集分别记为V(G)和E(G),而将图G表示为G=(V,E),也就是说,决定一个图需要知道它的顶点集合与边的集合。

无向图与有向图

  • 区别于边是否有箭头。

假设A,B为图中的两个顶点。

无向图的边表示方法:(A,B)

有向图的边表示方法:<A→B>、<B→A>

顶点的度(degree)

  • 关联顶点的边数

  • 有向图:入度和出度

子图

  • 已知图A和图B,如果图B中所有的顶点都是图A中的顶点,图B中的所有边都是图A中的边,则图B是图A的子图。允许两种极端情况:什么都不删;删去所有点和所有线

真子图:同“子图”概念一样,但不允许什么都不删。

完全图

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

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

路径和回路

  • 假设图中的两个顶点A和B,A到B之间经过的边数称为路径。从顶点A出现,最后又回到顶点A,所走过的边组成的称为回路。

连通图和连通分量

无向图:任何两个顶点都有路径到达的图,称为连通图。

有向图:每两个顶点之间都能够有边(此处的边为有向边)到达的图,称为连通图。

连通分量:把连通图给分割出来,每一部分都是该图的连通分量。

邻接矩阵

Markdown

图的遍历

Markdown

Markdown

图的最小生成树

普里姆算法(Prim 算法)

先选取树的第一个顶点(如图点0),再判断所选点到其它点的权值,如果的所选点无法直接到达的点,权值暂时标记为无穷大,然后选取与点0的权值最小的点作为树的第二个顶点。然后再以第二个顶点为基点,判断与其它点的权值大小,循环以上得到第二个顶点的操作,直到生成了树。

Markdown

Markdown

克鲁斯卡算法

  • 算法思想:依次选取权值最小的边,只要不行成回路即可。

Markdown

拓扑排序

AOV 网络

我们把用有向边表示活动之间开始的先后关系。

这种有向图称为用顶点表示活动网络,简称AOV网络。

Markdown

拓扑顺序

入度为0先进行。

上图的拓扑序列有:02143567,01243657,02143657,01243567

关键路径

AOE 网络

在AOV网络中,如果边上的权表示完成该活动所需的时间,则称这样的AOV为AOE网络。

Markdown

关键路径的几个重要概念

关键路径,就是从源点到终点,路径长度最长的路径。

Markdown

猜你喜欢

转载自blog.csdn.net/weidong_y/article/details/89414895