散列·分离链接法

文章目录

      • 一、介绍
        • 完美散列
        • 冲突
        • 散列函数
        • 装填因子(装载因子/加载因子)
      • 二、分离链表法
          • 图表说明 ![](https://img-blog.csdnimg.cn/20190320233154438.png)
      • 三、代码实现
          • Java代码说明

一、介绍

​ 散列表的实现被叫做__散列__,是一种用于常数平均时间执行插入、删除和查找的技术。通常做法是保存key-value的数据结构,理想的散列表数据结构不过是具有固定大小的数组key 作为关键字,value 是真正存储的数据。将不同的value根据各自的key 存取在散列表中的算法叫做散列函数

完美散列

​ 我们寻找一个散列函数,该函数要在单元之间均匀的分配关键字,每个关键字 key 落在不同的位置,均匀的分布在散列数组中,互补干扰。

冲突

​ 数组大小总是有限的,例如我们将12个数据插入大小为11的散列数组中,必定会有一个2个数据争抢一个位置,这种情况叫做冲突

​ 散列最主要的问题就是确定散列表的大小,以及解决冲突!

散列函数

​ 将 key-value 数据存入散列表中的位置,确定该位置的算法成为散列函数。

装填因子(装载因子/加载因子)

​ 定义装填因子 λ \lambda λ = 表中数据个数/表大小。

二、分离链表法

将散列到同一个值的所有元素保留到一个表中。设我们散列表的数组大小为10,当我们产生冲突时,即有2个数据散列到了位置为2的地方,那我们将位置为2的位置再设定为一个散列数组。

图表说明 散列·分离链接法_第1张图片

上图: 位置为1、4、6、9位置产生了冲突,每个位置被分配了2个数据,这时候,我们在冲突位置再建一个散列表,让冲突的值重新分配。

​ 位置1:先存入数据1,再存入数据1时发生冲突,则建立新表,并将新表地址存入位置1,然后将数据1和数据81依次存入新表。我们将新元素插入到链表的前端,因为通常情况:新近插入的元素最有可能不久又被访问

三、代码实现

Java代码说明

https://github.com/dhcao/dataStructuresAndAlgorithm/blob/master/src/chapterFive/SeparateChainingHashTable.java

你可能感兴趣的:(数据结构与算法)