如何创建哈希表
How to create a hash table
在继续之前,我想提一下,我已经研究了这个网站以及其他网站上提出同样问题的其他问题。我希望我能得到一个好的答案,因为我的目标是双重的:
- 首先,我想学习如何创建一个哈希表。
- 其次,我发现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
的定义。这不是微不足道的,因为它取决于您是想要一个链接还是探测哈希表。
哈希函数对相同的数据产生相同的值。但是,您的冲突检查会修改该值,这意味着哈希值不仅取决于输入,还取决于哈希映射中其他元素的存在。这很糟糕,因为您几乎永远无法通过名称实际访问之前放入的元素,只能通过遍历映射来访问。
第二,你的碰撞检查很容易出现溢出/范围错误,因为你只是增加哈希值而不检查映射的大小(尽管,正如我之前所说,你甚至不应该这样做)。
相关文章:
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- 带链接的基本哈希表
- C++哈希表中,两个相同的实现,但一个给出错误
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 在 C++ 中为特定哈希表创建插入函数
- 创建用于存储某些指针值的哈希表
- 创建哈希表,其中每个值都是许多值的向量
- 使用 C++ 中的数组创建哈希表表示形式
- 哈希表创建
- 使用动态分配的数组创建哈希表
- 在C++中创建用于字符串操作的哈希表
- 如何在cpp中创建一个固定大小(以内存为单位)的哈希表
- 如何创建哈希表
- 在哈希表中创建字符串哈希值的时间复杂度