计算机面试问答之数据结构

数据结构

1、动态规划和贪心算法的联系和区别?
联系:都分解成子问题进行解决,两者都具有最优子结构性质。
区别:贪心算法的基本要求除了最优子结构,还有贪心选择性质,它不从整体最优去考虑,只基于当前情况进行最优选择,因此也不需要保存之前的解。动态规划除了最优子结构性质,还有重叠子问题性质,它基于相关子问题的解,需要保存之前所有的最优解。
2、分治法和动态规划的主要区别?
(1)分治法将分解后的子问题看成是相互独立的子问题。
(2)动态规划将分解后的子问题理解为是相互间有联系,有重叠部分的。
3、图的遍历和树的遍历有什么区别?
(1)图的遍历可能会出现循环遍历的情况,要设置标记数组。而树的遍历则不会出现这种情况。
(2)图可能存在不连通的情况,而树不存在,所以图的遍历要对所有的顶点都循环一遍。
4、哈希表的特性?如何实现?
哈希表是通过关键字进行查找的一种数据结构。要实现这种特性就需要散列函数把元素散列到某个位置,常用的散列方法包括直接寻址法、除留余数法、数字分析法。
5、解决哈希冲突的方法。
线性探测法、平方探测法、伪随机序列法、拉链法
6、单链表中增加头结点的目的?
对第一个结点的操作和其他结点一致,对空链表和非空链表的处理一致。
7、数据的逻辑结构有哪些?物理结构有哪些?
逻辑结构有线性表、树、图、集合。
物理结构也称存储结构,有顺序存储、链式存储、索引存储、散列存储。
8、算法的五个特征?
可行性、确定性、有限性、输入、输出。
程序=算法+数据结构
9、DFS(深度优先遍历)和BFS(广度优先遍历)的区别?
DFS:遍历时要借助栈,用于求所有解问题,规模不能太大。
BFS:遍历时使用队列,用于求最优解问题,规模可以稍微大点。
10、用循环比递归效率高吗?
一般来说的话,循环效率要比递归高,因为递归里有很多函数的调用。但是代码简洁,清晰,在编译器优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。
11、递归的两个条件?
递归表达式和递归出口
12、回溯算法的基本思想?
从一条路往前走,能进则进,不能进则退回来,换一条路再试。
13、数组和链表的区别?
长度:数组的长度是固定的;链表的长度是可以动态变化的。
访问:数组支持随机访问;而链表只支持顺序访问
作用:数组比较适合查询操作;链表比较适合插入删除操作。
存储方式:数组是连续存放的;链表是随机存储的。
14、简述迪杰斯特拉算法、弗洛伊德算法。
迪杰斯特拉算法:使用一个length数组来记录源点到各定点之间的最短距离,每次选出距离最短且还没有被使用过的顶点,来更新源点到其他结点的最短距离。迪杰斯特拉算法不适合带负权值边的图。
弗洛伊德算法:使用一个二维方阵来记录点之间的距离,之后在顶点之间加入中间结点,如果加入后的距离更短,就更新。弗洛伊德不适合包含负权值的边组成的有环图。
15、排序算法总结,包括时间复杂度、空间复杂度、稳定性。
(1)插入排序:直接插入排序、折半插入排序、希尔排序。平均时间复杂度:O(n2)、O(n2)、O(n2)/O(n1.3) 空间复杂度:O(1)、O(1)、O(1)
(2)选择排序:简单选择排序、堆排序。平均时间复杂度:O(n^2)、O(nlogn) 空间复杂度:O(1)、O(1)
(3)交换排序:冒泡排序、快速排序。平均时间复杂度:O(n^2)、O(nlogn) 空间复杂度:O(1)、O(logn)
(4)二路归并:平均时间复杂度:O(nlogn) 空间复杂度:O(n)
(5)稳定性:快速排序、希尔排序、选择排序、堆排序不稳定
16、冒泡排序法的改进。
(1)设置一标志变量pos,用于记录每趟排序中最后一次进行比较的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序只要扫描到pos位置即可。
(2)传统冒泡排序每一趟排序操作只能找到一个最大值和最小值,我们考虑利用在每趟排序中进行正向和反向两次冒泡的方法一次可以得到两个最终值,从而使排序趟数几乎减少了一半。
17、简述快速排序的过程。
(1)选择一个基准元素,通常选择第一个元素或者最后一个元素
(2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素指小,另一部分记录的元素值均比基准元素大
(3)此时基准元素在其最终位置上
(4)分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序
18、快速排序的改进。
只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。实践证明,改进后的算法时间复杂度有所降低,且当k取值为8左右时,改进的算法的性能最佳。
对于分治算法,当每次划分时,算法若能分成两个等长的子序列,分治算法的效率会达到最大。也就是说,最理想的方法是,选择的基准恰好能把待排序列分成两个等长的子序列。选择基准元有三种方式:(1) 固定基准元 (2) 随机基准元 (3) 三数取中
19、邻接矩阵与邻接表。
(1)邻接矩阵表示法:在一个一维数组中存储所有的点,在一个二维数组中存储顶点之间的边的权值。
无向图的邻接矩阵是对称的。矩阵中的第i行或第i列有效元素个数之和就是顶点的度;在有向图中第i行有效元素个数之和是顶点的出度,第i列有效元素个数之和是顶点的入度。
优点:可以快速判断两个顶点之间是否存在边,可以快速添加边或者删除边;缺点:如果顶点之间的边少,会比较浪费空间。因为这是一个n*n的矩阵。
(2)邻接表表示法:图中顶点用一个一维数组存储,图中每个顶点vi的所有邻接点构成单链表
在邻接表的表示中,无向图的同一条边存储两次;如果想要知道顶点的度,只需要求出对应链表的节点个数即可;有向图中每条边在邻接表中只出现一次,求顶点的出度只需要遍历对应链表即可,求入度则需要遍历其他顶点的链表。
优点:节省空间,只存储实际存在的边。缺点:关注顶点的度时,可能需要遍历整个链表。
20、B树和B+树。
(1)m阶B树:
除了根结点,每个分支结点的子树个数小于等于m。大于等于(m/2)向上取整
非叶根结点最少有2棵子树
关键字数量为子树数量减1
子树的关键字大小位于子树所在两个关键字之间
所有叶结点在同一行,且不存储数据,数据在非叶结点中
(2)m阶B+树:
除了根结点,每个分支结点的子树个数小于等于m,大于等于(m/2)向上取整
非叶根结点最少2棵子树
关键字数量等于子树数量
关键字大小等于它所指结点的最大关键字
所有叶结点都在同一行且包含了全部关键字,而且按顺序进行链接
(3)差异
关键字个数
分支结点作用
叶结点作用
支持查找方法
21、简述KMP算法。
快速从主串中找到想要的子串,根据模式串求出next数组,利用next数组进行匹配,主串指针不回溯,next数组只与模式串有关。
22、红黑树。
红黑树是一种带有红黑结点的平衡二叉树。必须满足以下性质:
(1)每个结点要么是黑色,要么是红色
(2)根结点必须是黑色
(3)每个叶子结点是黑色
(4)每个红色结点的两个子结点一定是黑色
(5)任意一结点到每个叶子结点的路径都包含数量相同的黑色结点
红黑树只追求大致平衡,平衡二叉树追求完全平衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值