何为哈希(Hash)表(散列表)?

哈希表是一种特殊数组,通过Hash函数实现非连续存储,提供快速查找和存储。相比数组,哈希表响应速度更快。常见的Hash函数构造方法包括数字分析、平方取中、分段叠加、除法和斐波那契散列法。冲突处理方法有开放定值法、再哈希法、公共溢出区域和链地址法。在存储和查找效率上,哈希表优于数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hash表与数组的关系:
Hash表又称散列表;
可以把Hash表看作为一种特殊的数组;
Hash表与数组的主要区别在于:
1、数组在存储数据的时候是连续存储
2、Hash在存储数据的时候是非连续存储的,通过Hash函数在索引值与数据之间建立映射关系,查找或存储的时候通过关键字和Hash函数来进行。
3、相比于数组,哈希表的响应速度更快,效率更高。数组在查询数据时是遍历查询,哈希表为一对一的精确查询。
Hash表与数组的相同点在于:
Hash表是基于数组的,数组创建后难于扩展,并且数组的大小和存储空间是有限的,所以些哈希表也具有类似的特性。
Hash函数的构造方法:
将元素特征转变为数组下标的方法称为散列法,主要有一下几种:
1、数字分析散列法
如果事先知道关键字集合,并且每个关键字的位数比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若干位,构成哈希地址
2、平方取中散列法
当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址
3、分段叠加散列法
这种方法是按哈希表地址位数将关键字分成位数相等的几部分(最后一部分可以较短),然后将这几部分相加,舍弃最高进位后的结果就是该关键字的哈希地址
4、除法散列法
假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为 h(k)=k % p ,其中%为模p取余运算。
5、斐波那契(Fibonacci)散列法
Hash函数冲突处理方法:
1、开放定值法
当发生冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探测序列依次查找下去,当碰到一个空的单元时,则插入其中。
2、再哈希法
当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突为止。
3、建立公共溢出区域
假设哈希函数的值域是[1,a,则设向量HashTable[0…a]为基本表,每个分量存放一个记录,另外设向量OverTable[0…b为溢出表,所有关键字和基本表中关键字为同义词的记录,不管它们由Hash函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。
4、链地址法
Hash表与数组使用举例:
题目要求:存储5、13、17、33四个元素,并查找元素11是否存在?
1、利用数组
存储方式为:a[0] = 5; a[1] = 13; a[2] = 18 a[3] = 33;
查找元素11是否存在:利用for循环将所有元素进行遍历
2、利用Hash表
存储方式为:
先确定Hash函数,这里我们就用除法散列法,p取3。
对于第一个元素 h(5) = 5%3 = 2; 也就是说5的下标为2;即Hash[2] = 5;
对于第二个元素 h(13) = 13 % 3 = 1; 也就是说13的下标为1; 即Hash[1] = 13;
同理,Hash[3] = 18; Hash[0] = 33;
查找元素11是否存在:元素11代入刚才的函数中来映射出它所在的地址单元。也就是h(11) = 11%3 = 2。下面我们来比较一下Hash[2]的值是否等于11。
总结:利用数组需要将所有的元素都遍历一遍,消耗时间多,效率慢;利用Hash表只需要一次对比,消耗时间少,效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值