写点什么

架构师训练营 1 期 -- 第八周作业

用户头像
曾彪彪
关注
发布于: 2020 年 11 月 13 日

作业一:

(至少完成一个)

有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。

请用代码(或伪代码)描述算法,并给出时间复杂度。



答:使用Python实现,代码如下:

import math
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def check_linked_list(list_1, list_2):
"""
检查两个链表是否相交,思路是遍历两个节点,获取他们的长度,并判断最后一个节点是否相同。如果最后一个节点相同,则链表相交。
然后找出相交节点,计算两个链表的[长度差],将长链表节点后移[长度差]位后,依次比较节点是否相同,第一个相同的节点几位相交节点。
:param list_1:
:param list_2:
:return:
"""
# 计算两个链表长度以及最后一个节点
length_1 = 0
length_2 = 0
last_node_1 = Node
last_node_2 = Node
# 计算链表1长度以及最后节点
current_node = list_1.head
while current_node:
length_1 = length_1 + 1
if current_node.next is None:
last_node_1 = current_node
current_node = current_node.next
# 计算链表2长度以及最后节点
current_node = list_2.head
while current_node:
length_2 = length_2 + 1
if current_node.next is None:
last_node_2 = current_node
current_node = current_node.next
# 如果最后节点相同,则链表相交,否则不相交
if last_node_1 == last_node_2:
print('链表相交')
node_1 = list_1.head
node_2 = list_2.head
# 求长度差length_diff
length_diff = int(math.fabs(length_1 - length_2))
# 将长的链表后移length_diff位
if length_1 > length_2:
for i in range(length_diff):
node_1 = node_1.next
else:
for i in range(length_diff):
node_2 = node_2.next
# 找出相交节点,如果两个链表节点相同,则为相交节点,退出循环。
while node_1 and node_2:
if node_1 is node_2:
print('链表相交节点【', node_1.data, '】')
break
node_1 = node_1.next
node_2 = node_2.next
else:
print('链表不相交')
pass
def construct_linked_list():
node_a = Node('a')
node_b = Node('b')
node_d = Node('d')
node_e = Node('e')
node_f = Node('f')
node_x = Node('x')
node_y = Node('y')
node_z = Node('z')
node_a.next = node_b
node_b.next = node_x
node_x.next = node_y
node_y.next = node_z
node_d.next = node_e
node_e.next = node_f
node_f.next = node_x
list_1 = LinkedList()
list_1.head = node_a
list_2 = LinkedList()
list_2.head = node_d
return list_1, list_2
def print_list(list):
current_node = list.head
while current_node:
print(current_node.data, end='\t')
current_node = current_node.next
print()
if __name__ == '__main__':
list_1, list_2 = construct_linked_list()
print('链表信息:')
print_list(list_1)
print_list(list_2)
check_linked_list(list_1, list_2)
pass

在执行过程中,因为分别只对两个链表进行了两次遍历,所以时间复杂度是O(n),没有使用额外的数组或链表,空间复杂度为O(1)。执行结果如下:



请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图。



处理流程如下:

  1. Data Node1 一段时间内未发送心跳

  2. Name Node判断Data Node1掉线

  3. Name Node收到Data Node2的心跳,判断Data Node2否包含Data Node1中的数据块。

  4. Name Node回复Data Node2,要求Data Node2复制数据块到其它节点。

  5. Data Node2 复制数据块到Data Node 3。

  6. Data Node2 复制数据块到Data Node4。因为可能包含多个数据块,所以数据块可能被复制到多个数据节点上。

  7. 收到其它数据节点心跳,并重复步骤3-6。

用户头像

曾彪彪

关注

还未添加个人签名 2019.03.23 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 1 期 -- 第八周作业