【发布时间】:2016-06-30 07:06:28
【问题描述】:
在我见过的每个哈希表实现中,哈希用于选择一个“桶”,它是一个项目列表,然后遍历该列表,直到找到我们想要的项目。
我的问题是为什么它总是一个列表?据我所知,向量几乎总是更有效,那么为什么不使用向量作为存储桶呢?列表是否有某些特性使其非常适合用作哈希表中的存储桶?
我在这里使用 C++ 术语来表示矢量,但它确实适用于任何语言。
【问题讨论】:
标签: c++ list vector hashmap hashtable
在我见过的每个哈希表实现中,哈希用于选择一个“桶”,它是一个项目列表,然后遍历该列表,直到找到我们想要的项目。
我的问题是为什么它总是一个列表?据我所知,向量几乎总是更有效,那么为什么不使用向量作为存储桶呢?列表是否有某些特性使其非常适合用作哈希表中的存储桶?
我在这里使用 C++ 术语来表示矢量,但它确实适用于任何语言。
【问题讨论】:
标签: c++ list vector hashmap hashtable
哈希表用于关注速度的地方。
与std::list 相比,std::vector 中添加或删除元素要慢得多,std::list 是作为双向链表实现的。
当向std::vector 添加一个元素时,如果向量大小超过向量容量,所有元素都必须移动到内存中。在std::list 中,只分配了新元素的内存,并且必须调整最后一个元素的下一个指针。
当从std::vector 中删除一个元素时,所有后续元素都必须移动到内存中。在std::list 中只需要调整 prev 和 next 指针。
可能是另一个原因:如果使用 std::list 元素将永远不会在内存中移动,并且一旦将元素添加到地图中,您就可以使用裸指针来寻址这些元素。使用 std::vector 时,如果调整了向量的大小,则会移动元素并且所有裸指针都将悬空
OOT:另一种解决方案是根本不使用存储桶列表:如果新元素将散列到位置 7 并且该位置已被占用,则新元素将被写入位置 8(依此类推) .如果哈希表几乎为空,则此解决方案非常快,如果表几乎已满,则此解决方案很慢。如果元素的数量超过哈希表的大小,则必须对其进行调整大小和重组,这是一项非常昂贵的操作。
【讨论】: