Algorithm HRW会合散列在日志时间?

Algorithm HRW会合散列在日志时间?,algorithm,hash,hashtable,distributed,asymptotic-complexity,Algorithm,Hash,Hashtable,Distributed,Asymptotic Complexity,的维基百科页面声明如下: 虽然HRW算法可能在O(n)时间内运行,但情况并非如此。这些站点可以按层次结构进行组织,并且在每个层次上应用HRW,以降低层次结构,从而导致O(logn)运行时间,如[7]所示 我得到了一份参考论文的副本,“移动自组织网络中可伸缩位置服务的基于哈希的虚拟层次结构”。然而,他们论文中引用的层次结构似乎非常特定于他们的应用领域。据我所知,没有明确的迹象表明如何推广这种方法。维基百科的评论让人觉得log是一般情况 我看了一些常规的HRW实现,它们似乎都不支持比线性时间更好的东

的维基百科页面声明如下:

虽然HRW算法可能在O(n)时间内运行,但情况并非如此。这些站点可以按层次结构进行组织,并且在每个层次上应用HRW,以降低层次结构,从而导致O(logn)运行时间,如[7]所示

我得到了一份参考论文的副本,“移动自组织网络中可伸缩位置服务的基于哈希的虚拟层次结构”。然而,他们论文中引用的层次结构似乎非常特定于他们的应用领域。据我所知,没有明确的迹象表明如何推广这种方法。维基百科的评论让人觉得log是一般情况

我看了一些常规的HRW实现,它们似乎都不支持比线性时间更好的东西。我对此进行了一些思考,但我认为没有任何方法可以在不导致父节点退出时导致低效的重新映射的情况下分层组织站点,这大大挫败了HRW的主要优势

有人知道怎么做吗?另外,维基百科关于在日志时间内实现这一点的一般方法是否不正确

编辑:调查麦克道拉的方法:

好吧,我想我明白这是怎么回事了。但你需要比你指定的多一点

如果你只是按照你所描述的去做,你会遇到这样一种情况:每个叶可能只有零个或一个节点,并且叶子树中的节点数量存在显著差异。如果你在每一个层次上使用HRW,而只是把整个事情变成一个常规的搜索树,你会得到完全相同的效果。本质上,您已经实现了一致散列,同时还存在一个缺陷,即bucket之间的加载不相等。计算组合权重(定义HRW的实现)不会增加任何内容;您最好只在每个级别进行搜索,因为这样可以省去哈希运算,并且可以在不循环每个基数值的情况下实现

但这是可以解决的:你只需要在最后一级使用HRW从许多备选方案中进行选择。也就是说,您需要所有叶节点都位于大型存储桶中,与一致散列中的副本数量相当。这些大铲斗的装载量应该大致相等,然后使用HRW选择特定的站点。由于bucket大小是固定的,这是一个O(n)算法,我们得到了所有关键的HRW属性

老实说,我认为这是相当值得怀疑的。与其说它是HRW的一个实现,不如说它只是将HRW与一致性散列相结合。我想这没什么错,在某些情况下,它甚至可能比使用复制品的常规技术更好。但是我认为,如果说HRW是log(n)的话,那么这是误导,如果这是作者的意思的话

此外,原始描述也有问题。你不需要在每一个层次上应用人力资源管理,你也不应该,因为这样做没有好处;你应该做一些快速的事情(比如索引),并使用HRW作为最终选择


这真的是我们能做的最好的了吗,还是有其他方法使HRW O(log(n))?

如果你给每个站点一个足够长的随机id,以基数k表示(可能通过散列一个非随机id),那么你可以将这些站点与树的叶子相关联,每个节点上最多有k个后代。不需要将任何站点与树的内部节点相关联

要确定项目的存储位置,请使用HRW从树的根开始确定在树节点上分支的方向,当到达与站点关联的叶子时停止。在确定要存储项目的站点之前,您无需与任何站点通信即可完成此操作-您只需知道站点的哈希ID即可构建树


因为站点只与叶子关联,所以树的内部节点不可能退出,除非与树下叶子关联的所有站点都退出,此时它将变得不相关。

我不相信更新的答案。当您比较分支而不是所有站点的权重时,HRW有两个很好的属性似乎丢失了

一个是,你可以选择前n个站点,而不仅仅是主站点,这些站点应该是随机分布的。如果您要下降到一棵树中,则树中的前n个站点将彼此靠近。这可以通过用不同的盐多次下降来解决,但这似乎需要很多额外的工作


第二点是,添加或删除站点时发生的情况是显而易见的,在添加的情况下,只有1个站点的数据移动。如果修改现有树,它只会影响对等站点。对于添加,唯一移动的数据来自添加站点的新对等方。在删除的情况下,该站点上的所有数据现在都移动到前一个对等站点。如果您重新计算树,所有数据都可能根据树的构造方式移动。

我认为您可以使用通常用于一致哈希的相同“虚拟节点”方法。假设您有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是常数)

如果是体检
   ....
     \
      |
     / \
    |   |
   /   / \
  |   X   |
 / \     / \
V   W   Y   Z