C++_哈希表

       

目录

1、哈希表的用法

2、哈希函数-除留余数法

3、哈希冲突 

4、闭散列和开散列

4.1 闭散列

4.1.1 哈希表的扩容

4.1.2 二次探测

4.2 开散列(哈希桶)

4.2.1 开散列的扩容 

结语 


前言-哈希表概念:

        哈希表也是一种存储信息的结构,他是通过映射数据本身从而得到一个“影子位置”,该“影子位置”就是哈希表中存储该数据的位置,因此哈希表的优势在于查找数据时,并不会像其他顺序结构、树结构一样,将要查找的数据和载体中的数据直接比较,而是根据数据找到其在哈希表中的映射位置,然后直接用下标访问哈希表的映射位置,让数据与此位置的值进行对比即可。

1、哈希表的用法

        哈希表的关键在于如何将数据和映射位置建立关系,通常会通过一个函数来实现他们的转换,并把这个函数叫做哈希函数。通过函数找到数据在哈希表中的映射位置,举例:现有数组{4,9,6,5,3,2},具体示意图如下:

        因此,在没有哈希表时,查找一个数据需要跟数组中的数据挨个比较,直到对比相同时或者遍历完数组时才有结果(效率O(N)),而有了哈希表后,直接通过哈希函数求出该数据在哈希表中的映射位置,并且用下标访问哈希表,就可以得到一个结果(效率O(1))。

        但是此哈希函数有一个缺陷,即上述数组中有一个元素为1000,则总共只有七个元素但是哈希表需要开1001个空间,浪费了很多不必要的空间。 

2、哈希函数-除留余数法

        上述哈希函数会导致空间浪费的问题,于是推出另一种方法:除留余数法。该方法是模上哈希表本身的大小,只是最开始哈希表的大小需要给定一个数n,比如上述数组加了元素1000后数组为:{4,9,6,5,3,2,1000},该数组的大小是7,则模上一个接近7的数(或者是7)即可(这里n举例为10)。得到哈希函数:映射位置=数据%n并且n表示哈希表的大小。

        示意图如下:

3、哈希冲突 

        除留余数法虽然解决了空间浪费的问题,但是以上还有一个问题就是如果数组中插入了一个元素19,那么19和9都会放到哈希表的映射位置9处,把这种映射位置相冲突的情况叫做哈希冲突。

        具体示意图如下:

4、闭散列和开散列

        解决哈希冲突的方法有两种: 闭散列和开散列。(ps:实际上闭散列不能有效解决哈希冲突,因此用的最多的方法还是开散列,但是这里还是提一下闭散列)。

4.1 闭散列

         闭散列用的方法实际上就是发生冲突后,把后映射数据的位置挪到原本位置的下一个位置,若下一个位置也存在数据,则继续往下一个位置走,直到走到空位置处,因此可以把这个过程看作是不断+i的过程,并且把这种方法叫做线性探测:即从冲突位置开始,不断的向后探测直至探测到空位置

        用线性探测解决上述冲突具体示意图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

安权_code

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

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

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

打赏作者

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

抵扣说明:

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

余额充值