架構師訓練營第 1 期 - 第 08 周作業
作業一
有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。请用代码(或伪代码)描述算法,并给出时间复杂度。
Code
Output
說明
利用 python 模擬
演算法一
_find_merge_node_alg1(...)
暴力法:
遍尋兩個單向鏈表
最差時間複雜度 O( M x N)
空間複雜度: 沒有多使用其他空間
為 O(1)
演算法二
_find_merge_node_alg2(...)
利用 stack 反向查找
先將兩個鏈表分別推入兩個 stack 中
同時 pop 兩個 stack,直到第一個不同點
則前一個 pop 的點,即為合併點
最差時間複雜度 O ( N + 2 M)
假設 M < N
推入兩個 stack 需遍尋兩個鏈表,所以為 O(N + M)
此為一定要做的,屬於固定開銷
同時 pop,最差為找不到,短鏈表已經查完,所以為 O(M)
結合兩者 O (N + 2M)
空間複雜度,需增加兩個與鏈表同長之 stack
為 O (N + M)
分析
當鏈表較短且有合併時,演算法一會比較有利
因為演算法二有固定開銷,就是推入 stack
當鏈表很長時且兩者沒有合併,演算法二會比較有利
N x M 會遠大於 N + 2M
作業二
请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图。
時序圖
說明
每一個 DataNode 均會定期的向 NameNode 作 Heartbeat 回報狀況
當某一 DataNode (例如 DataNode 1) 超過一定時間段 (例如 10 次應回報時間)時,NameNode 會發起 recheck 的要求
當 DataNode 沒有回應兩次的 recheck 要求,NameNode會進入 Fail recover 階段
整理在 faile DataNode 上所有的 data block 有哪些
確定那些 data block 沒有達到系統規定的副本個數要求,並決定那些 DataNode 需要執行複製
當正常 DataNode 作 Heartbeat 回報時,分配需要複製的 data blocks 並下命令給 DataNode進行複製
收到命令的 DataNode會進行 data blocks 的複製
接收 data block 的 DataNode 會利用定期的 Heartbeat 進行回報
版权声明: 本文为 InfoQ 作者【Panda】的原创文章。
原文链接:【http://xie.infoq.cn/article/db21625831c37f13f47fc5a0c】。未经作者许可,禁止转载。
评论