写点什么

链表交集问题与 DataNode 宕机 HDFS 处理时序

用户头像
garlic
关注
发布于: 2020 年 11 月 12 日
链表交集问题与DataNode宕机HDFS处理时序

链表交集

题目:

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

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



实现:


  1. 蛮力计算: 逐个获取链表 1 的节点,遍历链表 2 判断是否存在相同的节点,存在则返回, 不存在返回空。

时间复杂度 O(m*n)

空间复杂度 O(1)


public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {       if (headA == null || headB == null) return null;        ListNode pa = headA;        ListNode pb ;        while (pa != null){           pb = headB;            while (pb != null){                if (pa == pb){                    return pa;                }                pb = pb.next;            }           pa = pa.next;        }        return null;    }}
复制代码


  1. 通过 hash 值判断 将链表 1 中数据 hash 值计算出来存放到集合中, 同时顺序计算链表 2 的 hash 值如果存在标识存在交叉节点。

时间复杂度 O(m+n)

空间复杂度 O(max(m,n))


public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if (headA == null || headB == null) return null;        ListNode pa = headA;         HashSet<ListNode> hashA= new HashSet<ListNode>();        while (pa != null) {            hashA.add(pa);            pa = pa.next;        }        ListNode pb = headB;        while (pb != null){            if (hashA.contains(pb)){                return pb;            }            pb = pb.next;        }        return null;     }}
复制代码


  1. 对接链表 如果两个链表中存在相交的节点, 当链表遍历结束时,将指针一定到另外一个链表遍历, 如果存在相同节点,必在相同节点相遇, 没有的话在链表结尾处相遇。


public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if (headA == null || headB == null) return null;        ListNode pa = headA;         ListNode pb = headB;               while (pa != pb) {                        if (pa == null) {                pa = headB;            }            else {                pa = pa.next;            }                        if (pb == null){                pb = headA;            }            else {                pb = pb.next;            }                        }        return pa;     }}
复制代码


DataNode 宕机 HDFS 处理时序


HDFS 架构



DataNode 宕机处理时序


假设文件涉及文件块 BlockA, BlockB, 分别存放在 DataNode1,DataNode2, DataNode3 上



当 DadaNode3 节点出现故障, NameNode 查找 DataNode3 存储的 Block, 通知从其他拥有这些块的节进行复制。 这样保证其备份副本数量(这里是三个),不会因为节点宕机而减少。



参考及引用


架构师训练营作业-李智慧老师相关讲义

Photo by Tatiana Syrikova from Pexels


用户头像

garlic

关注

还未添加个人签名 2017.11.15 加入

还未添加个人简介

评论

发布
暂无评论
链表交集问题与DataNode宕机HDFS处理时序