【C++】哈希


目录

一、哈希相关概念

1.哈希概念

2.哈希冲突

3.哈希函数

二、闭散列

闭散列的模拟实现

三、开散列

1.开散列概念

2.开散列实现

四、传入其他参数的处理办法

1. 只能存储key为整形的元素,其他类型怎么解决?

2. 将字符串转化为整形

五、除留余数法


一、哈希相关概念

1.哈希概念

顺序结构以及平衡树 中,元素关键码与其存储位置之间没有对应的关系,因此在 查找一个元素
时,必须要经过关键码的多次比较 顺序查找时间复杂度为 O(N) ,平衡树中为树的高度,即 O(log_2 N) ,搜索的效率取决于搜索过程中元素的比较次数。
 
理想的搜索方法:可以 不经过任何比较,一次直接从表中得到要搜索的元素
如果构造一种存储结构,通过某种函数 (hashFunc) 使元素的存储位置与它的关键码之间能够建立
一一映射的关系,那么在查找时通过该函数可以很快找到该元素
 
当向该结构中:
 
  • 插入元素

根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放 

  • 搜索元素
对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置
取元素比较,若关键码相等,则搜索成功

该方式即为哈希 ( 散列 ) 方法, 哈希方法中使用的转换函数称为哈希 ( 散列 ) 函数,构造出来的结构称
为哈希表 (Hash Table)( 或者称散列表 )
 
例如:
数据集合 {1 7 6 4 5 9}
哈希函数设置为: hash(key) = key % capacity ;
capacity 为存储元素底层空间总的大小。

上图插入1,模10得到1,就填入到1的位置,其他元素也是同理。

如计数排序,其实就有哈希的思想。详情参考:计数排序 。

当我们向上图中再插入一个数字44的时候,44和4取10的模的余数都是4,那么都应该在4的位置。这该怎么填入数字呢?这种出现几个数字都符合一个位置的条件的情况,叫做哈希碰撞/冲突

2.哈希冲突

对于两个数据元素的关键字  k_i  k_j (i != j) ,有 k_i != k_j ,但有: Hash(k_i) ==  Hash(k_j)  ,即: 不同关键字通过相同哈希哈数计算出相同的哈希地址,该种现象称为哈希冲突 或哈希碰撞
把具有不同关键码而具有相同哈希地址的数据元素称为 同义词
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值