[C++] 哈希的模拟实现---闭散列法、开散列法(上)

哈希定义

  • 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较;
  • 哈希结构:可以不经过任何比较,一次直接从表中得到要搜索的元素:通过某种哈希函数,使元素的存储位置与它的关键码之间能够建立一一映射的关系

哈希函数设计原则

  • 哈希函数的定义域必须包括需要存储的全部关键码
  • 如果散列表允许有m个地址时,其值域必须在0 到 m-1之间
  • 哈希函数计算出来的地址能均匀分布在整个空间中
  • 哈希函数应该比较简单

常见的哈希函数

1. 直接定制法

取关键字的某个线性函数为散列地址:Hash(Key)=A*Key + B
优点:简单、均匀 缺点:需要事先知道关键字的分布情况
使用场景:适合查找比较小且连续的情况

2. 除留余数法

设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数:Hash(key) =key% p (p<=m),将关键码转换成哈希地址

3. 平方取中法

假设关键字为1234,对它平方就是1522756,抽取中间的3位227作为哈希地址
适用场景:不知道关键字的分布,而位数又不是很大的情况

4. 折叠法

将关键字从左到右分割成位数相等的几部分(最后一部分位数可以短些),然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址
适用场景:事先不需要知道关键字的分布,适合关键字位数比较多的情况

5. 随机数法

选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key) =random(key)
适用场景:通常应用于关键字长度不等时采用此法

6.数学分析法

适用场景:关键字位数比较大的情况,如果事先知道关键字的分布且关键字的若干位分布较均匀的情况

哈希冲突

是什么

不同关键字通过相同哈希函数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞;

怎么办

解决哈希冲突两种常见的方法:闭散列法和开散列法

闭散列法实现哈希

点击跳转到闭散列法实现哈希的具体代码篇

开散列法实现哈希

点击跳转到开散列法实现哈希的具体代码篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值