算法小专栏:散列表(二)

本篇将重点介绍:解决散列冲突的四种方案。


一、开放定址法:

1.1 定义:

描述:为产生冲突的地址H(key)求得一个新的地址序列:Hi =(H(key)+ di)% m (i=1,2,3,...,m-1),其中H(key)为哈希函数,m为表长,di称为增量序列。

增量序列通常有以下3种取法:

  • 线性探测再散列:di = 1,2,3,...,m-1
  • 二次探测再散列:di = 12,-12,22,-22,32,-32,...,k2(k<=m/2)
  • 伪随机探测再散列:di = 伪随机数序列
1.2 举例:

例如,在长度为11的哈希表中,已填入关键字 172960的记录,哈希函数为:H(key) = key % 11

计算:
H(17) = 17 % 11 = 6。故将关键字“17”存在下标为6的位置,位置空着,所以存入未冲突。
H(29) = 29 % 11 = 7。故将关键字“29”存在下标为7的位置,位置空着,所以存入未冲突。
H(60) = 60 % 11 = 5。故将关键字“60”存在下标为5的位置,位置空着,所以存入未冲突。

所以,现在的表的存储状态如下图:


这时存入第四个关键字:38.

计算:H(38) = 38 % 11 = 5。出现冲突,下标为5的位置已存有60。

  • 方式一:线性探测再散列。

开始尝试逐次追加di = 1,2,3,...,m-1

得到地址6 => 依然冲突,
得到地址7 => 仍然冲突,
得到地址8 => 不冲突,存入。

最终结果,如下图:

  • 方式二:二次探测再散列。

尝试追加 di = 12,-12,22,-22,32,-32,...,k2(k<=m/2)

首先,追加12,地址6仍然冲突。
再,追加-12,地址4无冲突,可以存入。

最终结果,如下图:

  • 方式三:伪随机探测再散列。

假设伪随机数为9,

H(38) = (38+9)%11 = 3。地址3不冲突,存入。

最终结果,如下图:

二、链地址法:

2.1 定义:

描述:将所有哈希地址相同的记录都链接在同一链表中,以此来解决冲突。

2.2 举例:

已知一组关键字为(19,14,23,01,20,68,84,27,55,11,10,79)。
则按哈希函数H(key) = key % 13,链地址处理冲突如下图:

三、再哈希法:

描述:产生冲突时计算另一个哈希函数(散列函数)的地址,直到冲突不再发生为止。

优点:这种方法不容易产生聚集。
缺点:增加了计算的时间成本。

四、建立公共溢出区:

描述:把冲突的都放在另一个溢出表中,而不会存在基本表里。

这也是解决哈希冲突的一种办法,假设哈希函数的值域为[0,m-1],那就创建一个[0,m-1]的基本数组,每块内存存放一个记录,另外创建一个溢出数组,一旦发生哈希冲突,就将冲突的值添加至溢出表。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 级别: ★☆☆☆☆标签:「算法」「Hash」「散列表」「哈希表」作者: MrLiuQ审校: QiShare团队 接...
    QiShare阅读 334评论 0 5
  • 一.概念 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可...
    lfp901020阅读 3,155评论 0 2
  • 一、散列的概念 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h...
    SeanMa阅读 64,840评论 1 30
  • 哈希表:即散列存储结构。散列法存储的基本思想:建立记录关键码字与其存储位置的对应关系,或者说,由关键码的值决定数据...
    linbj阅读 6,654评论 1 5
  • 哈希表定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结...
    n油炸小朋友阅读 5,043评论 0 22

友情链接更多精彩内容