Data Structure And Algorithm Questions 上
- 1. 在初始为空的堆上执行以下操作时,绘制最小堆:
- 2. 归并排序的运行时间是否依赖于输入文件中的键值?
- 3. 递归归并排序
- 4. 绘制二叉搜索树
- 5. 通过给定哈希函数将数据插入哈希表
- 6. 通过给定哈希函数使用双重哈希法将数据插入哈希表
- 7. Rabin-Karp算法是如何改进朴素模式匹配算法的
- 8. 在扩展节点时广度优先搜索和深度优先搜索的区别
- 9. 为什么广度优先搜索是完整的和最优的,而深度优先搜索不是
- 10. 在一维和二维数组中找到一个峰值的复杂度
- 11. A*搜索如何使用启发式来指导其搜索过程
- 12. 给定数组寻找峰值
- 13. 左子树和右子树高度相差最多1的搜索树是什么
- 14. 广度优先搜索遍历给定图时使用什么数据结构?
- 15. 给定无向图中,Bellman-Ford算法是如何计算节点A到所有其他节点的最短路径的?
- 16. DFS搜索迷宫
- 17. BFS搜索迷宫
- 18. 给定有向图进行BFS和DFS
学习算法课时整理的一些简单的练习题,可以与理论结合加深理解。
欢迎交流指正~
1. 在初始为空的堆上执行以下操作时,绘制最小堆:
insert(1), insert(5), insert(2), insert(6), insert(4),insert(8), remove, insert(7), insert(3).
答:
remove移除了最小堆的根也就是1。
2. 归并排序的运行时间是否依赖于输入文件中的键值?
答:不依赖。
归并排序不依赖于键的值,因为不管数据的顺序是什么,它都有相同的运行时间O (n log n)。
// 它的主要缺点是它使用了与n成比例的额外空间。
3. 递归归并排序
Key: E A S Y Q U E S T I O N
答:
先拆分,拆分到都是一个字节之后再Merge。要分别注意两个步骤的操作顺序。
4. 绘制二叉搜索树
顺序: E A S Y Q U E S T I O N
绘制完成后删除Q
答:
// 注意,字母的前后顺序代表着值的大小。
5. 通过给定哈希函数将数据插入哈希表
用线性探测的方法,给出当Key:E A S Y Q U S T I O N被插入到一个初始为空的大小为13的表中时所产生的哈希表的内容。
使用h(k) = k mod 13的哈希函数为字母表的第k个字母。可以假设没有插入重复项。
答:
其中,O是字母表中第15个,15 mod 13 =2,所以放在哈希表2折个位置。
N是14个,为啥放在哈希表3的位置呢?14 mod 13 = 1
可是按照Key插入的顺序,1已经被A占了,2已经被O占了所以N只能顺位到下一个有空的位置,所以在3这里。
后面的字母同理。
6. 通过给定哈希函数使用双重哈希法将数据插入哈希表
重复上述问题,使用双哈希,第二个哈希函数是:h2(k) = 1+ (k mod 11)。(注意:可以假设没有插入重复项。)
答:
注意,在使用双重哈希时,第一个哈希函数用于指定位置,第二个哈希函数用于处理冲突。
当N被插入时,N是第14个字母。所以h1=1, h2=4。位置1已经被占用了,我们来看看(1+4)%13=5,这也是已经被占用,所以我们看(1+8)%13=9,这是被占用的,所以我们看(1+12)%13=0,这是空的,所以N在位置0。
7. Rabin-Karp算法是如何改进朴素模式匹配算法的
答:
在文档中搜索单词的简单方法是从文档的开头开始,检查每个连续的字母,看它是否与单词中的字母匹配。如果文档的字母片与单词中的字母匹配,则已找到匹配项。所以,简单模式匹配会进行mxn字符比较,最坏的情况是(其中n是单词的长度,m是文档的长度)。
Rabin-Karp算法使用滚动哈希函数来计算散列值,而不必重新哈希整个字符串。当检查文本的子字符串是否等于单词时,算法只需要查看哈希值是否相等。这可以在固定时间内通过分别减去和添加文档子字符串的前导和尾随字母的哈希来完成。因此,Rabin-Karp算法更快,因为它只对每个字符进行一次比较。
8. 在扩展节点时广度优先搜索和深度优先搜索的区别
答:
广度优先搜索使用队列遍历树或图形,一次遍历一个级别,并从左到右遍历一个级别(其中级别定义为从树的根或图形中的源的距离)。
深度优先搜索与树的预序遍历密切相关。它使用堆栈在访问每个节点的子节点或连接的节点之前访问每个节点,从而遍历树或图形。
9. 为什么广度优先搜索是完整的和最优的,而深度优先搜索不是
答:
广度优先搜索是完整的,因为它总是达到目标。广度优先搜索是最优的,它的步长代价等于1。
深度优先搜索是不完全的。它在无限深度的空间中失败了,但是,它可以被修改以避免沿着路径的重复状态。深度优先搜索不是最优的,因为它可能首先找到一个非最优的目标。然而,它比广度优先搜索快得多。
10. 在一维和二维数组中找到一个峰值的复杂度
答:
这取决于用于寻找峰值的搜索算法。
在一维数组中寻找一个峰值,使用线性搜索需要O(n)时间,使用二分搜索需要O(log n)时间。
在一个n x n二维数组中寻找一个峰值,使用线性搜索可以达到O(n2),使用逐列二分搜索技术可以达到O(n log n)。
11. A*搜索如何使用启发式来指导其搜索过程
答:
A* 算法使用从节点到目标的欧几里德距离作为启发式,以支持既靠近起点(通过边)又靠近目标位置(通过欧几里德距离)的节点。通过使用到目标位置的欧几里德距离作为启发式,a*算法实现了对目标的有向搜索。
而最短路径算法,如Dijkstra和Bellman-Ford算法,通过从一开始就盲目地扩展短路径直到寻找到目标。
12. 给定数组寻找峰值
数组为:
4 5 6 9 6 6 6 8 7 7
其中峰值为:
[3], [5], [7] 和 [9]
注意,数组的一个是[0],
[3], [5], [7] 和 [9]分别是9 6 8 7。
峰值定义如下:
峰值定义为大于或等于相邻元素的任何元素,或者第一个或最后一个元素大于或等于相邻元素的任何元素。
13. 左子树和右子树高度相差最多1的搜索树是什么
答:
AVL 树
有关各种树的定义和区别可以看我的这些篇文章:
https://blog.csdn.net/Jifu_M/article/details/112827685
https://blog.csdn.net/Jifu_M/article/details/112841205
14. 广度优先搜索遍历给定图时使用什么数据结构?
答:
队列 Queue
15. 给定无向图中,Bellman-Ford算法是如何计算节点A到所有其他节点的最短路径的?
最短路径算法可以看我的这篇文章:
https://blog.csdn.net/Jifu_M/article/details/112909339
答:
有4个顶点,所以我们需要迭代顶点3次。
初始化:
第一次迭代:
顶点A我们可以到达B, C和D,所以更新。
从顶点B我们可以到达A(较长)和D(较短)。更新路径更短的D。
从顶点D我们可以到达A(更长),B(更长)和C(更长)。不需要更新。
第二次迭代:
从顶点A我们可以到达顶点B, C&D,不需要更新。
从顶点B我们可以到达A,&D,不需要更新。
从顶点C我们可以到达D和&D,不需要更新。
从顶点D我们可以到达A, B&C,不需要更新。
第三次迭代:
因为没有负边和环,所以没有变化。
检查;
因此,从A到其他顶点的最短路径为:
16. DFS搜索迷宫
考虑下面的迷宫,起点为S,终点为g,使用深度优先搜索(DFS)遍历过程中节点访问的有效顺序是什么?
答:
// 注意:多路径选择时,选择顺序应为:下、上、左、右。
A D G H I B E F
17. BFS搜索迷宫
考虑下面的迷宫,起点为S,终点为g,使用广度优先搜索(BFS)遍历过程中节点访问的有效顺序是什么?
答:
A D B G E C H F
//可以认为到了F就出了迷宫,因为S和G不是节点。
18. 给定有向图进行BFS和DFS
A点开始的BFS:
A B C D E F
A点开始的DFS:
A B D E C F
算法和数据结构练习题-下:
https://blog.csdn.net/Jifu_M/article/details/112972951