哈希表bucket实现
Hashtable bucket implementation
在我看到的每一个哈希表实现中,都会使用哈希来选择一个"bucket",它是一个项目列表,然后在该列表上迭代,直到找到我们想要的项目。
我的问题是为什么它总是一个列表?据我所知,向量几乎总是更有效的,所以为什么不使用向量作为桶呢?列表的某些属性是否使它们非常适合用作哈希表中的bucket?
我在这里使用C++术语来表示向量,但它确实适用于任何语言。
哈希表用于速度问题的地方。
与实现为双链表的std::list
相比,从std::vector
添加或删除元素要慢得多。
当向std::vector
添加元素时,如果向量大小超过向量容量,则必须在存储器中移动所有元素。在std::list
中,仅分配用于新元素的存储器,并且必须调整最后元素的下一指针。
从std::vector
中移除元素时,所有后续元素都必须在内存中移动。在std::list
中,只有前一个和下一个指针需要调整。
也许还有另一个原因:如果使用std::list,元素永远不会在内存中移动,并且一旦元素被添加到映射中,您就可以使用裸指针来寻址它们。当使用std::vector时,如果调整了向量的大小,则元素会被移动,并且所有裸指针都会挂在上
OOT:另一个解决方案是根本不使用bucket的列表:如果新元素散列到位置7,并且这个位置已经被占用,则新元素将被写入位置8(依此类推(。如果哈希表几乎为空,则此解决方案非常快速,如果表几乎为满,则速度较慢。如果元素的数量超过哈希表的大小,则必须调整其大小并重新组织,这是一项非常昂贵的操作。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- bucket排序的实现中出错
- 哈希表bucket实现