如何创建哈希表

How to create a hash table

本文关键字:哈希表 创建 何创建      更新时间:2023-10-16

在继续之前,我想提一下,我已经研究了这个网站以及其他网站上提出同样问题的其他问题。我希望我能得到一个好的答案,因为我的目标是双重的:

  1. 首先,我想学习如何创建一个哈希表。
  2. 其次,我发现Stack Overflow上的许多答案倾向于假设对某个主题有一定程度的知识,而这些知识通常并不存在,特别是对于较新的类型。话虽如此,我希望编辑我的主要信息,以便在我自己弄清楚之后更深入地解释这个过程。

上主菜:

根据我目前的理解,哈希表是一个列表数组(或类似的数据结构),它希望在最佳情况下尽可能少地发生冲突,以保持其著名的O(1)复杂度。以下是我当前的进程:

第一步是创建一个指针数组:

Elem ** table;
table = new Elem*[size];//size is the desired size of the array

我的第二步是创建一个哈希函数(一个非常简单的)

int hashed = 0;
hashed = ( atoi( name.c_str() ) + id ) % size;
//name is a std string, and id is a large integer. Size is the size of the array.

我的第三步是创建一些东西来检测碰撞,这是我目前正在做的部分。

下面是一些伪代码:

while( table[hashedValue] != empty )
    hashedValue++
else
    put in the list at that index.

这是相对不优雅的,但我仍然在"这是什么"的阶段。听我说。

还有别的吗?是我错过了什么还是做错了什么?

谢谢

处理没有空槽并调整表大小

您缺少Elem的定义。这不是微不足道的,因为它取决于您是想要一个链接还是探测哈希表。

哈希函数对相同的数据产生相同的值。但是,您的冲突检查会修改该值,这意味着哈希值不仅取决于输入,还取决于哈希映射中其他元素的存在。这很糟糕,因为您几乎永远无法通过名称实际访问之前放入的元素,只能通过遍历映射来访问。

第二,你的碰撞检查很容易出现溢出/范围错误,因为你只是增加哈希值而不检查映射的大小(尽管,正如我之前所说,你甚至不应该这样做)。