杭电复试数据结构题目,自己的准备

数据结构
1.顺序存储和链式存储的优缺点比较:
1)顺序存储。
可实现随机存取(O(1)时间复杂度),但是因为逻辑上相邻的元素物理位置也相邻,所以插入和删除需要移动大量元素(O(n)); 另外每个节点只需要存储数据,存储密度高,空间利用率高。
2)链式存储。
非随机存取,查找某个节点,只能从头开始遍历(O(n));插入和删除操作只需要O(1)时间复杂度; 每个节点除了存储数据还需要存储指针,空间利用率低。
静态链表,借助数组来表示链式结构,需要分配一块连续大小的内存空间,用数组下标直接表示结点的地址,插入和删除操作只需要修改指针,不需要移动元素。
struct Node{
typename data;
int next;//指针域,数组下标
}node[maxsize];
2. 用非递归方式实现先序遍历,讲一下思路
先序遍历非递归:在入栈之前访问。访问根节点,将其入栈,然后挨个访问根节点的所有左孩子节点并将其入栈。之后出栈一个节点p,这个节点是没有左孩子节点或者左孩子节点已经访问过了。然后将该节点的右孩子节点入栈,在重复上述操作,直到栈空或者树空为止。
中序遍历非递归:将二叉树的根节点的所有左孩子节点依次进找,然后出栈一个节点*p,p是没有左孩子节点或者左孩子节点已经访问过了,访问p。然后将该节点的右孩子节点入栈,再重复上述操作,直到栈空或者树空为止。
2.什么是最短路径。
从起点到终点带权路径长度最短的路径称为最短路径。Dijkstra算法原理是按照路径是递增的顺序生成的。
Dijkstra单源最短路径算法:设置集合S存放图G中被访问的顶点然后执行n次下面步骤:1.每次从未坊问的顶点中选择与起点st距离最近的顶点u,访问并加入集合S中。2.令顶点u为中介点,优化从u出发能到达的未访问的邻接点的最短距离。
Floyd多源最短路径算法:一半不会问,可以将Dijkstra运用n次。
3.最小生成树两种算法。
MST,极小连通子图,包含连通图中的所有顶点和n-1条边,无回路。最小生成树不一定唯一,但是边权之和是唯一的,且是最小的。
Prim算法:(与Dijkstra相似),收录的是顶点,适合稠密图,边较多,时间复杂度为O(n^2)或者O(nlogn+E); 实现步骤:设置集合S存放图G中被访问的顶点然后执行n次下面步骤:1.每次从未坊问的顶点中选择与集合S距离最近的顶点u,访问并加入集合S中,同时把这条离集合S最近的边加入最小生成树中。2.令顶点u最为集合S的接口,优化u的未访问的邻接点与S的最短距离。
Kruskal算法:(边贪心,收录的是边集)适合稀疏图,边很少几乎等于顶点数时,时间复杂度为O(ElogE); 实现步骤:1.对所有边按照边权从小到大排序,2.按边权从小到大进行测试,对当前测试边的两个定点如果属于不同的连通块,则将该边收录(并查集实现),否则将边舍弃;3.如果加入的边数达到n-1条则返回最小生成树的边权和,如果小于n-1条,则表明图不连通
4.影响hash表的因素。哈希表特性,怎么实现?
散列存储,根据元素的关键字直接计算出元素的地址
散列函数的选取和处理冲突的方法都会影响hash表的性能。
散列函数1)应该计算简单,提高转换速度。2)关键字对应的地址空间要分布均匀,以尽量减少冲突。
1)直接定址法,取关键字的某个线性函数值为散列地址,没有冲突但易造成存储空间的浪费。
2)除留余数法,取一个不大于存储表长,但接近表长的质数p,然后用关键字对p取余。取质数是因为可以使数据集中地数等概率映射到哈希表中
解决冲突的方法:
1)线性探测法:当遇到冲突时,顺序查看表中下一个元素,直到找到一个空闲单元。容易形成集聚效应
2)平方探测法:增量序列为0,1,-1,4,-4…
3)拉链法:吧所有同义词储存在一个线性链表中。
5.数据结构在现实生活中的应用,数据结构怎么理解,算法怎么理解,c语言与他们关系。在电子信息工程中的应用?
算法+数据结构=程序,如Kruskal算法中的堆排序算法和并查集数据结构等。c语言是一种解决问题的工具。比如考试时,一道题目脑子里想的思路答案就是算法和数据结构,而用铅笔或是钢笔就是c语言工具,将答案写出来。
算法:是对数据运算的描述,是对特定问题求解步骤的描述。排序算法,查找算法等。PWM算法。有穷性,确定性,可行性,输入和输出。
数据结构是计算机存储,组织数据的方式。数据结构具体指同一类数据元素中,各元素之间的相互关系,包括数据的逻辑结构(集合,线性,树,图,散列,栈,队列),数据的存储结构(顺序存储,链式存储,索引存储,散列存储)和数据运算结构。
现实生活中打扑克牌时,手抓牌时相当于直接插入排序;刷盘子取盘子时,用到了栈;自己订的大目标以及分解的小目标是树的应用;地图中两点的最短路径是图的应用。
在电子信息工程中的应用不知道。
6.简要表述一下你的毕业设计
7.排序算法
(1)直接插入排序,适用基本有序且数据量不大的数据
每次将一个待排序的数按关键字大小插入到前面已排好序的子序列中,直到整个数据都有序。在最后一次排序之前,所有元素都不在其最终位置。
时间复杂度:最好O(n),最坏O(n2),平均O(n2),稳定
(2)冒泡排序
①对待排序表,从后往前两两比较相邻元素值,若为逆序,则交换
②重复上述步骤n-1次,直到所有都有序。每趟都会把一个元素放在其最终位置。
时间复杂度:最好O(n),最坏O(n2),平均O(n2),稳定
(3)简单选择排序
对于待排序元素1-n,第i趟排序从i-n个元素中选择最小的元素与第i个元素交换。这样进行n-1趟排序即可。
时间复杂度:最好O(n2),最坏O(n2),平均O(n^2),不稳定
(4)希尔排序,缩小增量排序
将列表按照步长d分割成子表,分别进行直接插入排序,当整个表中的元素已经基本有序时,再进行一次直接插入排序。
时间复杂度:最好O(n1.3),最坏O(n2),不稳定
(5)快速排序
① 先将某元素调整为左边的元素都小于它,右边的元素都大于等于它(即将它放在本位上)
② 接下来递归将其左边的元素和右边的元素都排列好
快排的性能主要与划分操作有关,最好和平均时间复杂度是O(nlogn),最坏时间复杂度是O(n^2),递归要用到栈,空间复杂度是O(n)或者O(logn)。不稳定
(6)堆排序
建堆,每次输出堆顶元素,然后将堆底元素送入堆顶,在进行向下调整操作。
建堆时间复杂度O(n),然后又n-1次向下调整,每次调整O(logn),所以最好最坏平均时间复杂度都是O(nlogn),不稳定;
(7)2路归并排序
将n个元素看成n个长度为1的子表,然后两两归并,在将新表两两归并…直到合并为一个长度为n的有序表。
时间复杂度:每趟归并O(n),共需进行[logn]+1趟归并,最好最坏平均都是O(nlogn).空间复杂度O(n),要开一个同样大小的辅助数组空间。稳定
(8)拓扑排序
①选择一个入度为0的顶点入队输出;
②从网中删除该顶点的所有出边。
循环结束,还有顶点未入队,则说明有回路,否则是有向无环图。
8.线索二叉树
二叉树的二叉链表存储结构,对于n个节点的二叉树,有n+1个空链域。可以利用这些空链域存放指向前驱或后继的指针,组成线索二叉树。加入线索二叉树是为了加快查找前驱和后继节点。
9.二叉树与度为2的树区别
1)二叉树的左右孩子节点有左右之分,次序不能颠倒,而度为2的树没有次序。2)二叉树可以是空树,度为2的树最少要3个节点。
二叉树有一个性质:节点总数=度数和+1(度数和可以视为边数和),可以由此推导出,No=N2+1 , (No+N1+N2=N1+2N2+1);
10.图的储存
邻接矩阵,二维数组存储图的边信息
邻接表,对每个顶点建立一个单链表为边表。
为方便有向图的顶点的入度与出度的计算,有 有向图的十字链表表示法。为方便对无向图的边进行操作,有无向图的邻接多重表表示法。
11.图的遍历
BFS,类似于二叉树层序遍历,一层层将顶点入队并访问。
DFS类似于二叉树先序遍历,首先访问起始顶点 v,然后访问与 v 相连的一个顶点 w,再访问与 w 相连的一个顶点。当不能再向下访问时,退回到最近被访
问的顶点。
DFS优缺点:
优点:1)能找出所有解决方案。2)优先搜索一颗子树,然后是另一颗,和广搜相比,有着内存占用相对较少的优点。
缺点:1)要多次遍历,搜索所有可能路径,标识做了之后还要取消。2)在深度很大的情况下效率不高
BFS优缺点:
优点:1)对于解决最短或最少问题很有效,而且寻找深度小,因为BFS每次都是先遍历最近的节点。
缺点:内存耗费量大,需要开大量数组来存储状态
12.树和图的区别
1.线性表可以是空表,树可以是空树,但图不可以是空图,图中至少有一个顶点,可以没有边。
2.树是图的子集,可以算是一种特殊的图,树存在一对多的关系,图一对多和多对多都可以。
3.树有一个根节点,但是图没有。树除根节点外每个节点只有一个前驱,而图没有这种关系。树没有环,图可以有环。树n个顶点一定有n-1条边,但是图顶点和边之间没有确定关系。图有不连通的情况,树一定连通
4.树有明显的层次性,图呈现的是网络性,更复杂的关系。
13.树的遍历和图的遍历区别
遍历就是把节点按照一定规则构成线性序列,不同规则构成不同顺序的序列而已。
1.树的遍历不需要设置vis数组来标记是否访问过。因为不管是先序(根左右)中序(左根右)后序(左右根),树节点之间有明确的父亲孩子关系,都一定只会遍历一次。而图各节点之间都只有相邻关系,所以图的遍历都需要vis数组来标记节点是否访问过。
2.树的遍历一般以根节点开始,图的遍历可以任选节点。图有不连通的情况,树没有。
14.二叉树先序中序后序区别与联系,将层序遍历中的队列改为堆栈会怎样?
二叉树的先序中序后序遍历。遍历过程中经过节点的路线都一样,只是访问各节点的时机不同。先序是在第一次将节点入栈前访问,中序则是在节点出栈时访问。
如果将队列改为堆栈,并且入栈顺序改为先入右子节点再入左子节点,那么其顺序与先序遍历一样。
对于二叉树的操作,很多都关于遍历,要分别遍历左节点,右节点,在遍历左节点时,右节点怎么办呢,则需要数据结构来存储,栈 或者队列都行。而且先访问右节点还是左节点,顺序不同,要实现的功能也就不同。

感谢杭电官方q群提供的文件资料和自己私聊的杭电学长提供的资料帮助。虽然初试分数不高但是希望今年努力能被杭电录取。

2020年4月10日

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值