在某些时候我们需要增加散列的大小,通常我们只是重新散列,这会导致整个散列的重新组合。
有没有更好的解决方案,以便在我们增加尺寸时,我们不需要重新构建整个事物?
答案 0 :(得分:1)
您可以使用http://en.wikipedia.org/wiki/Extendible_hashing,虽然AFAIK主要用于磁盘数据库。
还有一些通用的方法来平滑一些摊销成本。起点为http://en.wikipedia.org/wiki/Static_and_dynamic_data_structures和http://en.wikipedia.org/wiki/Dynamization。对哈希表的一个应用是始终保留两个表,一个是大小N,另一个是大小为2N左右。当较小的溢出时,开始创建一个大小为4N的表,但不要立即填充它 - 在使用大小为2N的表时以增量方式填充它。当大小为2N的表已满时,应准备好4N大小的表。对于散列表的特殊情况,可扩展散列应该更好。
答案 1 :(得分:0)
任何时候你重新哈希,没有什么说你需要实际重新哈希。事实上,你实际需要做的就是重新修改(即改变一切的位置)。
如果你缓存哈希(嘿嘿,听起来像是一本博士seuss书的开头)那么你只需要计算一次。因此,将哈希与实际数据一起存储,这将使您无需再次计算哈希值。但是我假设你还没有这样做,你没有完全解释当前的过程。
// Store these instead of the data directly. This assumes immutable data.
struct hashable_item
{
data dat;
int32 hash;
}