考研复试问答(数据结构部分)

转载请注明出处:https://blog.csdn.net/xuezoutianya/article/details/106038718

1、算法的特征?
    答:有穷性、确定性、可行性、输入、输出

2、时间复杂度的概念?
    答:时间复杂度是算法中所有语句的频度之和的数量级,也是算法中基本运算的频度的数量级。

3、什么是原地工作?
    答:原地工作指算法所需的辅助空间为常量。

4、线性表的定义?
    答:线性表是具有相同类型的n个数据元素的有限序列。

5、单链表的建立过程?
    答:头插法:待插入的结点next域指向头结点的下一个结点,头结点的next域指向待插入的结点
        尾插法:(设置一个尾指针指向尾结点)尾结点的next域指向待插入的结点,尾指针指向待插入的结点

6、为什么单链表要加头结点?
    答:1.方便单链表的特殊操作(如在第一个结点之前插入结点),保证单链表操作的统一性
        2.带头结点的单链表无论是否为空,头指针始终指向头结点,保证对空表和非空表的操作统一性

7、为了区分循环队列的队空和队满,有哪些方法?
    答:1.牺牲一个单元来区分队空和队满,队空条件:front==rear;队满条件:(rear+1)%MaxSize==front
        2.类型中增加一个表示元素个数的数据成员,队空条件:size==0;队满条件:size==MaxSize
        3.类型中增加一个用于标记的数据成员,若因删除导致front==rear,则队空;若因插入导致front==rear,则队满

8、树和二叉树的概念?
    答:非空树:1.有且仅有一个根结点 2.除根以外的结点可分为多个互不相交的有限集合,其中每个集合本身又是一棵树,称为根节点的子树。
        二叉树:1.可以为空二叉树 2.由一个根结点和两个互不相交的根的左子树和右子树组成,且左、右子树也都是二叉树。

9、二叉树和度为2的有序树的区别:
    答:1.度为2的树至少有3个结点,而二叉树可以为空。
        2.度为2的有序树的孩子结点的左右次序是相对于另一孩子结点而言的,而二叉树的孩子结点次序不是相对于另一结点而言,是确定的。

10、二叉树怎么存储?
    答:1.顺序存储:用一组地址连续的存储单元依次自上而下、自左向右存储完全二叉树上的结点信息。这种方式仅适用于完全二叉树。
        2.链式存储:用一个链表来存储一棵二叉树,二叉树中的每个结点用链表的一个链结点来存储。含有n个结点的二叉链表中有n+1个空链域。

11、完全二叉树的定义?
    答:高度为h,有n个结点的二叉树,每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。

12、二叉树的层次遍历过程?
    答:1.把根结点入队
        2.把队头元素出队,访问这个元素
        3.依次把该元素的左、右孩子入队
        4.重复2,3过程,直到队列为空

13、线索二叉树的概念及构造过程?
    答:概念:加上线索的二叉树成为线索二叉树。
        线索化:在遍历二叉树的过程中,检查当前结点左、右指针域是否为空,若为空,将它们改为指向前驱结点或后继结点的线索。

14、树的存储结构有哪些?树、森林与二叉树怎么转换?
    答:存储结构:双亲表示法(键值对形式,键为结点编号,值为父结点编号),孩子表示法(指针数组形式,将当前结点的所有孩子结点用链表串起来),孩子兄弟表示法(左孩子右兄弟)
        树转换为二叉树:每个结点左指针指向它的第一个孩子结点,右指针指向它在树中的相邻兄弟结点,即“左孩子右兄弟”。
        二叉树转换为树:若二叉树非空,则根结点及其左子树为第一棵树的二叉树形式,右子树可视为一个除了第一棵树外的森林转换后的二叉树,应用同样的方法,直到最后产生一棵没有右子树的二叉树为止。

15、二叉排序树的定义?简述其原理及查找过程?
    答:1.若左子树非空,则左子树上所有结点关键字值均小于根节点的关键字值。
        2.若右子树非空,则右子树上所有结点关键字值均大于根节点的关键字值。
        3.左、右子树也都是二叉排序树。
        查找过程:若查找的关键字等于根结点的关键字值,成功。否则,若小于根结点的关键字值,递归查左子树。若大于根结点的关键字值,递归查右子树。若子树为空,查找不成功。

16、什么是平衡因子?什么是平衡二叉树?
    答:某结点的平衡因子是该结点左子树与右子树的高度差。
        平衡二叉树又被称为AVL树,它的左右两个子树都是平衡二叉树且左右两个子树的高度差的绝对值不超过1。

17、哈夫曼树的概念以及哈夫曼树的构造?哈夫曼树的应用?前缀编码和哈夫曼编码的关系?
    答:概念:哈夫曼树是带权路径长度最小的二叉树(树的带权路径长度为所有叶结点的带权路径长度之和)
        构造过程:    1.将n个结点分别作为n棵仅含一个结点的二叉树,构成森林F
                    2.构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左右子树,并且将新结点的权值置为左右子树上根结点的权值之和。
                    3.从F中删除刚才选出的两颗树,同时将新得到的树加入F中。
                    4.重复2,3过程,直到F中只剩下一棵树为止。
        应用:哈夫曼编码(长度最短的前缀编码)。

18、图的相关概念?
    答:有向图:若边集是有向边的有限集合,则图为有向图
        无向图:若边集是无向边的有限集合,则图为无向图
        简单图:1.不存在重复边 2.不存在顶点到自身的边
        简单回路/简单环:除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路/简单环。
        完全图:任意两个顶点之间都存在边
        连通:若无向图中从顶点v到顶点w有路径存在,则称v和w是连通的
        连通图:若无向图中任意两个顶点都是连通的,则称图为连通图
        连通分量:无向图中的极大连通子图称为连通分量
        生成树:包含图中所有顶点的一个极小连通子图

19、树和图的区别?
    答:1.树是图的子集
        2.非空树有且仅有一个根结点,且树的非根节点必定有一个父节点,图没有
        3.树是层次结构,图是网络结构

20、图的存储方式有哪些?
    答:邻接矩阵,邻接表,十字链表(有向图),邻接多重表(无向图)。
        (图的邻接矩阵表示是唯一的,且无向图的邻接矩阵一定是一个对称矩阵)

21、广度优先搜索的过程?深度优先搜索的过程?两者的时间复杂度?
    答:广度搜索的过程:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,...,wi,然后依次访问w1,w2,...,wi的所有未被访问过的邻接顶点。
        深度搜索的过程:首先访问起始顶点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2...重复上述过程。
        时间复杂度:邻接矩阵O(V^2),邻接表O(V+E)

22、图的遍历序列是否唯一?
    答:由于图的邻接矩阵表示唯一,邻接表表示不唯一,所以基于邻接矩阵的遍历所得到的dfs序列和bfs序列是唯一的,基于邻接表的遍历所得到的dfs序列和bfs序列是不唯一的。

23、非连通图如何访问每一个结点?
    答:对每个连通分量调用一次DFS/BFS。

24、什么是最小生成树?最小生成树有什么性质?
    答:概念:最小生成树是边的权值之和最小的生成树。
        性质:    1.最小生成树不是唯一的
                2.最小生成树的边的权值之和总是唯一的
                3.最小生成树的边数为顶点数减1

25、怎么构建一棵最小生成树?最小生成树应用在有向图还是无向图中?
    答:普里姆算法:先将图中的任意一个顶点放进集合中,然后比较所有集合内的顶点与集合外的顶点连成的线的权值,把那个能连权值最小的线的顶点和相应的边也放进集合里面。重复此步骤,直到所有顶点都加入集合。
        克鲁斯卡尔算法:先在图中建立一个空集,然后在集合外选择权值最小的边,若这条边加入集合后不构成回路则将该边和边两端的顶点也加入集合。重复此步骤,直到集合中有n-1条边。
        有向图的最小生成树叫最小树形图,有避圈法(Kruskal算法)与破圈法,破圈法:在图中找一个回路,保证图连通的前提下去掉回路中权值最大的的边,重复上述过程,直到图保持连通且没有回路。

26、迪杰斯特拉算法的过程?
    答:先将图中的某个顶点作为源点放进集合中,然后比较源点到集合外的各个顶点的当前最短路径,把本轮求得的当前最短路径的顶点放进集合,然后更新源点到集合外的各个顶点的当前最短路径。重复上述过程,直到所有顶点都加入集合。
    (新加入一个未收录的顶点时,源点与集合内的顶点的当前最短路径不会更新,即源点与集合内的顶点的当前最短路径不会因为新收录顶点而变得更短)

27、什么是AOV网?什么是拓扑排序?什么是AOE网?什么是关键路径?
    答:AOV网:即顶点表示活动的网络(有向无环图中,顶点表示活动,有向边表示活动之间的前驱后继关系)
        拓扑排序:1.由有向无环图的顶点组成的序列 2.每个顶点出现且只出现一次 3.若顶点A排在顶点B之前,则不存在从顶点B到顶点A的路径
        AOE网:即用边表示活动的网络(带权有向图中,顶点表示事件,有向边表示活动,边的权值表示完成活动的开销)
        关键路径:AOE网(用边表示活动的网络)中,从源点到汇点的所有路径中具有最大路径长度的路径称为关键路径

28、有哪些查找方法?
    答:1.线性结构有顺序查找,折半查找,分块查找(索引顺序查找)
        2.树形结构有二叉排序树,平衡二叉树,b树,b+树
        3.散列结构有散列表

29、折半查找的基本思路?适用范围?判定树高度
    答:基本思路:首先将给定值与表中间位置元素比较,若相等,则查找成功,返回该元素存储位置;若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分,然后在缩小的范围内继续上述查找过程,重复上述过程,直到找到为止,或确定表中没有所需要查找的元素,则查找不成功,返回查找失败的信息。
        适用范围:该查找仅适用于线性表的顺序存储结构,且要求元素按关键字有序排列。
        判定树高:log2(n+1)向上取整

30、分块查找的分块思路?分块查找中索引表的组成?分块查找的过程?
    答:分块思路:块内无序,块间有序
        索引表项:key是各块最大关键字,value是各块中第一个元素的地址
        查找过程:第一步是顺序查找或者折半查找索引表确定待查元素所在的块;第二步是在块内顺序查找

31、b树和b+树的区别?
    答:1.b+树结点的子树个数等于关键字个数,b树结点的子树个数为关键字个数加一
        2.b+树只有叶结点包含信息,非叶结点起索引作用;b树的叶结点不含信息,非叶结点含信息
        3.b+树叶结点和非叶结点关键字可重复,b树中所有结点关键字不重复
        4.b+树的相邻叶结点按大小顺序相互链接,b树没有

32、什么是哈希表?什么是哈希冲突?处理冲突的方法?什么是装填因子?什么是堆积?
    答:哈希表是根据关键字而直接进行访问的数据结构。
        哈希冲突是散列函数可能会把两个或两个以上的不同关键字映射到同一地址的情况。
        常用散列函数:    1.直接定址法
                        2.除留余数法
                        3.数字分析法
                        4.平方取中法
                        5.折叠法
        处理冲突的方法:1.开放定址法(线性探测法,平方探测法,再散列法,伪随机序列法)
                        2.拉链法
        装填因子:散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度
        堆积:开放定址法中同义词冲突的探查序列和非同义词之间不同的探查序列交织在一起

33、各种排序的时间复杂度,空间复杂度和稳定性?
    答:                        时间复杂度                        空间复杂度    是否稳定
    直接插入排序    最好O(n),平均O(n^2),最坏O(n^2)                O(1)        是
    冒泡排序        最好O(n),平均O(n^2),最坏O(n^2)                O(1)        是
    简单选择排序    最好O(n^2),平均O(n^2),最坏O(n^2)                O(1)        否
    希尔排序                                                        O(1)        否
    快速排序        最好O(nlogn),平均O(nlogn),最坏O(n^2)            O(logn)        否
    堆排序            最好O(nlogn),平均O(nlogn),最坏O(nlogn)        O(1)        否
    2路归并排序        最好O(nlogn),平均O(nlogn),最坏O(nlogn)        O(n)        是
    基数排序        最好O(d(n+r)),平均O(d(n+r)),最坏O(d(n+r))        O(r)        是

34、快速排序的原理,运用了什么思想?
    答:1.在待排序表L中任取一个元素作为基准,通过一趟排序将待排序表划分为两个部分L1和L2,使得L1中的所有元素小于基准元素,L2中的所有元素大于等于基准元素,则基准元素放在了其最终位置上。
        2.然后递归地对两个子表上述过程,直到每部分只有一个元素或空为止,即所有元素放在了其最终位置上。
        快速排序运用了分而治之地思想(分治法)。
        
35、什么是堆?堆的构造过程?
    答:概念:堆是一种数据结构,可以把堆看成一个完全二叉树,并且这个完全二叉树满足:任何一个非叶节点的值都不大于(或不小于)其左右子树的结点的值。若父亲大孩子小,则为大顶堆,若父亲小孩子大,则为小顶堆。
        构造过程:从最后一个结点的父结点开始,若当前结点关键字小于左右孩子中关键字较大者,则发生交换,交换后可能会破坏下一级的堆,此时需要用上述方法调整下一级的堆,直到以该结点为根的子树构成堆为止。之后向前依次对各结点进行上述过程,直到根结点。

36、为什么快速排序比堆排序快?
    答:逆序对:堆排序调整堆的过程中可能增加逆序对,做了很多无效的操作;而快排的每一次交换都离最终目标越来越近
        cache:堆排序的比较的几乎都不是相邻元素,对cache极不友好;相比之下快排比较的相邻元素更多,对cache更友好

37、基数排序的过程?
    答:以最低位优先为例,先对最低位进行一趟分配(考察对应位的值并放入相应的队列)收集(每个队列首尾相连),然后对次低位进行一趟分配收集,重复上述过程,直到最高位。时间复杂度O(d(n+r))

38、外部排序的过程?
    答:1.根据内存缓冲区的大小,将外存上的文件分成若干子文件,依次读入内存并利用有效的内部排序方法对它们进行排序,并将排序后得到的有序子文件即归并段重新写回外存
        2.对归并段进行逐趟归并,使归并段逐渐由小到大,直至得到整个有序文件为止。

39、外部排序优化?
    答:增大归并路数(内部归并的比较次数受归并路数影响-->采用败者树避免)
        减少归并段数(各个归并段中的元素个数可能不同-->用最佳归并树进行组织)

40、求解斐波拉契序列的算法及其时间复杂度?
    答:递归算法:求解F(n),必须先计算F(n-1)和F(n-2),以此类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,从而计算很多重复的值,算法的时间复杂度随着N的增大呈现指数增长,时间复杂度为O(2^n)
        迭代算法:从F(2)开始计算,最后用F(n-1)和F(n-2)两个数相加求出结果,用变量保存上一次计算的结果,这样可以避免大量的重复计算,算法的时间复杂度随着n的增大呈现线性增长,时间复杂度为O(n)
        (递归就是在过程或函数里面调用自身,迭代是利用变量的原值推算出变量的一个新值)

41、单链表就地逆置算法?
    答:用指针p扫描原单链表,先将头节点L的next域设置为NULL,而变成一个空链表,然后将*p节点采用头插法插入到L中。

42、链表查询某个元素,平均时间复杂度是多少?
    答:O(n)

43、哨兵的作用?
    答:哨兵用来解决边界问题,在查找方向的尽头设置哨兵免去了查找位置越界的判断

44、在一个老师学生关系中,学生学号与姓名一一对应,问采用什么数据结构通过学号查找姓名的速度最快?
    答:哈希表,索引表

45、折半查找用数组存数据,如果对数据进行删除和插入,就很麻烦,需要移动位置,那你设计一种数据结构解决这个问题?
    答:二叉排序树,平衡二叉树
    
46、行优先和列优先有什么不同(定义上的不同和效率上的不同)若A与B相乘,选择行优先还是列优先,为什么?
    答:存储模式:行优先的矩阵存储模式为,按照行的格式存储,一行存满了,接着存储第二行,列优先同理,一列存满了,接着存储第二列
        在内存使用上,因为程序局部性原理,连续的存储空间访问更快。
        A采用行优先,B采用列优先。

47、如何寻找两个链表的首个公共结点?
    答:1.先遍历两个链表,得到两个链表的长度,进而计算出长度之差
        2.假设一个链表比另一个长k个结点,先在长的链表上遍历k个结点,之后再同步遍历就可以保证同时到达第一个公共结点

48、bfs和dfs遍历全连通图的生成树的高度?生成树算法?
    答:对于一些特殊的图,比如只有一个顶点的图,其BFS生成树的树高和DFS生成树的树高相等。
        一般的图,根据图的BFS生成树和DFS树的算法思想,BFS生成树的树高比DFS生成树的树高小。

49、怎么用代码实现图的邻接矩阵?邻接表?
    答:二维数组实现图的邻接矩阵
        指针数组实现图的邻接表

50、什么是红黑树?怎么计算高度?
    答:红黑树是一种含有红黑结点并能自平衡的二叉查找树。红黑树的高度是logn

51、为什么基于比较的排序算法的时间复杂度下界是O(nlogn)?
    答:所有的基于比较的排序算法都是基于决策树模型,决策树的高度也就是排序算法比较的最多次数,决策树的高度为log(n!)近似nlogn

52、汉诺塔问题?
    答:将n个盘子从a柱移到c柱,首先将n-1个盘子从a柱移到b柱,然后将第n个盘子从a柱移到c柱,再将n-1个盘子从b柱移到c柱,那么问题变成如何移动n-1个盘子
        依次类推,问题最终变成如何移动2个盘子,即将第1个盘子从a柱移到b柱,第2个盘子从a柱移到c柱,再将第1个盘子从b柱移到c柱
        最后反向逆推可以得到移动n-1个盘子的方法,进而解决移动n个盘子的方法

53、存在环的单链表寻找环的入口点?
    答:1.散列表法:将遍历到的结点放在一个散列表中,如果当前遍历的结点已经存在散列表中,说明有环,且该结点即环的入口。时间:O(n) 空间:O(n)
        2.快慢指针:两个步进不同的指针遍历链表,若链表有环,两指针必然相遇,假设此时show走了n步,fast2n步。接下来,让fast回到链表的头部,重新走,每次步长1,那么当fast和slow再次相遇的时候,就是环路的入口了。时间O(n),空间O(1)
        (因为fash比slow快n,slow再走n步会回到相遇点,fast从链表首部走n步也会到相遇点,两段路径后面一小段重合,变成了找第一个公共结点的问题)

54、快速排序的优化思路?
    答:快速排序的优化思路是基准元素的选取
        可以选每个子部分中间位置的元素;或者是每个子部分中第一个,最后一个,中间的元素的中位数

55、在数据结构中用什么可以进行优先级的进程调度
    答:大顶堆。可以将优先级作为结点的权值,然后建队,调堆,输出最大权值的进程。

56、顺序查找有序表的过程及其判定树?
    答:顺序查找有序表:在已知表的关键字有序的情况下,通过关键字与key的比较,能快速判断是应该继续查找还是查找失败(n个关键字、n+1个失败结点)

57、已知先序和后序遍历序列可以唯一确定一棵树吗?
    答:不能,但可以确定二叉树中结点的祖先关系,当两个结点的先序序列为XY,后序序列为YX时,则X为Y的祖先
        (先序,中序,后序,遍历过程中经过结点的路线一样,只是访问结点的时机不同)

58、计算二叉树高度的算法?
    答:1.递归、后序遍历结点最大的栈即为树的高度
        2.使用层序遍历,最大层次即为二叉树的高度

59、深度优先搜索形成的是什么?森林唯一么?
(森林,不能说树)(不唯一,因为邻接表可能不唯一

60、怎么取一个单链表的倒数第K个值
    答:两个位置相差k的指针以相同步进遍历单链表,当前者遍历到底,则后者正指向倒数第k个结点

61、Dijkstra算法为什么权值不能为负?
    答:因为源点到集合内的顶点的当前最短路径后续不会更新,只会更新源点到集合外的各个顶点的当前最短路径

62、数组队列的假溢满现象
    答:当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低地址还有空位置,这种现象叫做假溢出。

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值