【发布时间】:2012-04-09 04:00:38
【问题描述】:
我知道哈希表数据结构的基本原理。如果我有一个大小为 N 的哈希表,我必须将我的数据尽可能均匀地分配到这 N 个桶中。
但实际上,大多数语言都有其内置的哈希表类型。当我使用它们时,我不需要事先知道哈希表的大小。我只是把任何我想要的东西放进去。比如在Ruby:
h = {}
10000000.times{ |i| h[i]=rand(10000) }
它是怎么做到的?
【问题讨论】:
我知道哈希表数据结构的基本原理。如果我有一个大小为 N 的哈希表,我必须将我的数据尽可能均匀地分配到这 N 个桶中。
但实际上,大多数语言都有其内置的哈希表类型。当我使用它们时,我不需要事先知道哈希表的大小。我只是把任何我想要的东西放进去。比如在Ruby:
h = {}
10000000.times{ |i| h[i]=rand(10000) }
它是怎么做到的?
【问题讨论】:
见the Dynamic resizing section of the Hash table article on Wikipedia。
通常的做法是使用与a dynamic array相同的逻辑:有一些桶,当哈希表中的项目太多时,创建一个更大的新哈希表并将所有项目移动到新的哈希表。
此外,根据哈希表的类型,这种调整大小可能不是正确性所必需的(即,即使不调整大小它仍然可以工作),但对于性能来说肯定是必要的。
【讨论】:
hash % current_size 开始进行模搜索,然后hash % current_size/2等。当你找到值时,你可以重新散列它。这样您就可以在不损失太多性能的情况下进行惰性重新散列,因为经常访问的值会自动重新散列。