今天我们来聊聊哈希表。
哈希表(Hash Table,也叫散列表):
散列表(Hash table,也叫哈希表),是依据关键码值(Key value)而直接进行訪问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来訪问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。(来自维基百科)
哈希表的实现主要需要解决两个问题:哈希函数和哈希冲突。
哈希函数:
哈希函数也叫散列函数,它对不同的输出值得到一个固定长度的消息摘要。理想的哈希函数对于不同的输入应该产生不同的结构,同时散列结果应当具有同一性(输出值尽量均匀)和雪崩效应(微小的输入值变化使得输出值发生巨大的变化)
冲突解决:
现实中的哈希函数不是完美的,当两个不同的输入值对应一个输出值时,就会产生“碰撞”,这个时候便需要解决冲突。
常见的冲突解决方法有开放定址法,链地址发,建立公共溢出区等。实际的哈希表实现中,使用最多的是【链地址法】。
链地址法:
链地址法的基本思想是,为每个 Hash 值建立一个单链表,当发生冲突时,将记录插入到链表中。
例 2 设有 8 个元素 { a,b,c,d,e,f,g,h } ,采用某种哈希函数得到的地址分别为: {0 , 2 , 4 , 1 , 0 , 8 , 7 , 2} ,当哈希表长度为 10 时,采用链地址法解决冲突的哈希表如下图所示:
参考链接:
(1)https://hit-alibaba.github.io/interview/basic/algo/Hash-Table.html