为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

一个人的工作量太大了【精品文档】

2017-11-20 7页 doc 67KB 22阅读

用户头像

is_954223

暂无简介

举报
一个人的工作量太大了【精品文档】一个人的工作量太大了【精品文档】 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=伪随机序列(伪随机再散列)...
一个人的工作量太大了【精品文档】
一个人的工作量太大了【精品文档】 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 (1) 线型探测在散列: 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 a 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得到一个随机分配的ID; 2(通过A查找X中finger表中的finger[1].start到finger[k].start的successor 3(更新其他节点的finger表 退出算法: 假设退出节点X: 1( 找到X的predecessor,把负责的keys交给predecessor 找出predecessor的算法如下: def find_predessor(id,current) n=current; while(id!?(n ,n. successor ] )% 找到id 值落在n和它的successor之间的节点n. n = n .closest _ preceding _finger(id , n);%则节点n就是id的predecessor return n; def closet _ preceding _finger(id , node) for i =m downto 1 if(node < finger[i].node < id) return finger[i].node; return n; 2( Predecessor将它的successor设置为X的successor。 3( JOIN和LEAVE的代码类似于在一个普通链表上插入或删除元素,增加了在加入/离开节点及其邻居间 迁移数据。 (3)节点的更新算法: def update(node): for x in range(k):, 表中一行一行更新,从finger[1]从finger[k] oldEntry=node.finger[x] node.finger[x]=findNode(oldEntry,(node.id+(2**x)) % (2**k)) (4)CHARD缺点:Chord中的finger table link是单向的 改进:利用XOR来得到节点的距离(distance metric),算法如下: def distance(a, b): return a^b # In Python, this means a XOR b, # not a to the power of b. XOR得到的distance metric是蛮好的,因为它具有对称性。即distance (A,B)==distance(B,A), 如果A在B的finger table中,B必然也在A的finger table中。这意味着节点可以通过记录 那些查询本节点的节点的地址来刷新自己的finger table,能大大降低用于节点刷新的流量。 5.pastry:把节点数减低(log2N) 节点加入操作的复杂度为O(log2bN) 下周的计划:充分理解pastry算法:写出相关的算法:
/
本文档为【一个人的工作量太大了【精品文档】】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索