Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用链表数组实现哈希表_C++_Performance_Data Structures_Hashtable - Fatal编程技术网

C++ 使用链表数组实现哈希表

C++ 使用链表数组实现哈希表,c++,performance,data-structures,hashtable,C++,Performance,Data Structures,Hashtable,这个问题困扰了我很长时间,今天我读了一篇关于哈希表的详细文章。在不检查任何实现示例的情况下,我想尝试从头开始编写哈希表 分离链接方法给了我实现哈希表的想法。任何在数据结构方面有经验的人都可能会把这个问题当作一个笑话,但我是一个初学者,没有直接研究我想讨论的代码。它是有效的还是任何其他基本的想法都比这更好?我认为对于初学者来说,您还可以窥探boost库中实现的一些哈希映射的源代码(或文档)。它被称为无序地图 只要您不知道这些实现,想要使用散列,并且因为它不在STL中而感到恼火,那么您就有兴趣编写自

这个问题困扰了我很长时间,今天我读了一篇关于哈希表的详细文章。在不检查任何实现示例的情况下,我想尝试从头开始编写哈希表


分离链接方法给了我实现哈希表的想法。任何在数据结构方面有经验的人都可能会把这个问题当作一个笑话,但我是一个初学者,没有直接研究我想讨论的代码。它是有效的还是任何其他基本的想法都比这更好?

我认为对于初学者来说,您还可以窥探boost库中实现的一些哈希映射的源代码(或文档)。它被称为无序地图

只要您不知道这些实现,想要使用散列,并且因为它不在STL中而感到恼火,那么您就有兴趣编写自己的快速数据存储。
但是现在实现散列映射已经太过时了,以至于C++11的STL中有无序的_映射。你会看到外面有很多更有趣的东西


注意:单独的链接称为bucket散列。实际上,boost使用bucket散列,请参阅。也许你更愿意查阅一些性能比较。执行perf's的人很可能会编写足够好的实现。

使用闭合寻址,另一种选择是使用自平衡二叉搜索树,例如红黑树/std::map或heap tree,用于内部数据结构,甚至使用另一个具有不同哈希算法的哈希映射

使用,线性探测的另一种替代方法是二次探测和;还有一些不太常用的策略,如布谷鸟哈希、跳房子哈希等


实现哈希表的关键是选择正确的哈希算法、调整大小策略(负载因子)和冲突解决策略。最佳策略在很大程度上取决于您期望的工作负载类型,因为每种方法都有权衡。

如果您有一个好的哈希算法,单独的链接可以很好地工作,然后会有很少的碰撞,每个链都很小。所以线性探测会明显更好,或者不会产生太大的差异?两种方法都有权衡。在最坏的情况下,单独的链接会变成
链接列表
,线性探测需要重新计算哈希,直到您检查每个单元格,并且它们都是
O(n)
。一个
哈希表
是否得到良好实现的真正关键是所使用的哈希算法(以及结构的大小),因为它决定了将有多少冲突。