针对哈希冲突的解决方法

了解哈希表和哈希冲突是什么

哈希表:是一种实现关联数组抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值。

哈希冲突:当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了。哈希冲突是不可避免的,因为哈希函数通常会将无限大小的输入域映射到有限大小的输出域,这就导致了多个不同的键可能映射到同一个桶上。

为了解决哈希冲突常用的方法

链地址法(Separate Chaining)
  • 在每个哈希桶上维护一个链表,当发生哈希冲突时,将新的键值对添加到链表中。
  • 这样,同一个桶上的多个键值对都可以存储在链表中,不同的键值对之间不会互相影响。
  • 当进行查找时,先通过哈希函数找到桶,然后在链表中查找具体的键值对。
开放地址法(Open Addressing)
  • 当发生哈希冲突时,通过一定的规则,将新的键值对存储在其他的哈希桶上,而不是在冲突的桶上。
  • 常见的开放地址法的策略包括线性探测、二次探测、双重散列等。
  • 线性探测:逐一检查下一个哈希桶,直到找到一个空桶为止。
  • 二次探测:使用二次探测公式逐步增加探测距离,直到找到一个空桶。
再哈希(Rehashing)
  • 当哈希表的负载因子达到一定阈值时,可以考虑对哈希表进行扩容,同时重新计算所有键的哈希值,将它们重新插入到新的哈希表中。
  • 当在哈希表中发生冲突时,再哈希会尝试使用另一种哈希函数来找到新的存储位置。这可以防止形成集中的聚集,提高散列的均匀性。

在重新哈希的过程中,旧的哈希表会被替换为一个更大的哈希表,然后已存在的元素会被重新散列到新的表中。这通常涉及到选择一个新的哈希函数,可能是与原始哈希函数不同的函数,以确保冲突在新的哈希表中得到解决。

建立公共溢出区且更好的哈希函数
  • 选择一个好的哈希函数可以降低冲突的概率。好的哈希函数应该能够尽可能均匀地将键分布在哈希表中。
  • 对于字符串键,通常使用字符串的每个字符的ASCII码值的加权和来作为哈希值。
  • 建立公共溢出区允许多个关键字映射到同一个哈希桶的情况。在使用公共溢出区的哈希表中,每个桶不仅可以存储一个关键字,而且可以存储一个关键字链表或其他数据结构,用于存储冲突的关键字。
  • 可以处理大量的冲突,因为每个桶都可以包含多个关键字。
  • 需要小心设计哈希函数,以确保关键字在哈希表中均匀分布,以减少溢出区的长度,从而提高性能。
相关推荐
lpfasd12315 小时前
推荐算法进化史
算法·机器学习·推荐算法
Pniubi15 小时前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展
UIU1141 天前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场1 天前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi1 天前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David1 天前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院1 天前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng1 天前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~1 天前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py1 天前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法