数据结构重点简答题
📣一、如何评价一个算法的好坏?
一个算法的评价主要从时间复杂度和空间复杂度来考虑。
- 时间复杂度:算法的时间复杂度是执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记作:T(n)
= O(f(n)),因此,问题规模n越大,算法执行时间的增长率与f(n)的增长率正相关,称作渐进时间复杂度。- 空间复杂度:算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐进性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
- 正确性:算法正确性是评价一个算法优劣最重要的标准。
- 可读性:算法的可读性是指一个算法可供人们阅读的容易程度。
- 健壮性:健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也成为容错性。
📣二、栈和队列的区别?
1.定义
- 队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表
- 栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。
2.规则不同
- 队列:先进先出
- 栈:先进后出
3.对插入和删除操作的限定不同
- 队列:只能在表的一端进行插入,并在表的另一端进行删除
- 栈:只能在表的一端插入和删除
4.遍历数据速度不同
- 队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快。
- 栈:只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的同时需要为数据开辟临时空间,保持数据在遍历前的一致性。
📣三、图的遍历方式?
深度优先遍历
从某个顶点v开始访问,访问与v相邻且未被访问的任一顶点v1,再访问与v1邻接且未被访问的任一顶点v2,重复该过程。不能继续访问时,依次回退到最近被访问的顶点。若还有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,直至图中所有顶点都被访问到为止。类似于树的先序遍历。是递归遍历,需要使用栈存储访问的路径信息。当图采用邻接矩阵存储时,时间复杂度就是O(n^2)。当图采用邻接表存储时,时间复杂度为(n+e)。广度优先遍历
从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从 这些邻接点出发依次访问他们的邻接点,并使得先被访问顶点的邻接点先于后被访问顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。类似于树的层次遍历,使用队列存储顶点信息。当图采用邻接矩阵存储时,时间复杂度就是O(n^2)。当图采用邻接表存储时,时间复杂度为(n+e)。对于连通图,从图的任意一个顶点开始深度或广度优先遍历一定可以访问图中所有顶点。
对于非连通图,从图中任意一个顶点开始深度或广度优先遍历并不能访问图中所有顶点。
📣四、请说一下你知道的几种查找算法?
查找分为静态查找和动态查找。
静态查找表有:顺序查找、折半查找、分块查找
动态查找表有:平衡二叉树、二叉排序树、还有B/B+树以及散列表
- 顺序查找:将待查关键字放在哨兵位置,再与表中的元素一一对比,结构简单,查找效率低。
- 折半查找:查找表要顺序存储且有序,若待查关键字与中间元素相同,则查找成功,否则按二分查找缩小查找范围,确定该元素可能再表位置的上下界,直到找到为止。
- 分块查找:查找表分成若干子块,块内无序,块间有序,再建立索引表,索引表内的每个元素为各块的最大关键字和各块第一个元素的位置,索引表按关键字有序排列,索引表可折半查找可顺序查找,块内只能顺序查找。
- 二叉排序树查找:从根节点开始,沿某个分支逐层向下比较的过程,若相等,则查找成功,若不等,若小于根节点的关键字,则在根节点的左子树查找,否则在根节点的右子树查找(递归)。
- 平衡二叉树查找:与二叉排序树查找相同
- 二分查找(折半查找)与二叉树查找,一个静态查找、一个动态查找。
📣五、快速排序的思想?
- 快速排序是交换排序的一种,是对冒泡排序的一种改进,其基本思想是在进行一趟排序后将要排序的数据划分成两个部分,其中一部分的数据比另外一部分的数据要小,然后再对着两部分的数据进行快速排序,整个排序过程可以通过递归进行,直到整个序列变成有序数列。目前为止,快速排序是所有内部排序中性能最好的排序算法,时间复杂度为O(nlogn)。