数据结构面试题整理
表达, 是一个需要把发散的观点收回来, 加以润色, 再兜售给别人的艺术.
-
时间复杂度
时间复杂度是执行算法时所需要的计算工作量,因为整个算法在执行时间与基本操作重复执行的次数成正比,所以将算法中基本操作的次数作为算法的时间复杂度的度量,一般情况下,按照基本操作系数最多的输入来计算时间复杂度,并且多数情况下我们去深层循环内语句所描述的操作,作为基本操作。 -
循环队列的顺序表中,为什么要空出一个位置?
这是为了来区分队空和队满的情况。
如果不空出一个位置,则判断对空和队满的条件是一样的。 -
什么是二叉排序树?以及原理,算法。
二叉排序树,又叫做二叉查找树,它是一棵空树,或者满足以下的情况:
第一种情况,如果右子树为空树,则左子树上的所有结点的值均小于根节点值。
第二种情况就是,如果左子树为空,则右子树上所有结点的值均大于根节点值。
且每个结点的左右子树均为二叉排序树。
原理:
二叉排序树的查找过程?
首先若根结点是查找关键字的话,则查找成功。
其次,若小于根节点的值,则递归查找左子树,反之,若大于根节点的值,则递归查找右子树,循环往复。
最后,如果子树为空,则查找不成功。 -
哈夫曼树?
定义:假设给定了n个权值作为n个叶子结点,构造一棵二叉树,并且满足,他的带权路径长度达到最小,我们叫做最优二叉树,并且也叫做哈夫曼树。
构造方法:假设n个权值作为n个叶子结点,n个权值分别为w1,w2……wn则,构造规则如下:
- 将w1,w2……wn看成是n棵树的森林,每棵树仅有一个结点。
- 在从森林中选出两个权值最小的树,进行合并,构成一个新的含有左右子树并且根节点值为左右子树之和的新树。
- 从森林中删除原来选取的两个较小数的两棵树,并将新树加入。
- 重复上面👆两步,直至森林中只剩一棵树位置,则该树就为所求得的哈夫曼树。
特点:
权值越大则越接近根节点。
树中没有度为一的结点。
应用:
通过哈夫曼编码,可以极大的减少编码的长度,哈弗满编码就是长度最短的前缀编码。
-
哈希冲突是什么?如何解决
哈希表是按照关键码的值来进行访问的数据结构,根据给定的关键字来计算出关键字在表中的地址,来加快查找速度。
如何构造哈希表:直接定址法,数字分析法,平方取中法,除留余数法。
所谓的冲突,就是指,不同的关键字映射在了同一个地址上的情况,就比如,管子见6与9 ,我们去哈希函数为 除3的余数。则他们两个的余数均为0,则我们就称这样的现象叫做冲突。
解决办法有三种:开放定址法(开地址法),链地址法。
开地址法,又分为线性探查法和平方探查法。
而链地址法,就是将所有的同义词通过单链表串联在一起。 -
深度优先搜索遍历和广度优先搜索遍历的过程?
深度优先搜索遍历,基本思想就是“不撞南墙不回头”类型,从根节点开始,沿着树的深度,尽可能深层的探索树的分支,当达到了边际,就回溯到上一个,继续向下遍历。
广度优先搜索遍历:基本思想就是,从上到下,从左至右的遍历所有结点,直至所有顶点被访问。 -
dijikstra迪杰斯特拉算法过程
该算法是可以求得某一个顶点到其余顶点的最短路径。
算法的思想,设有两个顶点集合S和T,s中放的是图中已经找到的最短路径的顶点,t中存放图中剩余结点。
初始状态S中只包含源点,然后不断的从集合T中选取到达顶点V0,的最短的顶点Vu加入S集合中,没加入一个新的顶点,就需要更新各个顶点的最短路径的长度值,不断的重复这个过程,直至集合T中的顶点全部合并入S集合中为止。 -
链表查找某个元素时,平均时间复杂度是多少?
链表是顺序存储,所以时间复杂度时O(n),平均复杂度时(1+n)/2 -
图的存储方式:
邻接矩阵:是图的顺序存储结构,用两个数组来分别存储数据元素信息和数据元素之间的关系,图的邻接矩阵表示是唯一的,无向图的邻接矩阵是对称的。
邻接表:是图的链式存储结构,由单链表的表头形成的顶点,和单链表其余结点所形成的边表两部分组成。
十字链表:有向图的另一种链式存储结构,讲究为止关系,分别由down和right部分
邻接多重表:无向图的链式存储结构 -
图的深度遍历是否唯一
不一定唯一,我们可以取图中的任一个顶点进行深度遍历 -
图的相关概念合集
图:由结点的有穷集合和边的集合组成。
类别:有向图和无向图
顶点的度:出度和入度
完全图:n个顶点,n(n-1)/2条边
路径:相邻顶点序偶构成的序列
简单路径:路径中顶点和路径不重复出现的路径
回路:路径中第一个顶点和最后一个顶点相同的路径
连通图:无向图中,任意两个顶点之间都连通则称连通图。
有向图中,任意两个顶点,从一个顶点到另一个顶点均由来回的路径,则为强连通图。 -
最小生成树
-
平衡二叉树
AVL树,是一种特殊的二叉排序树,其左右子树都是平衡二叉树,并且左右子树的高度差绝对值不超过1.
平衡因子:左右子树高度差
平衡调整,找到失去平衡的最小子树,即以距离插入结点最近,且平衡因子绝对值大于1的结点为根的子树。分别由四种调节方式LL\LR\RL\RR -
二叉树的存储
顺序存储结构,用一个数组来存储一棵二叉树,二叉树的结点值按照编号依次存入一个一维数组,适用于完全二叉树,若用一般的二叉树会浪费大量的空间。
链式存储结构:每个结点用一个链结点来存放。 -
M 阶 B-树和 M 阶 B+树的主要区别
-
折半查找适用于?
适用范围:顺序结构存储并按照关键字大小有序排列。
时间复杂度:O(log2N) -
什么是堆?
堆是一种数据结构,可以把堆看成一个完全二叉树,并且这个完全二叉树满足:
任何一个非叶节点的值都不大于(或不小于)其左右子树的结点的值。若父亲大孩子小,则为大顶堆,若父亲肖孩子大,则为小顶堆。
作用:应用于堆排序。 -
如何让实现循环队列?
把数组弄成一个环,让 rear 和 front 指针沿着环走,这样就可以产生循环队列。
好处:循环队列是顺序队列的改进,在顺序队列中,在元素进队的时候,rear 要向后移动,元素出队的时候,front 也要向后移动,这样经过一系列的出队和入队操作之后,两个指针最后会达到数组的末端,此时虽然队中已经没有元素了,但是还是不能让元素入队,即出现了“假溢出”的现象。循环队列就能避免出现这个现象。 -
深度优先搜索形成的是什么?森林唯一吗?
形成的是森林,不唯一,因为邻接表不唯一 -
满二叉树的结点个数(n 层)
2 的 n 次方减一 -
二叉查找树查找的时间复杂度以及中序遍历后得到什么样的序列
递增有序序列 -
什么图可以进行拓扑排序?
有向无环图 -
顺序队列的特征
队列是一种操作受限的线性表,只允许队尾入队,在队头进行出队。最大的特点是先进先出。