首页 > 代码库 > 散列表

散列表

  散列表的基本思想通过键来直接计算出数据的存放地址,而避免了数组或者其他数据结构的逐个比较查找。

可以在常数时间内实现查找、插入和删除操作,代价是不支持任何有关排序的操作。

  键到地址的映射,称作散列函数。散列函数需要满足两个要求:计算简单;冲突少。

不同的情况,可以有不同的散列函数,在此不对散列函数做过多介绍。

  冲突:相同的键,通过散列函数,被映射到了相同的地址。下面主要介绍下解决冲突的一些简单方法。

 

  分离链表法:把散列到同一个地址的数据保存在一个链表中。在查询数据时,先通过散列函数求出链表地址,

        再遍历链表查询。

  探测散列表:首先根据散列函数计算地址:H0=hash(key)

        如果发生冲突,再根据探测函数查找下一个空闲地址:H= (Hi-1+f(i))%m.

        其中 i 表示第 i 次发生冲突,H0是根据散列函数求得的基地址,m是散列表大小。

        当f(i)是一个一次函数时,这种方法称为线性探测;当f(i)是一个二次函数时,这种方法称为二次探测法。

  双散列法:H= (Hi-1+hash2(key))%m.

  

  

 

散列表