架构师训练营第 8 周作业
作业一:单向链表相交问题
假设这两个单向链表没有环
有两个单向链表(链表长度分别为m,n),这两个单向链表有可能在某个元素合并,如上图所示,也有可能不合并。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是途中的x元素。
请用(伪)代码描述算法,并给出时间复杂度和空间复杂度。
解答:
本题采用三种方法解决,第三种方法参考了LeetCode的解题方法(很NB),做算法题可以开拓自己的解决问题的思路。
暴力法:
a. 最容易想到的一种方法,也就是每一个节点进行比对,该方法不会开辟额外的空间存储中间节点,但是由于每个节点比对,相当于循环m*n次,时间复杂度相对较高。
b. 该方法时间复杂度是,空间复杂度是;
Hash法:
a. 该方法将任意链表的节点遍历存储到Hash表中
b. 然后遍历另外一个链表节点,看是否在Hash表中存在,如果存在就是相交合并的节点
c. 如果遍历完成后,都没有相交节点,则两个链表无合并节点
该方法Hash表的快速查询特性,查询时间复杂度是O(1),两个链表遍历的时间复杂度是O(m+n),所以该方法的时间复杂度是,由于使用了Hash表存储一个链表的节点,所以它的空间复杂度是或者。
双指针法:
a. 该方法参考了LeetCode上的解题方法,很巧妙,代码很简单,有时候并不是解题逻辑多么困难,而是思路少,也就是见识少、思考少,做算法题还是很有意思的
b. 该方法定义两个指针,分别指向两个链表的头节点,两个指针同时移动遍历并比较指向节点,当遍历到链表最后一个节点时指针指向另一个链表的头节点继续遍历比较,如果没有合并节点,则这两个指针的遍历次数就是两个链表的长度之和,即m+n,最后两个指针会指向nvl,指向相同退出循环
该方法两个链表的每个节点遍历一次,所以时间复杂度是,空间复杂度是
ListNode节点
暴力法:
Hash法:
双指针法:
测试代码:
测试输出结果:
作业二:请画出DataNode服务器节点宕机的时候,HDFS的处理过程时序图
1. DataNode会在启动后向NameNode注册
2. DataNode每隔一段时间(3秒钟)向NameNode主动发送心跳,心跳会带着NameNode的命令
3. NameNode在超过一定时间(10分钟)未收到DataNode的心跳,就认为该DataNode出现问题
4. NameNode中存储着每个DataNode的文件块信息,NameNode找到该DataNode上的文件块信息及分布在哪些DataNode服务器上
5. NameNode向这些DataNode发送文件块复制命令,将文件块复制到指定的DataNode上
6. 当DataNode复制完成后,通知NameNode复制任务完成
评论