DataNode 及单链表合并遍历

用户头像
Lane
关注
发布于: 2020 年 07 月 28 日

一、分布式文件系统HDFS

这种架构同时满足了,高性能(几千台服务器同时提供服务,同时读同时写),高可用(部分DataNode坏掉了可以及时的恢复数据),数据自动跨服务器,跨机架自动备份三个副本。文件的大小没有上限。



1.NomeNode

它是做源数据控制的,也就是操作系统文件控制块儿的角色,记录数据的文件名,创建者修改时间等等

2.DataNodes

数据块儿存在这里,DataNode是服务器。

一个数据块儿会跨服务器,跨机架存储三份儿,通过这种形式达到了高可以。



1.当一个DataNode启动了之后会向NameNode注册,也就是NameNode会知道新启动了一个DataNode

2.DataNode会向NameNode定时发送心跳,当么有心跳超时的时候,NameNode就会判定某个DataNode坏掉了。

3.这个时候NameNode就会检查坏掉的这台服务器上存储的数据块儿有哪些

4.再去检查这些数据块儿的备份块儿在哪些服务器上

5.检查到之后,通知这些有备份数据块儿的服务器,让他们把数据块儿保存到其它的服务器上。然后服务器之间会自动执行复制。

6.最后每个数据块儿会恢复成3个备份

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



二、单链表合并

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

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





查找合并元素的时间负载度为O(m*n) = O(n^2),空间复杂度为O(m+n)因为是俩链表儿,消耗内存空间最大的就是俩链表儿。

package singledemo
import (
"fmt"
"testing"
)
type Node struct {
Data string //定义数据域
Next *Node //定义地址域(指向下一个结点的地址)
}
type List struct {
headNode *Node //头结点
}
//判断链表是否为空
func (this *List) IsEmpty() bool {
//判断单链表是否为空,只需要判断头节点是否为空即可
if this.headNode == nil {
return true
} else {
return false
}
}
func (this *List) Append(data string) {
//创建一个新元素,通过传入data参数进行数据域的赋值
node := &Node{Data: data, Next: nil} //通过Node结构体创建对象并获取对象的地址
if this.IsEmpty() {
//如果该链表为空,那么直接将新元素作为头节点
this.headNode = node
} else { //如果链表不为空
cur := this.headNode //定义一个变量用于存储头节点
for cur.Next != nil { //判断是否为尾节点,如果为nil,则该节点是尾节点
cur = cur.Next //链表进行位移,直到cur获取到尾节点
}
cur.Next = node //此时cur为尾节点,将其地址指向新创建的节点的地址
}
}
func (this *List) ShowList() {
//if !this.IsEmpty() {
cur := this.headNode
for cur != nil {
fmt.Printf("\t%v", cur.Data)
cur = cur.Next
}
//}
}
func TestSingleLinkMerge(t *testing.T) {
link1 := List{}
link1.Append("a")
link1.Append("b")
link1.Append("x")
link1.Append("y")
link1.Append("z")
link2 := List{}
link2.Append("d")
link2.Append("e")
link2.Append("f")
link2.Append("x")
link2.Append("y")
link2.Append("z")
cur1 := link1.headNode
for cur1 != nil {
fmt.Printf("\n l1.cur.data = %v", cur1.Data)
cur1 = cur1.Next
ifRepeat := false
cur2 := link2.headNode
for cur2 != nil {
fmt.Printf("\n l2.cur.data = %v", cur2.Data)
if cur1.Data == cur2.Data {
ifRepeat = true
break
}
cur2 = cur2.Next
}
if ifRepeat {
fmt.Printf("\n find repeat data is %v", cur2.Data)
break
}
}
}

执行的结果如下:



用户头像

Lane

关注

还有梦想 2018.07.05 加入

还未添加个人简介

评论

发布
暂无评论
DataNode及单链表合并遍历