【问题标题】:How to implement a dynamic-size hash table?如何实现动态大小的哈希表?
【发布时间】:2012-04-09 04:00:38
【问题描述】:

我知道哈希表数据结构的基本原理。如果我有一个大小为 N 的哈希表,我必须将我的数据尽可能均匀地分配到这 N 个桶中。

但实际上,大多数语言都有其内置的哈希表类型。当我使用它们时,我不需要事先知道哈希表的大小。我只是把任何我想要的东西放进去。比如在Ruby:

h = {}
10000000.times{ |i| h[i]=rand(10000) }

它是怎么做到的?

【问题讨论】:

    标签: data-structures hashtable


    【解决方案1】:

    the Dynamic resizing section of the Hash table article on Wikipedia

    通常的做法是使用与a dynamic array相同的逻辑:有一些桶,当哈希表中的项目太多时,创建一个更大的新哈希表并将所有项目移动到新的哈希表。

    此外,根据哈希表的类型,这种调整大小可能不是正确性所必需的(即,即使不调整大小它仍然可以工作),但对于性能来说肯定是必要的。

    【讨论】:

    • 一个很好的重新散列方法是将表的大小加倍,然后当您搜索一个值时,您对其键进行散列,并在您的散列表中以hash % current_size 开始进行模搜索,然后hash % current_size/2等。当你找到值时,你可以重新散列它。这样您就可以在不损失太多性能的情况下进行惰性重新散列,因为经常访问的值会自动重新散列。
    • @DvirVolk,懒惰的重新散列很好。您已经知道最顶层哈希表中的条目,并且知道从较低的哈希表中插入的位置。但是您可能会遇到某些条目将容纳整个空桶表的情况。据我所知,wiki 的“增量调整大小”是数据大小的权衡速度的解决方案(最后你持有 2*N 个桶,其中 N 是最顶层哈希表的大小)。加倍大小有利于“复制所有条目”,因为您必须将单个存储桶分成两个或将两个合并为一个(无需重新计算哈希)并重用旧存储桶的链表。
    • @Not_a_Golfer 我刚才有这个确切的想法,但我正在努力寻找对这种技术的理论分析,你知道吗?
    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 2012-06-03
    • 2014-05-09
    • 2011-04-03
    • 2016-03-25
    • 2018-10-31
    • 2011-10-14
    • 2011-09-15
    相关资源
    最近更新 更多