软件设计师---数据结构

笔记有错误欢迎直接在评论区进行纠正!我将不再维护软件设计师笔记!

数据结构上午题9分

复杂度

大O表示法

时间复杂度

软件设计师---数据结构_第1张图片

这里只是举了六个例子,然后对应的时间复杂度比较抽象,自己去看

讲解地址:时间复杂度_哔哩哔哩_bilibili

空间复杂度

软件设计师---数据结构_第2张图片

讲解地址:空间复杂度_哔哩哔哩_bilibili

软件设计师---数据结构_第3张图片

空间复杂度为O(n)

软件设计师---数据结构_第4张图片

空间复杂度为O(n2

真题

真题1

软件设计师---数据结构_第5张图片

真题2

软件设计师---数据结构_第6张图片

软件设计师---数据结构_第7张图片

这个题目看起来挺难的,其实也就那样,根据它提供 的算法思路把代码写一下,就可以看出来时间复杂度是2O(n)去掉系数就是O(n),然后空间复杂度可以看见定义了三个变量n1-n3,所以就是O(1)

讲解地址:2011年下半年第64题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第8张图片

讲解地址:2012年上半年第65题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第9张图片

讲解地址:2020年下半年第65题_哔哩哔哩_bilibili

*渐进符号

软件设计师---数据结构_第10张图片

这里我是完全懵逼

回炉重造地址:渐进符号_哔哩哔哩_bilibili

真题

软件设计师---数据结构_第11张图片

懵逼+1

讲解地址:2012年上半年第62题_哔哩哔哩_bilibili

递归

软件设计师---数据结构_第12张图片

这个由于没有定义任何东西,只是一个判断和遍历,所以空间复杂度是O(1),时间复杂是遍历次数×每次递归的时间复杂度,也就是n×O(1)=O(n)

软件设计师---数据结构_第13张图片

这里是定义了个i=1,相当于每次递归都会重新的定义一个i=1,所以空间复杂度是O(n)

软件设计师---数据结构_第14张图片

这个时间复杂度是O(log2n),空间复杂度是O(n)

这个时间复杂度是O(n2),空间复杂度是O(n)

回炉重造地址:递归式时间、空间复杂度_哔哩哔哩_bilibili

递归式主方法

软件设计师---数据结构_第15张图片

这里我一开始是完全懵逼的,博主讲的我也听不懂,但是做了后面几道真题后好像会了一些,记录一下我的理解

首先看到上面这样的形式的并且要求时间复杂的那就是告诉你,孩子,要用公式了,因为他们都长的像下面这个公式

软件设计师---数据结构_第16张图片

这个公式有两种,也就是要根据具体题目才能知道用哪种公式?例如

这个公式就是用第二个公式,首先要把对应的a和b还有f(n)写出来,例如上面这个题a=2,b=2,f(n)=nlgn,这里有个小技巧来判断用哪个公式?根据f(n)里面有没有lg来判断?如果有那就是第二个,没有那就用第一个公式

这里f(n)=nlgn很明显有lg所以用第二个,然后a和b的值代公式就行了,直接得到nlgn=nlgkn,很明显k=1

在代到T(n)=nlg2n,也就是时间复杂度为nlg2n

这里在代公式的时候是只看括号里的内容

回炉重造地址:递归式主方法_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第17张图片

真题2

软件设计师---数据结构_第18张图片

讲解地址:2010年下半年第62题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第19张图片

讲解地址:2011年上半年第64题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第20张图片

这里要注意算法越快,时间复杂度越小

讲解地址:2011年下半年第65题_哔哩哔哩_bilibili

真题5

软件设计师---数据结构_第21张图片

讲解地址:2014年上半年第62、63题_哔哩哔哩_bilibili

真题6

软件设计师---数据结构_第22张图片

线性表

线性表的定义

软件设计师---数据结构_第23张图片

线性表的存储结构

顺序存储

软件设计师---数据结构_第24张图片

也就相当于一个数组,所以可以直接通过下边快速查询到表中的元素,所以效率高,但是插入和删除会批量移动,所以效率低,简称查询高效率,插删低效率

插入元素的代码和时间复杂度

软件设计师---数据结构_第25张图片

最好的情况就是直接在顺序表后面插入一个元素,时间复杂度为O(1)

最坏的情况是在插入一个元素到原来第一个元素的位置,时间复杂度为O(n)

平均复杂度为O(n)

讲解地址:顺序表插入时间复杂度_哔哩哔哩_bilibili

删除元素的代码和时间复杂度

软件设计师---数据结构_第26张图片

最好的情况就是直接在删除最后一个元素,时间复杂度为O(1)

最坏的情况是删除第一个元素,时间复杂度为O(n)

平均复杂度为O(n)

讲解地址:顺序表删除时间复杂度_哔哩哔哩_bilibili

查找元素的代码和时间复杂度

软件设计师---数据结构_第27张图片

时间复杂度为O(1),因为这是直接根据数组下边就可以快速查询到对应的元素

链式存储

软件设计师---数据结构_第28张图片

插入元素的代码和时间复杂度

软件设计师---数据结构_第29张图片

这里插入分为两种,一种是带头结点的,还有一种是不带头结点的

带头结点的的时间复杂度

最好的情况就是k=1的时候,也就是插入在头结点后面一个结点的位置时,时间复杂度为O(1)

最坏的情况是k=n+1的时候,也就是插入在最后面,时间复杂度为O(n)

平均复杂度为O(n)

不带头结点的的时间复杂度

最好的情况就是k=1的时候,也就是插入在第一个结点后面一个结点的位置时,时间复杂度为O(1)

最坏的情况是k=n+1的时候,也就是插入在最后面,时间复杂度为O(n)

平均复杂度为O(n)

其实可以看出时间复杂度取决于指针遍历,因为在插入之前是要通过指针从头结点或者第一个结点一个个往后去找到对应的位置,相当于遍历,最好的情况就是遍历一次就找到了,也就是那个位置在头结点后面一个,最坏的就是指针遍历到最后一个才找到对应的位置,那就相当于把整个链表都遍历了一遍

删除元素的代码和时间复杂度

软件设计师---数据结构_第30张图片

最好的情况就是k=1的时候,也就是删除在头结点后面一个结点时,时间复杂度为O(1)

最坏的情况是k=n+1的时候,也就是删除最后面一个结点时,时间复杂度为O(n)

平均复杂度为O(n)

带不带头结点它们删除和插入的时间复杂度都是一样的

查找元素的代码和时间复杂度

软件设计师---数据结构_第31张图片

最好的情况就是k=1的时候,也就是查找在头结点后面一个结点时,时间复杂度为O(1)

最坏的情况是k=n+1的时候,也就是查找最后面一个结点时,时间复杂度为O(n)

平均复杂度为O(n)

循环单链表

讲解地址:循环单链表_哔哩哔哩_bilibili

双链表

软件设计师---数据结构_第32张图片

讲解地址:双链表_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第33张图片

一般没有问最好或者最坏的时间复杂度那就是默认为平均复杂度

讲解地址:2009年下半年第60题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第34张图片

讲解地址:2010年上半年第65题_哔哩哔哩_bilibili

删除是要找到删除结点的前面一个结点的位置,循环单链表删除是要找到前面一个结点的位置,也就是要遍历链表,但是插入到尾结点后面就不用遍历直接插入就行

真题3

软件设计师---数据结构_第35张图片

讲解地址:2011年下半年第58题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第36张图片

讲解地址:2013年下半年第57题_哔哩哔哩_bilibili

真题5

软件设计师---数据结构_第37张图片

真题6

软件设计师---数据结构_第38张图片

讲解地址:2014年下半年第57题_哔哩哔哩_bilibili

真题7

软件设计师---数据结构_第39张图片

讲解地址:2016年下半年第58、59题_哔哩哔哩_bilibili

真题8

软件设计师---数据结构_第40张图片

讲解地址:2020年下半年第58题_哔哩哔哩_bilibili

栈的定义

软件设计师---数据结构_第41张图片

软件设计师---数据结构_第42张图片

真题

真题1

软件设计师---数据结构_第43张图片

递归(嵌套调用)用栈是经典

软件设计师---数据结构_第44张图片

真题2

软件设计师---数据结构_第45张图片

真题3

软件设计师---数据结构_第46张图片

像遇到这样的题目不要慌,直接取特殊情况带进去算,好比这里我就直接设n=3,那么1<=k<=1.5,那k就是1,然后再去判断

讲解地址:2014年下半年第58题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第47张图片

真题5

软件设计师---数据结构_第48张图片

真题6

软件设计师---数据结构_第49张图片

真题7

软件设计师---数据结构_第50张图片

讲解地址:2021年下半年第57题_哔哩哔哩_bilibili

队列

软件设计师---数据结构_第51张图片

软件设计师---数据结构_第52张图片

真题

真题1

软件设计师---数据结构_第53张图片

讲解地址:2010年下半年第57题_哔哩哔哩_bilibili

软件设计师---数据结构_第54张图片

讲解地址:2015年上半年第57题_哔哩哔哩_bilibili

软件设计师---数据结构_第55张图片

讲解地址:2013年下半年第58题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第56张图片

讲解地址:2013年上半年第53题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第57张图片

真题4

软件设计师---数据结构_第58张图片

讲解地址:2018年上半年第57题_哔哩哔哩_bilibili

真题5

队列和栈组合

总结来说,就一句话,入队顺序一定等于出队顺序

真题

真题1

软件设计师---数据结构_第59张图片

两个栈是可以模拟一个队列的,但是两个队列是无法模拟一个栈的操作的,因为队列进出的顺序是一样的,而栈进出顺序是倒置的

讲解地址:2009年上半年第60题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第60张图片

讲解地址:2009年下半年第61题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第61张图片

真题4

软件设计师---数据结构_第62张图片

像这样的组合题,牢牢记住队列的入队和出队顺序永远都是一致的,但是栈的出队和出队顺序就不一定了,它可以相同也可以不同,同时如果是先入栈后入队列,那么队列的出队顺序就是出栈顺序,例如上面这题。

真题5

软件设计师---数据结构_第63张图片

真题6

软件设计师---数据结构_第64张图片

软件设计师---数据结构_第65张图片

真题

真题1

软件设计师---数据结构_第66张图片

真题2

软件设计师---数据结构_第67张图片

自己随便举个例子然后套

讲解地址:2017年下半年第57题_哔哩哔哩_bilibili

串的模式匹配和朴素匹配

软件设计师---数据结构_第68张图片

这里了解一下,然后知道时间复杂度和比较次数就可以了

讲解地址:串的模式匹配与朴素模式匹配_哔哩哔哩_bilibili

手算next数组的值(KMP)

软件设计师---数据结构_第69张图片

这里知道数组怎么求就行,下面真题2会做就没有问题了

回炉重造地址:手算next数组值_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第70张图片

讲解地址:2012年下半年第57题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第71张图片

讲解地址:2011年下半年第57题_哔哩哔哩_bilibili

软件设计师---数据结构_第72张图片

讲解地址:2012年上半年第58题_哔哩哔哩_bilibili

软件设计师---数据结构_第73张图片

讲解地址:2014年下半年第60题_哔哩哔哩_bilibili

这种题我是会做,但是我说不清,勉强说说做题技巧

首先next数组前面两个是01,这是固定的,然后我是直接求最后一个字母的next值

例如上面的abaac最后一个字母是c,在c前面的模式串是abaa,然后求这个模式串的next值

长度为1时,abaa的最前面一个字母和最后面一个字母都是a,说明相等,那么next值为长度+1也就是1+1=2

长度为2时,abaa的最前面两个字母组合是ab,最后面的两个字母是aa,不相等,那么next的值为1

长度为3时,abaa的最前面的三个字母的组合是aba,最后面的三个字母的组合是baa,不相等,那么next值为1

长度为4时串的前缀和后缀都是同一个串,不合法,不用计算,所以取next值最大的作为最后一个字母的next值,也就是2,所以选B

总之,就是从长度1开始到(模式串-1)一个个的去求,只要前缀和后缀相同,那next值就是对应长度+1,不同那就是1

一维数组和二维数组

软件设计师---数据结构_第74张图片

这里会地址计算就行

回炉重造地址:二维数组_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第75张图片

真题2

软件设计师---数据结构_第76张图片

讲解地址:2012年上半年第21题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第77张图片

矩阵

对称矩阵

软件设计师---数据结构_第78张图片

软件设计师---数据结构_第79张图片

对称矩阵有上三角和下三角的区别,对称矩阵一般是用一个一维数组来存储的,并且存在的一般都是下三角的值,根据Ai,j=Aj,i 进行转换,上面的公式就是用来求Ai,j是在一维数组的哪个位置,例如下面的A2,0是在一维数组n的4号位置,也就是n【4】,特别注意上面公式所指的下标是二维数组的下标,也就是A0,0,所以下标是从0开始的,用第一个公式

软件设计师---数据结构_第80张图片

回炉重造地址:对称矩阵_哔哩哔哩_bilibili

三对角矩阵

软件设计师---数据结构_第81张图片

软件设计师---数据结构_第82张图片

特别注意上面公式所指的下标是二维数组的下标,也就是A0,0,所以下标是从0开始的

回炉重造地址:三对角矩阵_哔哩哔哩_bilibili

稀疏矩阵

软件设计师---数据结构_第83张图片

回炉重造地址:稀疏矩阵_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第84张图片

真题2

软件设计师---数据结构_第85张图片

真题3

软件设计师---数据结构_第86张图片

真题4

软件设计师---数据结构_第87张图片

真题5

软件设计师---数据结构_第88张图片

真题6

软件设计师---数据结构_第89张图片

这个题有点坑,注意它是求i<=j的情况,它给个下三角来误导,实际求的是上三角的公式,真狗啊,根据Ai,j=Aj,i转换一下,其实就是把i和j交换一下在代入公式,例如我知道A[2][0]存在S[4],那么A[0][2]也在S[4],所以代进去下面选项中

讲解地址:2019年下半年第57题_哔哩哔哩_bilibili

真题7

软件设计师---数据结构_第90张图片

总结一下这种类型的题目,首先上面矩阵的公式很多,记不住可以不记。因为在考试的时候做这样的题目是可以直接代进去试试就可以判断出来,但是脑子里要有下面两个图(一般会给出),这是为了防止它的已知不够用的情况下,自己在举例子去代

软件设计师---数据结构_第91张图片

其实应该脑子里有下面这两个图,但很明显上面的可以推出来,并且更容易记忆

软件设计师---数据结构_第92张图片

树的定义

软件设计师---数据结构_第93张图片

树的基本概念

软件设计师---数据结构_第94张图片

树的性质

软件设计师---数据结构_第95张图片
软件设计师---数据结构_第96张图片
软件设计师---数据结构_第97张图片

真题

真题1

软件设计师---数据结构_第98张图片

用到树的第一个性质

讲解地址:2010年下半年第61题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第99张图片

讲解地址:2019年下半年第59题_哔哩哔哩_bilibili

二叉树

二叉树的定义

软件设计师---数据结构_第100张图片

二叉树的性质

软件设计师---数据结构_第101张图片

给定结点数n,求二叉树的形态数量公式

软件设计师---数据结构_第102张图片

完全二叉树和满二叉树

软件设计师---数据结构_第103张图片

真题

真题1

软件设计师---数据结构_第104张图片

这里主要是我不知道选项中这个符号是什么意思,其实就是向下取整,也就是小于等于这个数的最大整数

讲解地址:2011年下半年第60题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第105张图片

真题3

软件设计师---数据结构_第106张图片

真题4

软件设计师---数据结构_第107张图片

真题5

软件设计师---数据结构_第108张图片

真题6

软件设计师---数据结构_第109张图片

这里主要是要知道有这个公式,然后知道阶乘怎么算

讲解地址:2019年上半年第58题_哔哩哔哩_bilibili

真题7

软件设计师---数据结构_第110张图片

讲解地址:2021年下半年第59题_哔哩哔哩_bilibili

二叉树的存储结构

顺序存储

软件设计师---数据结构_第111张图片
软件设计师---数据结构_第112张图片

如果一般二叉树非要用顺序存储,那就把它补成一颗满二叉树,没有的用虚结点表示

链式存储

软件设计师---数据结构_第113张图片

对于二叉链表来说,n个结点就有2n个指针域,然后n个结点就有n-1个分支,也就是n-1个指针不为空,那么为空的指针域就是2n-(n-1)=n+1个空指针域

总结:对于二叉链表来说,n个结点就有n+1个空指针域

对于三叉链表来说,n个结点有3n个指针域,这里多了一个父指针域,也就是第二个指针域的位置是指向父指针域的,那么n个结点就有n-1个分支和n-1个父指针域,所以空指针域是3n-(n-1)-(n-1)=n+2个空指针域

总结:对于三叉链表来说,n个结点就有n+2个空指针域

回炉重造地址:二叉树链式存储_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第114张图片

这里我一开始把完全二叉树和满二叉树搞混淆了

讲解地址:2009年上半年第61题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第115张图片

真题3

软件设计师---数据结构_第116张图片

真题4

软件设计师---数据结构_第117张图片

二叉树的遍历

先序遍历(根左右)

软件设计师---数据结构_第118张图片

中序遍历(左根右)

软件设计师---数据结构_第119张图片

后序遍历(左右根)

软件设计师---数据结构_第120张图片

层次遍历

软件设计师---数据结构_第121张图片

例题

软件设计师---数据结构_第122张图片

还原二叉树

根据上面的图可以看出先序,后序,层次遍历的序列中都可以得到根节点是哪个,先序遍历和层次遍历的第一个是根节点,后序遍历的最后一个也是根节点,然后就可以在中序遍历中找到根节点,也就是中序遍历加上其他任何一种遍历的序列就可以还原出二叉树,这里要注意中序遍历的序列是一定要有的,不然还原不了

先序遍历序列+中序遍历序列

软件设计师---数据结构_第123张图片

这里值得一提的是先序的第一个是根节点,第二个是根节点的左孩子,这是一定的,根据先序来确定每一个父节点的位置,然后再根据中序来判断其左右孩子的位置

讲解地址:先序+中序构造二叉树_哔哩哔哩_bilibili

后序遍历序列+中序遍历序列

软件设计师---数据结构_第124张图片

讲解地址:后序+中序构造二叉树_哔哩哔哩_bilibili

层次遍历序列+中序遍历序列

软件设计师---数据结构_第125张图片

讲解地址:层序+中序构造二叉树_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第126张图片

这里看清楚题目就行

题目2

软件设计师---数据结构_第127张图片

这种给了图的最快的办法就是直接把选项的中序遍历序列写出来看看跟题目给的一致不

讲解地址:2012年下半年第58题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第128张图片

这题目有的坑,我一开始是用排除法在四种遍历里排除后得到A选项,结果是D选项,D选项是右根左,离大谱!A选项是从1开始的所以也跟题目的遍历不符合,还是要细心点

讲解地址:2015年下半年第59题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第129张图片

讲解地址:2017年上半年第59题_哔哩哔哩_bilibili

真题5

软件设计师---数据结构_第130张图片

真题6

软件设计师---数据结构_第131张图片

讲解地址:2019年下半年第58题_哔哩哔哩_bilibili

平衡二叉树

软件设计师---数据结构_第132张图片

这是平衡二叉树,但是下面两个都不是平衡二叉树,完全二叉树一定是平衡二叉树,平衡二叉树不一定是完全二叉树

软件设计师---数据结构_第133张图片

讲解地址:平衡二叉树_哔哩哔哩_bilibili

二叉排序数

软件设计师---数据结构_第134张图片

上面的就是二叉排序树,也就是根结点大于左子树的所有结点,小于右子树的所有结点

讲解地址:二叉排序树定义_哔哩哔哩_bilibili

二叉排序树的构造

软件设计师---数据结构_第135张图片
软件设计师---数据结构_第136张图片

这里我一开始的想法是给它从小到大排序,然后在组成一颗二叉排序树,注意这里是不需要排序的!

真题

真题1

软件设计师---数据结构_第137张图片

真题2

软件设计师---数据结构_第138张图片

讲解地址:2014年下半年第59题_哔哩哔哩_bilibili

真题3

真题4

真题5

软件设计师---数据结构_第139张图片

我一开始想着直接把图的中序遍历写出来不就是对应的二叉排序树的关键码序列嘛,于是非常自信选个A,这里是我知识掌握的不牢,混淆了,二叉排序树用中序遍历后的结果是有序序列,这是没问题的,但谁说二叉排序树的中序遍历就是其关键码序列,这是不成立的,这种题目只能通过把选项的图都画出来,别无他法

最优二叉树(哈夫曼树)

软件设计师---数据结构_第140张图片

讲解地址:最优二叉树定义_哔哩哔哩_bilibili

软件设计师---数据结构_第141张图片

最核心的就是权值相同加末尾,从左往右画好图

讲解地址:构造最优二叉树例子_哔哩哔哩_bilibili

给定义一个序列画哈夫曼树

软件设计师---数据结构_第142张图片

讲解地址:构造最优二叉树例子_哔哩哔哩_bilibili

讲解地址:构造最优二叉树例子_哔哩哔哩_bilibili

哈夫曼编码

软件设计师---数据结构_第143张图片

记得左0右1就行

哈夫曼编码压缩比

这里是跟等长编码进行比较,2x>=n,x是要多少个等长编码,n是指有多少个字符,上面有5个字符,所以n=5,求出x=3,然后就可以算出压缩比了

讲解地址:哈夫曼编码压缩比_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第144张图片

真题2

软件设计师---数据结构_第145张图片

这里注意D选项是错的!例如下面的哈夫曼树有两个12就可以看出D选项是错的,描述的应该是二叉排序树

软件设计师---数据结构_第146张图片

真题3

软件设计师---数据结构_第147张图片

真题4

软件设计师---数据结构_第148张图片

这个题目会算就行,而且算起来听复杂的,所以建议留在最后做

真题5

软件设计师---数据结构_第149张图片

真题6

软件设计师---数据结构_第150张图片

真题 7

软件设计师---数据结构_第151张图片

真题8

软件设计师---数据结构_第152张图片

这个题有两个重复的权值,牢记权值相同加末尾,从左到右画好图

真题9

软件设计师---数据结构_第153张图片

真题10

软件设计师---数据结构_第154张图片

真题11

软件设计师---数据结构_第155张图片

线索二叉树

软件设计师---数据结构_第156张图片

真题

真题1

真题2

软件设计师---数据结构_第157张图片

最优二叉树的判断是只有度为0和度为2的结点

然后根据序列还原二叉树还是有点问题不太熟悉,要记得先序遍历是可以定父结点的位置的,然后在去中序遍历里判断其孩子结点的位置

讲解地址:2015年上半年第59题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第158张图片

图的定义

软件设计师---数据结构_第159张图片

有向图和无向图

软件设计师---数据结构_第160张图片

完全图

软件设计师---数据结构_第161张图片

入度和出度和度的定义

软件设计师---数据结构_第162张图片

无向图的某个顶点的入度和出度是一样的

路径的定义

软件设计师---数据结构_第163张图片

讲解地址:路径_哔哩哔哩_bilibili

连通图和强连通图

软件设计师---数据结构_第164张图片

这里注意

连通图是对于无向图来说的,所以一般称为无向连通图

无向连通图的最少边是n-1,最多边是n(n-1)/2

软件设计师---数据结构_第165张图片

上面的是无向连通图,我一开始以为2-5没有边连接起来所以不是无向连通图,但是2-5是可以通过2-3-4-5实现的,也就是它不用必须直接把两个顶点用边连接起来,所以才会有上面的最少边和最多边的情况

强连通图是对于有向图来说的,所以一般称为有向强连通图,

有向强连通图的最少边是n,最多边是n(n-1)

软件设计师---数据结构_第166张图片

这个图不是强有向连通图,因为顶点2并没有能够到达1和4的箭头

总的来说,不管是连通图还是强连通图,它们的核心判断就是看任意两个顶点能不能互相跑通,不一定要直接一口气跑到,可以跑到这再跑到那最后跑到目的顶点

真题

真题1

软件设计师---数据结构_第167张图片

无论是无向图还是有向图,它们所有顶点的度数之和都是边数的两倍

真题2

软件设计师---数据结构_第168张图片

图的存储结构

邻接矩阵表示法

软件设计师---数据结构_第169张图片

也就是用矩阵来存储图,矩阵横表示i,竖表示j,有向图中A[i][j]=1表示顶点i指向顶点j,例如上面有向图中

A[1][2]=1说明顶点1指向顶点2,然后顶点1的出度就是数i=1的那一横有多少个1,入度就是数j=1的那一列有多少个1,例如上面的有向图中顶点1横着数有3个1,那就是出度为3,竖着数有1个1那就是入度为1

总结:矩阵横表示i,竖表示j,有向图中A[i][j]=1表示顶点i指向顶点j,横出竖入

邻接链表表示法

软件设计师---数据结构_第170张图片
软件设计师---数据结构_第171张图片

稠密图和稀疏图

软件设计师---数据结构_第172张图片

也就是边多的图就是稠密图,例如完全图,一般边多的图用邻接矩阵存储

边少的图用邻接链表存储

讲解地址:稠密图与稀疏图_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第173张图片

讲解地址:2011年上半年第60题_哔哩哔哩_bilibili

软件设计师---数据结构_第174张图片

讲解地址:2015年下半年第61题_哔哩哔哩_bilibili

上面这两个题一个是有向图一个无向图,有向图的非0元素是e,无向图的是2e

真题2

软件设计师---数据结构_第175张图片

真题3

软件设计师---数据结构_第176张图片

软件设计师---数据结构_第177张图片

没有边用无穷,有边用对应边的权值

图的遍历

软件设计师---数据结构_第178张图片

深度优先搜索

软件设计师---数据结构_第179张图片

讲解地址:深度优先遍历_哔哩哔哩_bilibili

深度优先搜索的时间复杂度

软件设计师---数据结构_第180张图片

当图用邻接矩阵表示时,那深度优先搜索的时间复杂度为O(n2)

当图用邻接链表表示时,那深度优先搜索的时间复杂度为O(n+e)

n为顶点数,e为边数

广度优先搜索

软件设计师---数据结构_第181张图片

讲解地址:广度优先遍历和时间复杂度_哔哩哔哩_bilibili

广度优先搜索的时间复杂度

软件设计师---数据结构_第182张图片

当图用邻接矩阵表示时,那广度优先搜索的时间复杂度为O(n2)

当图用邻接链表表示时,那广度优先搜索的时间复杂度为O(n+e)

n为顶点数,e为边数

真题

真题1

软件设计师---数据结构_第183张图片

真题2

软件设计师---数据结构_第184张图片

讲解地址:2016年上半年第61题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第185张图片

真题4

软件设计师---数据结构_第186张图片

真题5

软件设计师---数据结构_第187张图片

讲解地址:2018年下半年第60、61题_哔哩哔哩_bilibili

真题6

软件设计师---数据结构_第188张图片

拓扑排序

软件设计师---数据结构_第189张图片
软件设计师---数据结构_第190张图片
软件设计师---数据结构_第191张图片

例如上面的614325这个拓扑序列中,6在4的前面,那么可能存在弧6指向4,一定不存在弧4指向6,可能存在6到4的路径,一定不存在4到6的路径

讲解地址:拓扑排序_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第192张图片

真题2

软件设计师---数据结构_第193张图片

真题3

软件设计师---数据结构_第194张图片

真题4

软件设计师---数据结构_第195张图片

真题5

软件设计师---数据结构_第196张图片

查找

查找的基本概念

软件设计师---数据结构_第197张图片
软件设计师---数据结构_第198张图片

平均查找长度

软件设计师---数据结构_第199张图片

Pi就是1/n,n为在多少个数字里查找,Ci就是比较的次数

例如 1 2 3 4 5中查找5。那n就是5,Ci就是5,因为比较了5次

讲解地址:查找基本概念_哔哩哔哩_bilibili

顺序查找

顺序查找就是从左往右查,不需要有序,适用于顺序和链式存储方式,平均查找长度为(n+1)/2

二分查找(折半查找)

软件设计师---数据结构_第200张图片

讲解地址:折半查找_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第201张图片

二分查找要求顺序存储并且是有序存储,跟循环链表没屁毛钱关系

真题2

软件设计师---数据结构_第202张图片

真题3

软件设计师---数据结构_第203张图片

这里首先我第一次做直接就把123给丢了,看题不仔细,其次二分法没学透,所以我选了C。

这里要先把下标从1标出来,然后求中间值,中间值如果是小数,那就用下取整的方法求,例如上面的(1+10)/2=5.5,向下取整为5(所谓的向下取整就是取小于这个数的最大整数),然后下标5对应的是55<95,说明在55的右边,那就是从62开始,也就是舍弃55这个中间值,55不参与下一轮的比较

总结:下标求中间值(比较值),中间值为小数则向下取整,比较后舍弃中间值进行下一轮比较

讲解地址:2010年下半年第60题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第204张图片

真题5

软件设计师---数据结构_第205张图片

真题6

软件设计师---数据结构_第206张图片

真题7

这里有个有意思的技巧,做这样的题目有个规律

关键字序列中有四种规律

大大大大大大一直大下去

小小小小小小一直小下去

小大小大一直这样小大下去

大小大小一直这样大小下去

看不懂直接去讲解地址看视频就知道了

讲解地址:2015年上半年第60题_哔哩哔哩_bilibili

真题8

软件设计师---数据结构_第207张图片

真题9

软件设计师---数据结构_第208张图片

真题10

软件设计师---数据结构_第209张图片

真题11

真题12

哈希表

哈希表的定义

软件设计师---数据结构_第210张图片

哈希函数的构造方法

软件设计师---数据结构_第211张图片
软件设计师---数据结构_第212张图片

哈希函数的构造法知道除留余数法就行,就是求余,m一般去解决n单不大于n的质数,n是由多少个数字,地址一般是从0开始

解决冲突的方法

软件设计师---数据结构_第213张图片

知道开放定址法就行了,说白了就是如果冲突了那就把那个数放到右边一位,如果还冲突那就继续往右推一位,直到不冲突为止,也就是把那个数放进去为止(这是线性探测法)

这个说白了就是如果冲突的话那就放到右边一位,如果还是冲突那就放到左边一位,这里的左边一位是以最开始冲突位置为原点的,再冲突就放到右边第4位,再冲突就放到左边第4位,以此类推

讲解地址:处理冲突拓展和装填因子_哔哩哔哩_bilibili

软件设计师---数据结构_第214张图片

讲解地址:哈希函数构造与处理冲突_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第215张图片

真题2

软件设计师---数据结构_第216张图片

这里我一开始以为是地址只从0-7,其实地址应该是取0-m,这个m在这里是13,也就是取模的那个数,所以这地址是0-12

讲解地址:2011年上半年第61题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第217张图片

真题4

软件设计师---数据结构_第218张图片

真题5

软件设计师---数据结构_第219张图片

真题6

软件设计师---数据结构_第220张图片

真题7

软件设计师---数据结构_第221张图片

讲解地址:2021年上半年第60题_哔哩哔哩_bilibili

小顶堆和大顶堆

软件设计师---数据结构_第222张图片

讲解地址:小顶堆与大顶堆_哔哩哔哩_bilibili

软件设计师---数据结构_第223张图片

讲解地址:建立小顶堆和大顶堆_哔哩哔哩_bilibili

就是给你一个序列,让你画出对应的大顶堆(大根堆)或小顶堆(小根堆)就行了

先根据序列顺序画一颗满二叉树,然后在一个个换位子,大顶堆要保证父结点比孩子结点要大,小顶堆要保证父结点比孩子结点小

真题

真题1

软件设计师---数据结构_第224张图片

其实就是拿第一个和第二三个比较,再拿第二个和第四五个比较,再拿第三个和第六七个比较,可以在脑子里画一颗二叉树

真题2

软件设计师---数据结构_第225张图片

把对应的这个大顶堆的树画出来就行了

讲解地址:2021年上半年第62题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第226张图片

排序

排序的定义

软件设计师---数据结构_第227张图片

所有排序的时间和空间复杂度

软件设计师---数据结构_第228张图片

快速排序的空间复杂度是O(log2n),上面是错的

最重要的一个总结,必须背

直接插入排序

稳定不归位(归位就是能够在排序时确定最终排序的位置),适用于基本有序的情况

讲解地址:直接插入排序_哔哩哔哩_bilibili

希尔排序

软件设计师---数据结构_第229张图片

不稳定不归位

讲解地址:bilibili.com/video/BV1UP4y1A79a?p=35

计数排序

适合序列里只有1-9的数字排序,说白了就是把要排序的数统计一下有多少个

讲解地址:直接插入、希尔、计数排序动画演示_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第230张图片

这里我以为有什么做题技巧,没有!一个个比!

讲解地址:2010年上半年第61题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第231张图片

直接插入排序适用于基本有序的的序列,这个时候是比较次数最少的时候

讲解地址:2012年下半年第62、63题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第232张图片

真题4

软件设计师---数据结构_第233张图片

这里我一开始是觉得65应该选C,也就是插入排序的平均时间复杂度,但是它这里是算最好的时间复杂度,这是因为它已经说了基本有序了,这是最好的情况,所以求的也是最好的时间复杂度

简单选择排序

不稳定归位

讲解地址:简单选择排序_哔哩哔哩_bilibili

堆排序

不稳定归位

软件设计师---数据结构_第234张图片

这里知道怎么转新堆就差不多了

讲解地址:堆排序_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第235张图片

真题2

软件设计师---数据结构_第236张图片

冒泡排序

软件设计师---数据结构_第237张图片

稳定归位

讲解地址:冒泡排序_哔哩哔哩_bilibili

*快速排序

软件设计师---数据结构_第238张图片

建议直接去看真题1的讲解,更容易懂

对于基本有序的序列用快速排序效率是最低的,时间复杂度是最坏的情况O(n2

不稳定归位

讲解地址:快速排序_哔哩哔哩_bilibili

真题

真题1

软件设计师---数据结构_第239张图片

快速排序是采用分治法的思想,用i指针指向第一个,j指针指向最后一个,设置个p=第一个值,然后j指针指向的数字和p值比较,如果比p小那就把j指针指向的值赋值到i指针指向的值,如果比p大,那就j指针向左移动一位,然后阿巴阿巴,讲起来太抽象,建议直接看视频

讲解地址:2009年下半年第64、65题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第240张图片

讲解地址:2013年下半年第62、63题_哔哩哔哩_bilibili

对于基本有序的序列用直接插入排序效率是最高的,时间复杂度是最好的情况O(n)

快速排序效率是最低的,时间复杂度是最坏的情况O(n2),空间复杂度是O(n)

注意这个时间复杂度和空间复杂度要看具体题目而定,不是说一股脑的以为都是用平均时间复杂度,甚至这个空间复杂度都不是固定的

真题3

软件设计师---数据结构_第241张图片

真题4

软件设计师---数据结构_第242张图片

讲解地址:2020年下半年第62、63题_哔哩哔哩_bilibili

归并排序

讲解地址:归并排序_哔哩哔哩_bilibili

稳定不归位

真题

真题1

软件设计师---数据结构_第243张图片

真题2

软件设计师---数据结构_第244张图片

这里归并排序没掌握,多看看

讲解地址:2011年上半年第65题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第245张图片

讲解地址:2012年上半年第61题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第246张图片

真题5

软件设计师---数据结构_第247张图片

真题6

软件设计师---数据结构_第248张图片

真题7

软件设计师---数据结构_第249张图片

真题8

软件设计师---数据结构_第250张图片

也就是看归不归位

杂题选讲

真题

真题1

软件设计师---数据结构_第251张图片

讲解地址:2009年上半年第58题_哔哩哔哩_bilibili

真题2

软件设计师---数据结构_第252张图片

讲解地址:2009年上半年第59题_哔哩哔哩_bilibili

真题3

软件设计师---数据结构_第253张图片

讲解地址:2009年上半年第62题_哔哩哔哩_bilibili

真题4

软件设计师---数据结构_第254张图片

讲解地址:2009年下半年第62题_哔哩哔哩_bilibili

真题5

软件设计师---数据结构_第255张图片

讲解地址:2012年下半年第61题_哔哩哔哩_bilibili

真题6

软件设计师---数据结构_第256张图片

讲解地址:2013年上半年第51题_哔哩哔哩_bilibili

真题7

软件设计师---数据结构_第257张图片

讲解地址:2014年上半年第64、65题_哔哩哔哩_bilibili

真题8

软件设计师---数据结构_第258张图片

讲解地址:2015年上半年第62、63题_哔哩哔哩_bilibili

真题9

软件设计师---数据结构_第259张图片

讲解地址:2015年上半年第64、65题_哔哩哔哩_bilibili

你可能感兴趣的:(软件设计师(上午题),数据结构,算法,java)