散列表

散列表(哈希表)是一种高效的数据结构,利用散列函数将关键字映射到特定位置,实现快速访问。常见的散列函数有除法散列、乘法散列和全域散列,以及解决碰撞的方法如开放寻址法(线性探查、二次探查、双重散列)和链接法(哈希桶)。完全散列则是通过两级散列,确保静态关键字集合的最坏情况访问时间为O(1)。
摘要由CSDN通过智能技术生成

定义

       散列表(Hash Table)也叫哈希表,是根据关键字进行数据访问的数据结构。散列表将关键字映射到表中的某个位置来访问数据,提供映射的叫散列函数(Hash Function)。通过散列函数,我们可以实现对数据的快速访问(理想情况下是常数时间内,但这取决于散列函数、碰撞概率、负载系数等因素)。

       实际上,散列表是普通数组概念的推广。由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置。而当实际存储的关键字数目比全部的可能关键字总数要小时,采用散列表就成为直接寻址的一种有效替代,因为散列表使用一个长度与实际存储的关键字数目成比例(这个比例称为负载系数)的数组来存储。在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标。

基本概念

·关键字通过散列函数映射到散列表上的位置称为散列地址,或者说散列函数计算出的结果叫散列值。映射过程称为散列。

·有两个关键字k1和k2,k1≠k2,但H(k1)=H(k2),即两个不同的关键字通过散列函数映射到了表中同一位置,这种现象称为碰撞(collision),也叫冲突。

·元素个数除以散列表大小得到的值称为负载系数或负载因子(load factor),负载系数的范围永远是[0, 1],除非使用开链(separate chaining)策略。

·若对于关键字集合中的任意关键字,映射到散列表中的任何位置的概率都是相等的,并与其他关键字已散列到什么位置无关,则称这个散列函数为均匀散列函数(Uniform Hash Function),散列函数的设计应该朝着这一方向努力。

散列函数

       一个好的散列函数应(近似地)满足简单均匀散列假设(上文有提到)。但一般无法检查这一条件是否成立,因为很少能知道关键字散列所满足的概率分布,而且各关键字可能并不是完全独立的。

       有时我们能知道关键字的概率分布。例如,如果各关键字都是随机的实数k,它们独立均匀地分布于0≤k<1范围中,那么散列函数 h(k) = ⌊km⌋ 就能满足简单均匀散列的假设条件。

       好的散列函数导出的散列值在某种程度上应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值