HRW会åˆåœ¨ä¸€èµ·è®°å½•æ—¥å¿—时间å—?

时间:2014-12-13 11:10:37

标签: algorithm hash hashtable distributed asymptotic-complexity

Rendezvous hashing (Highest Random Weight "HRW")的维基百科页é¢æ出以下声明:

  

虽然å¯èƒ½é¦–先看到HRW算法在O(n)时间è¿è¡Œï¼Œä½†äº‹å®žå¹¶éžå¦‚此。这些站点å¯ä»¥æŒ‰å±‚次结构进行组织,并且HRW应用于æ¯ä¸ªçº§åˆ«ï¼Œå› ä¸ºå®ƒä¼šé™ä½Žå±‚次结构,导致O(log n)è¿è¡Œæ—¶é—´ï¼Œå¦‚。[7]

我得到了å‚考文件的副本,"基于哈希的移动Ad-hoc网络中å¯æ‰©å±•ä½ç½®æœåŠ¡çš„虚拟层次结构。"但是,他们的论文中引用的层次结构似乎éžå¸¸ç‰¹å®šäºŽå…¶åº”用程åºåŸŸã€‚æ®æˆ‘所知,没有明确说明如何推广该方法。维基百科的评论使得日志 似乎是一般情况。

我看了几个一般的HRW实现,但它们似乎都没有比线性时间更好的支æŒã€‚我给了它一些想法,但我没有看到任何方法æ¥åˆ†å±‚组织网站,而ä¸ä¼šå¯¼è‡´çˆ¶èŠ‚点在退出时导致低效的é‡æ–°æ˜ å°„,从而大大打败了HRW的主è¦ä¼˜åŠ¿ã€‚

有人知é“怎么åšå—?或者,维基百科是ä¸æ­£ç¡®çš„,在日志时间有一般的方法æ¥å®žçŽ°è¿™ä¸ªï¼Ÿ

编辑:调查mcdowella的方法:

好的,我想我知é“这是如何起作用的。但是你需è¦æ¯”你指定的更多一点。

如果您åªæ˜¯æ‰§è¡Œäº†æ‚¨æ‰€æ述的内容,那么您会é‡åˆ°æ¯ä¸ªå¶å­å¯èƒ½åªæœ‰é›¶ä¸ªæˆ–一个节点的情况,并且å¶å­ä¸­æœ‰å¤šå°‘个节点存在显ç€å·®å¼‚ - 最多的å­æ ‘。如果您在æ¯ä¸ªçº§åˆ«ä½¿ç”¨HRW进行交æ¢ï¼Œåªéœ€å°†æ•´ä¸ªäº‹ç‰©è®¾ç½®ä¸ºå¸¸è§„æœç´¢æ ‘,您就会获得完全相åŒçš„效果。从本质上讲,您已ç»å®žçŽ°äº†ä¸€è‡´æ€§æ•£åˆ—,以åŠå­˜å‚¨æ¡¶ä¹‹é—´ä¸å‡ç­‰è´Ÿè½½çš„缺陷。计算组åˆæƒé‡ï¼ŒHRW的定义实施,没有增加任何内容;你最好åªæ˜¯åœ¨æ¯ä¸ªçº§åˆ«è¿›è¡Œæœç´¢ï¼Œå› ä¸ºå®ƒå¯ä»¥èŠ‚çœæ•£åˆ—,并且å¯ä»¥åœ¨ä¸å¾ªçŽ¯æ¯ä¸ªåŸºæ•°å€¼çš„情况下实现

虽然å¯ä»¥è§£å†³è¿™ä¸ªé—®é¢˜ï¼šä½ åªéœ€è¦åœ¨æœ€åŽä¸€çº§ä½¿ç”¨HRW从众多选择中进行选择。也就是说,您需è¦å°†æ‰€æœ‰å¶èŠ‚点放在大桶中,这与您在一致散列中具有的副本数é‡ç›¸å½“。这些大型水桶应相互大致相等,然åŽæ‚¨ä½¿ç”¨HRW选择特定的站点。由于存储桶大å°æ˜¯å›ºå®šçš„,这是一个O(n)算法,我们得到了所有关键的HRW属性。

è€å®žè¯´ï¼Œæˆ‘认为这是值得怀疑的。它ä¸æ˜¯HRW的实现,因为它åªæ˜¯å°†HRW与一致的散列相结åˆã€‚我猜这有什么ä¸å¯¹ï¼Œåœ¨æŸäº›æƒ…况下甚至å¯èƒ½æ¯”使用å¤åˆ¶å“的常用技术更好。但我认为说明HRW是log(n)是错误的,如果这实际上是作者的æ„æ€ã€‚

此外,原始æ述也值得怀疑。你ä¸éœ€è¦åœ¨æ¯ä¸ªçº§åˆ«ç”³è¯·HRW,你ä¸åº”该这样åšï¼Œå› ä¸ºè¿™æ ·åšæ²¡æœ‰ä»»ä½•å¥½å¤„;你应该快速åšä¸€äº›äº‹æƒ…(比如索引),然åŽç”¨HRWåšæœ€åŽçš„选择。

这真的是我们能åšçš„最好的,还是有其他方法æ¥åˆ¶ä½œHRW O(log(n))?

4 个答案:

答案 0 :(得分:1)

如果给æ¯ä¸ªç«™ç‚¹ä¸€ä¸ªè¶³å¤Ÿé•¿çš„éšæœºid,用基数k表示(å¯èƒ½æ˜¯é€šè¿‡æ•£åˆ—éžéšæœºid),那么你å¯ä»¥å°†ç«™ç‚¹ä¸Žä¸€æ£µæ ‘çš„å¶å­ç›¸å…³è”,这棵树在æ¯ä¸ªèŠ‚点最多有k个åŽä»£ã€‚无需将任何站点与树的内部节点相关è”。

è¦ç¡®å®šå­˜å‚¨é¡¹ç›®çš„ä½ç½®ï¼Œè¯·ä½¿ç”¨HRW从树的根部å‘下计算在树节点处分支的方å¼ï¼Œåœ¨åˆ°è¾¾ä¸Žç«™ç‚¹å…³è”çš„å¶å­æ—¶åœæ­¢ã€‚您å¯ä»¥æ‰§è¡Œæ­¤æ“作,而无需与任何站点通信,直到您确定è¦å°†é¡¹ç›®å­˜å‚¨åœ¨å“ªä¸ªç«™ç‚¹ - 您需è¦çŸ¥é“的是构建树的站点的散列ID。

由于网站åªä¸Žæ ‘å¶ç›¸å…³è”,因此树的内部节点无法退出,除éžä¸Žå…¶ä¸‹çš„æ ‘å¶ç›¸å…³çš„所有网站都退出,此时它将å˜å¾—无关紧è¦ã€‚

答案 1 :(得分:1)

我没有购买更新åŽçš„答案。当您比较分支的æƒé‡è€Œä¸æ˜¯æ‰€æœ‰ç½‘站的æƒé‡æ—¶ï¼ŒHRW有两个很好的属性似乎会丢失。

一个是您å¯ä»¥é€‰æ‹©å‰n个站点而ä¸ä»…仅是主站点,这些站点应该是éšæœºåˆ†å¸ƒçš„。如果您è¦ä¸‹é™åˆ°å•ä¸ªæ ‘中,则å‰n个站点将在树中彼此é è¿‘。这å¯ä»¥é€šè¿‡ä½¿ç”¨ä¸åŒçš„ç›ä¸‹é™å¤šæ¬¡æ¥ä¿®å¤ï¼Œä½†è¿™ä¼¼ä¹Žæ˜¯å¾ˆå¤šé¢å¤–的工作。

两个是显而易è§çš„是添加或删除网站时å‘生的情况,åªæœ‰1 / |网站|在添加的情况下,数æ®ç§»åŠ¨ã€‚如果修改现有树,则仅影å“对等站点。在添加的情况下,移动的唯一数æ®æ¥è‡ªæ·»åŠ çš„站点的新对等体。在删除的情况下,该站点上的所有数æ®çŽ°åœ¨éƒ½ç§»åŠ¨åˆ°å‰ä¸€ä¸ªå¯¹ç­‰ä½“。如果您é‡æ–°è®¡ç®—树,则所有数æ®éƒ½å¯ä»¥æ ¹æ®æ ‘的构造方å¼ç§»åŠ¨ã€‚

答案 2 :(得分:0)

我认为您å¯ä»¥ä½¿ç”¨é€šå¸¸ç”¨äºŽä¸€è‡´æ€§å“ˆå¸Œçš„相åŒâ€œè™šæ‹ŸèŠ‚点â€æ–¹æ³•ã€‚å‡è®¾æ‚¨æœ‰ N 物ç†èŠ‚点,其ID为:

{n1,...,nN}.

选择 V ,æ¯ä¸ªç‰©ç†èŠ‚点的虚拟节点数,并生æˆæ–°çš„ID列表:

{n1v1,v1v2,...,n1vV
,n2v1,n2v2,...,n2vV
,...
,nNv1,nNv2,...,nNvV}.

将这些安排到固定但éšæœºåŒ–的二å‰æ ‘çš„å¶å­ä¸­ï¼Œå¹¶åœ¨å†…部节点上标记。例如,这些内部标签å¯ä»¥æ˜¯å…¶å­èŠ‚点标签的串è”。

è¦é€‰æ‹©ä¸€ä¸ªç‰©ç†èŠ‚点æ¥å­˜å‚¨å¯¹è±¡ O ,请从根目录开始,然åŽé€‰æ‹©å…·æœ‰è¾ƒé«˜å“ˆå¸Œ H(标签,O)的分支。é‡å¤è¿™ä¸ªè¿‡ç¨‹ï¼Œç›´åˆ°ä½ åˆ°è¾¾ä¸€ç‰‡å¶å­ã€‚将对象存储在该å¶å­ä¸Šä¸Žè™šæ‹ŸèŠ‚点对应的物ç†èŠ‚ç‚¹ä¸Šã€‚è¿™éœ€è¦ O(log(NV))= O(log(N)+ log(V))= O(log(N))步骤(因为V是常数)。

如果物ç†èŠ‚点å‘生故障,则该节点上的对象将被é‡æ–°æ•£åˆ—,跳过没有活动å¶å­çš„å­æ ‘。

答案 3 :(得分:0)

在日志时间内实现HRW集åˆæ•£åˆ—的一ç§æ–¹æ³•

在O(log N)中实现集åˆæ•£åˆ—的一ç§æ–¹æ³•ï¼Œå…¶ä¸­N是缓存节点的数é‡ï¼š

å为Fçš„æ¯ä¸ªæ–‡ä»¶éƒ½ç¼“存在å为C的缓存节点中,æƒé‡w(F,C)最大,这与集åˆæ•£åˆ—中的正常情况一样。

首先,我们使用éžæ ‡å‡†å“ˆå¸Œå‡½æ•°w(),如下所示:

w(F,C)= h(F)x或h(C)。

其中h()是一些很好的哈希函数。

树构造

给定一个å为F的文件,而ä¸æ˜¯ä¸ºæ¯ä¸ªç¼“存节点计算w(F,C) - æ¯ä¸ªæ–‡ä»¶éœ€è¦O(N)时间 - 我们åªæ ¹æ®ç¼“存节点的散列åh(C)预先计算二å‰æ ‘; 一棵树让我们找到æ¯ä¸ªæ–‡ä»¶çš„O(log N)时间内最大w(F,C)值的缓存节点。

æ ‘çš„æ¯ä¸ªå¶å­åŒ…å«ä¸€ä¸ªç¼“存节点的å称C. 树的根(深度为0)指å‘2个å­æ ‘。 h(C)的最高ä½ä¸º0的所有å¶å­éƒ½åœ¨æ ¹çš„å·¦å­æ ‘中; h(C)的最高ä½ä¸º1的所有å¶å­éƒ½åœ¨æ ¹çš„å³å­æ ‘中。 根节点的两个å­èŠ‚点(深度为1)处ç†h(C)的下一个最é‡è¦çš„ä½ã€‚ ä¾æ­¤ç±»æŽ¨ï¼Œæ·±åº¦D处的内部节点处ç†h(C)的D最高ä½ã€‚ 使用良好的散列函数,从根开始的æ¯ä¸ªæ­¥éª¤å¤§çº¦å°†æ‰€é€‰å­æ ‘中的候选缓存节点å‡åŠï¼Œ 所以我们最终得到一棵大约ln_2 N的树。 (如果我们最åŽå¾—到一棵树,那就是"太ä¸å¹³è¡¡ï¼†ï¼ƒ34; 在我们将任何文件添加到缓存之å‰ï¼Œä»¥æŸç§æ–¹å¼è®©æ¯ä¸ªäººéƒ½åŒæ„æŸäº›universal hashing familyé‡å»ºæ ‘çš„ä¸åŒå“ˆå¸Œå‡½æ•°ï¼Œç›´åˆ°æˆ‘们得到一个ä¸å¤ªå¹³è¡¡çš„树#34;)。 / p>

一旦构建了树,无论åŽæ¥é‡åˆ°å¤šå°‘文件å,我们都ä¸éœ€è¦æ›´æ”¹å®ƒã€‚ 我们åªåœ¨ä»Žç³»ç»Ÿæ·»åŠ æˆ–删除缓存节点时æ‰æ›´æ”¹å®ƒã€‚

文件å查找

对于æ°å¥½æ•£åˆ—为h(F)= 0(全零ä½ï¼‰çš„文件åF, 我们通过从根开始找到具有最高æƒé‡ï¼ˆå¯¹äºŽè¯¥æ–‡ä»¶å)的缓存节点,并且在å¯èƒ½çš„情况下始终采用正确的å­æ ‘。 如果这导致我们到一个没有正确å­æ ‘的内部节点,那么我们采用它的左å­æ ‘。 继续,直到我们到达没有左或å³å­æ ‘的节点 - å³åŒ…å«æ‰€é€‰ç¼“存节点Cçš„å称的å¶èŠ‚点。

当查找å为F的其他文件时,首先我们将其å称哈希以获得h(Fï¼‰ï¼Œç„¶åŽ æˆ‘ä»¬ä»Žæ ¹å¼€å§‹å¹¶åˆ†åˆ«å‘å³æˆ–å‘左(如果å¯èƒ½ï¼‰ç”±h(F)中的下一ä½ç¡®å®šä¸º0或1。

由于树(通过施工)ä¸æ˜¯ï¼†ï¼ƒ34;太ä¸å¹³è¡¡ï¼†ï¼ƒ34;, é历整个树从根到包å«æ‰€é€‰ç¼“存节点Cçš„å称的å¶å­åœ¨æœ€å的情况下需è¦O(ln N)时间。

我们希望对于一组典型的文件å, 哈希函数h(F)"éšæœºï¼†ï¼ƒ34;在树的æ¯ä¸ªæ·±åº¦é€‰æ‹©å·¦æˆ–å³ã€‚ 由于树(通过施工)ä¸æ˜¯'#34;太ä¸å¹³è¡¡ï¼†ï¼ƒ34;, 我们希望æ¯ä¸ªç‰©ç†ç¼“存节点缓存大致相åŒæ•°é‡çš„文件(大约4个左å³ï¼‰ã€‚

退出效果

当æŸä¸ªç‰©ç†ç¼“存节点出现故障时, æ¯ä¸ªäººéƒ½ä»Žå…¶æ ‘的副本中删除相应的å¶èŠ‚点。 (æ¯ä¸ªäººä¹Ÿåˆ é™¤æ¯ä¸ªå†…部节点,然åŽæ²¡æœ‰å¶å­åŽä»£ï¼‰ã€‚ 这并ä¸éœ€è¦ç§»åŠ¨ä»»ä½•å…¶ä»–缓存节点上缓存的任何文件 - 它们ä»ç„¶æ˜ å°„到它们始终执行的相åŒç¼“存节点。 (无论该树中有多少其他节点被删除,树中最å³è¾¹çš„å¶èŠ‚点ä»ç„¶æ˜¯è¯¥æ ‘中最å³è¾¹çš„å¶èŠ‚点。)

例如,

   ....
     \
      |
     / \
    |   |
   /   / \
  |   X   |
 / \     / \
V   W   Y   Z

使用这个O(log N)算法,当缓存节点X死亡时,å¶å­X从树中删除,并且其所有文件(希望相对å‡åŒ€åœ°ï¼‰åˆ†å¸ƒåœ¨Yå’ŒZ之间 - 没有æ¥è‡ªX端的文件在V或W或任何其他缓存节点。 之å‰è¿›å…¥ç¼“存节点V,W,Y,Z的所有文件继续转到那些相åŒçš„缓存节点。

è¾å­¦åŽ

é‡æ–°å¹³è¡¡

许多缓存节点å‘生故障或新缓存节点添加或两者都å¯èƒ½ä½¿æ ‘“太ä¸å¹³è¡¡â€ï¼ƒ34; 在我们将一堆文件添加到缓存之åŽï¼Œé€‰æ‹©ä¸€ä¸ªæ–°çš„哈希函数是一个很大的麻烦,所以ä¸æ˜¯åƒæˆ‘们在最åˆæž„建树时那样选择一个新的哈希函数,也许最好以æŸç§æ–¹å¼é‡æ–°å¹³è¡¡æ ‘通过删除几个节点,用一些新的åŠéšæœºå称é‡å‘½å它们,然åŽå°†å®ƒä»¬æ·»åŠ å›žç³»ç»Ÿã€‚ é‡å¤ï¼Œç›´åˆ°ç³»ç»Ÿä¸å†â€œå¤ªä¸å¹³è¡¡â€ä¸ºæ­¢ã€‚ (从最ä¸å¹³è¡¡çš„节点开始 - 缓存最少é‡æ•°æ®çš„节点)。

评论

P.S .: 我认为这å¯èƒ½ä¸Žmcdowella的想法éžå¸¸æŽ¥è¿‘, 但是填写了更多细节以澄清(a)是,它是log(N),因为它是一个二元树,它ä¸æ˜¯å¤ªä¸å¹³è¡¡ï¼†ï¼ƒ34;,(b)它没有&#t;有"副本",以åŠï¼ˆc)当一个缓存节点出现故障时,它ä¸éœ€è¦é‡æ–°æ˜ å°„ä¸åœ¨è¯¥ç¼“存节点上的文件。

p.p.s .: 我éžå¸¸ç¡®å®šç»´åŸºç™¾ç§‘页é¢é”™è¯¯åœ°æš—示在O(log N)时间内å‘生了集åˆæ•£åˆ—的典型实现,其中N是缓存节点的数é‡ã€‚ 在我看æ¥ï¼ˆæˆ‘怀疑哈希的原始设计者),(在内部,没有通信)é‡æ–°è®¡ç®—网络中æ¯ä¸ªèŠ‚点的哈希所花费的时间将是微ä¸è¶³é“的,并且ä¸å€¼å¾—担心。从æŸä¸ªè¿œç¨‹ç¼“存节点获å–æ•°æ®æ‰€éœ€çš„时间。

我的ç†è§£æ˜¯ï¼Œé›†åˆæ•£åˆ—几乎总是使用简å•çš„线性算法实现,该算法使用O(N)时间,其中N是缓存节点的数é‡ï¼Œæ¯æ¬¡æˆ‘们获得新的文件åF并且想è¦é€‰æ‹©ç¼“存节点该文件。

è¿™ç§çº¿æ€§ç®—法的优点是它å¯ä»¥ä½¿ç”¨æ›´å¥½çš„"哈希函数比上é¢çš„基于xorçš„w(),所以当一些物ç†ç¼“存节点死亡时,所有在现在死节点上缓存的文件都应该在所有剩余节点之间å‡åŒ€åˆ†å¸ƒã€‚