极客大学 - 架构师训练营 第八周作业
作业一
链表算法题
要求: 有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。
请用代码(或伪代码)描述算法,并给出时间复杂度。
题解:
我们可以利用双指针的解法来解答此题,两个指针p1
和p2
,起始时p1
指向headA
, p2
指向headB
。headA
是linked_list1
的头指针,而headB
是linked_list2
的头指针。假设linked_list1
和linked_list2
有重合,那么每个node
的访问顺序如下:
a -> b -> x -> y -> z -> null -> d -> e -> f -> x -> y -> z -> null
d -> e -> f -> x -> y -> z -> null -> a -> b -> x -> y -> z -> null
这样只需要循环遍历两个链表,每个链表各走一次,当两个指针都指向同一个节点的时候,退出循环即可。如果两个链表没有相交节点,那么当两个指针都为null
的时候,循环结束。
时间复杂度: O(N), 因为只需要遍历每个链表各一次
空间复杂度: O(1), 只需要两个指针来保存当前节点 (两个链表的空间不算)
代码:
Python 3.7, virtual environment
ListNode.py: 定义节点
NodeIntersection.py: 定义查找intersection的方法类
测试结果:
HDFS时序图
要求:请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图
首先我们来看看HDFS的架构图
如何判断HDFS的DataNode失效:
DataNode会通过心跳和NameNode保持通信,如果DataNode超时未发送心跳(3秒),NameNode就会认为这个DataNode已经宕机失效,立即查找这个DataNode上存储的数据块有哪些,以及这些数据块还存储在哪些服务器上,随后通知这些服务器再复制一份数据块到其他服务器上,保证HDFS存储的数据块备份数符合用户设置的数目,同步完后,NameNode修改fsimage中的节点信息以便下一个block传输,即使再出现服务器宕机,也不会丢失数据。
版权声明: 本文为 InfoQ 作者【9527】的原创文章。
原文链接:【http://xie.infoq.cn/article/899ff8494b38f20a23604df3a】。文章转载请联系作者。
评论