哈希表bucket实现

Hashtable bucket implementation

本文关键字:实现 bucket 哈希表      更新时间:2023-10-16

在我看到的每一个哈希表实现中,都会使用哈希来选择一个"bucket",它是一个项目列表,然后在该列表上迭代,直到找到我们想要的项目。

我的问题是为什么它总是一个列表?据我所知,向量几乎总是更有效的,所以为什么不使用向量作为桶呢?列表的某些属性是否使它们非常适合用作哈希表中的bucket?

我在这里使用C++术语来表示向量,但它确实适用于任何语言。

哈希表用于速度问题的地方。

与实现为双链表的std::list相比,从std::vector添加或删除元素要慢得多。

当向std::vector添加元素时,如果向量大小超过向量容量,则必须在存储器中移动所有元素。在std::list中,仅分配用于新元素的存储器,并且必须调整最后元素的下一指针。

std::vector中移除元素时,所有后续元素都必须在内存中移动。在std::list中,只有前一个和下一个指针需要调整。

也许还有另一个原因:如果使用std::list,元素永远不会在内存中移动,并且一旦元素被添加到映射中,您就可以使用裸指针来寻址它们。当使用std::vector时,如果调整了向量的大小,则元素会被移动,并且所有裸指针都会挂在上

OOT:另一个解决方案是根本不使用bucket的列表:如果新元素散列到位置7,并且这个位置已经被占用,则新元素将被写入位置8(依此类推(。如果哈希表几乎为空,则此解决方案非常快速,如果表几乎为满,则速度较慢。如果元素的数量超过哈希表的大小,则必须调整其大小并重新组织,这是一项非常昂贵的操作。