C++ 索引哈希表

C++ 索引哈希表,c++,function,hashtable,C++,Function,Hashtable,我刚刚开始学习哈希表,到目前为止,我知道你需要哈希的对象,通过一个哈希函数,然后使用它返回的索引得到你想要的对应对象。但有件事我不明白: 您使用什么结构来存储对象,以便可以使用哈希函数返回的代码快速索引它们?我唯一能想到的就是使用一个数组,但是要处理所有的键,你必须分配一个99999999999个大元素或者类似的荒谬的元素。还是像迭代链表之类的东西并将每个元素中的ID与该哈希函数中的键进行比较一样简单?如果是这样的话,这似乎有点低效,不是吗?通常是数组。如果数组大小为N,则使用哈希函数返回范围0

我刚刚开始学习哈希表,到目前为止,我知道你需要哈希的对象,通过一个哈希函数,然后使用它返回的索引得到你想要的对应对象。但有件事我不明白:


您使用什么结构来存储对象,以便可以使用哈希函数返回的代码快速索引它们?我唯一能想到的就是使用一个数组,但是要处理所有的键,你必须分配一个99999999999个大元素或者类似的荒谬的元素。还是像迭代链表之类的东西并将每个元素中的ID与该哈希函数中的键进行比较一样简单?如果是这样的话,这似乎有点低效,不是吗?

通常是数组。如果数组大小为
N
,则使用哈希函数返回范围
0..(N-1)
中的数字。例如,对哈希函数结果应用模
N

然后在

中使用碰撞分辨率通常,使用数组(或类似于向量的东西)。当/如果两个键产生相同的散列值(例如,这些位置中的每一个都是散列到该值的项目的链接列表的头),您可以选择一个合理的大小(例如,比您期望的项目数大20%)和一些解决冲突的方法。

是的,您通常使用数组,但随后可以执行以下操作:

  • 通过使用哈希代码的剩余部分除以数组大小,可以将哈希代码转换为数组索引

  • 您将数组的大小设置为素数,因为这会使步骤#1更有效(一些哈希算法需要这样才能获得均匀分布)

  • 您提出了一个处理哈希冲突的设计@JerryCoffin的回答提供了更多细节


  • 我不是在问冲突解决问题,我是在问存储内容的数据结构类型以及如何快速索引它们。在数组场景中,使用哈希函数返回数组大小内的值。因此,如果没有1万亿个数组元素,则可以将哈希函数限制在合理的桶数(256?10240?取决于使用情况)。通常每个bucket实际上都是自己的链表,所以可以处理冲突。但这种设计在某种程度上取决于您使用的冲突解决算法。