- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.dht 优点: 一个人的工作量太大了,按一定的方法把他的工作分配很多人一起做。
分配方法:就是dht的几种算法。
2.hash 表:查找速度更快!
Hash表的构造:除余法:例如H(k)=k mod 10
会有冲突:
解决冲突的方法:
1.链地址法:
2.开放地址法:Hi(k)=(H(k)+di)mod m
(1)di=1,2,3,…(线性探测再散列)
(2) di=1^2,(-1)^2,2^2,(-2)^2…(二次探测再散列)
(3) di=伪随机序列(伪随机再散列)
例:keys为(32,13,49,55,22,38,21),m为7
线型探测在散列:
32 MOD 7 = 4 存入地址空间4;
13 MOD 7 =6 存入地址空间6;
49 MOD 7 = 0 存入地址空间0;
55 MOD 7 = 6 发生冲突,处理冲突如下:
下一个存储地址为(6+1) MOD 7 = 0 仍然冲突
在下一个存储地址为(6+2) MOD 7 = 1 不冲突,存入地址空间1;
22 MOD 7 = 1 发生冲突,处理冲突如下:
下一个存储地址为(1+1)MOD 7 = 2 不冲突,存入地址空间2;
38 MOD 7 =3 存入地址空间 3;
21 MOD 7 = 0 冲突,
(0+1)MOD 7 = 1,冲突
(0+2)MOD 7 =2 冲突
(0+3)MOD 7 =3 冲突
(0+4)MOD 7 =4 冲突
(0+5)MOD 7 =5 不冲突,存入地址空间5
已经建立HASH表,用关键字K来查询K的数据元素:
根据K值求它的哈希地址,即H(k),然后根据H(k)找出哈希地址如果为空,则查找失败,若不为空,将K与该单元的关键字相比较,若两者相等,则查找成功,若不相等,则按照构造hash表的方法,继续在“下一个存储地址”中查找。
3.dht的一般算法:环内按着succesor来查找。缺点:跳数太多(N/2,其中N为在环内
节点的数量)如果节点失败,就不能往下走。
Key的加入:
找到Key(看作ID)的Successor算法(就是找到负责Key的节点):
def findNode(start, key):
current=start
while distance(current.id, key) \
distance(current.next.id, key):
current=current.next % while完成的功能是:current与key的差值最小。
return current
def distance(a, b):
if a==b:
return 0
elif ab:
return b-a;
else:
return (2**k)+(b-a);% a和b的差值。
4.chord:把跳数减低(log2N)
succesor:D与本节点ID最接近、且大于本节点ID的节点。
(1)Key的加入:
即怎么根据环中的任意一个节点stard开始来找负责key的节点:(例如:从节点1找负责key7的节点)
def lookup(start, key):
current=findFinger(start, key)%current为节点6
next=findFinger(current, key)%next为节点0
while distance(current.id, key) distance(next.id, key):
current=next
next=findFinger(current, key)%如此反复,直到找到负责key7的节点为节点0
return current
在节点node的finger表中查找与key值最接近的节点
def findFinger(node, key):
current=node
for x in range(k):%从finger表中finger[1]到finger[k]查找。
If distance(current.id, key) distance(node.finger[x].id, key):
current=node.finger[x]%如果找到与key值最接近的id的节点(即key的succesor)
return current
(2)节点加入和退出:(值得注意的是节点的加入和退出与key的加入和退出是独立的)
加入算法:
节点X利用任意一个节点A加入环中:
1.X得到一个随机分配的I
文档评论(0)