数据结构和算法-散列表

Posted 恒奇恒毅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构和算法-散列表相关的知识,希望对你有一定的参考价值。

散列表又叫哈希表,是根据键(KEY)直接访问在内存存储位置的数据结构,由数组或者链表演化而来。一般需要对KEY进行运算得到一个数字,再映射到数据或者链表的某个位置,如此可以在时间复杂度为O(1)的情况下对数据进行访问。

对KEY进行运算的函数一般称为散列函数(hash),它一般要满足几个基本的需求:

  1. 散列函数计算得到的散列值必须是大于等于0的正整数,因为此值要作为数组的下标;
  2. 如果key1==key2,那么经过hash后得到的hash值也必须相同;
  3. 如果key1!=key2,那么经过hash后得到的hash值可能相同或者不同(所谓的hash碰撞)。

好的散列函数满足:

  1. 不能太复杂,因为太复杂势必要消耗很多的时间在计算hash值上,就间接影响散列表的性能;
  2. 散列函数计算得出的hash值尽可能的随机并且均匀分布,这样使得散列冲突最小化。

散列冲突

两个不同的KEY,计算出来的hash值可能相同,因而被映射到同一位置上。这就是散列冲突或者hash碰撞。再好的散列函数也无法避免散列冲突,如果出现了冲突,一般有两类方法解决:开放寻址法、链表法。

  • 开放寻址法

其核心思想是:一旦出现冲突,就重新去寻找下一个空的地址

1)线性检测

如果某个数据经过散列函数散列之后,存储位置已经被占用,就从当前位置,一次往后查找,直到找到空闲位置为止。查找的时候也一样&#x

以上是关于数据结构和算法-散列表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法—散列表

数据结构和算法-散列表

数据结构 散列表

JavaScript数据结构与算法 - 散列表

《数据结构与算法之美》15——散列表如何实现工业级别的散列表

算法与数据结构:散列表的Java实现