散列表(哈希表)

散列表(哈希表)


 散列表是根据键(KEY)来直接访问内存存储位置的一种数据结构,它通过散列函数计算键值对中键(KEY)的散列地址,然后将值存在此地址上,这样就可以直接根据键来取得所对应的值。

散列函数的冲突


对于不同的键(KEY),散列函数得到同一个散列地址,这种现象称为冲突。

如何处理散列冲突


开放定址法

  • 线性探测法:就是一旦冲突了就放到下一个位置就好了,只要存储空间够大总会有位置放的(但是这样会产生堆积,因为他可能会把其他的原来属于别人的位置只是暂时空着的给占了)

  • 二次探测法:冲突了就放在1或者2或者3等等的平方后的位置,而不是像前面那样就是单纯的不停地加1,这样就可以不让关键字对集中在一块地方

  • 伪随机探测法:用一个种子产生一个随机数来作为位移量来避免冲突,然后最后查找这个数在不在的时候也用这个种子生成随机数来找

当散列表存在"堆积"(在函数地址的表中,散列函数的结果不均匀地占据表的单元,形成区块)的情况时,使用开放定址法的效率大大降低,此时不能再使用开放定址法

  • 单链表法:将散列地址值一样的键值对保存在一个链表中。

  • 再散列:在上次散列计算发生冲突时,利用该次冲突的散列函数地址产生新的散列函数地址,直到冲突不再发生。这种方法不易产生"堆积",但增加了计算时间。

  • 公共溢出区:将所有冲突的键值对放在一个数组中。查找时如果在散列表中没有找到就在数组中顺序查找。

散列表的查找效率


在理想情况下,散列表建立过程中没有出现冲突,那么在散列表中查找的效率则为O(1)。但是这仅是理想情况,散列冲突会影响查找效率,那么影响查找效率的因素就是影响产生冲突的因素:

  • 散列函数是否均匀(均匀散列函数是指对于键值对中任意一个键(KEY)经过散列函数得到任意一个地址的概率是相等的

  • 处理散列冲突的方法

  • 散列表的载荷因子

其中散列表的载荷因子计算公式为 α = 表中元素个数/表长度

α 越大,产生冲突的可能性就越大。当 α 超过0.8时,冲突产生的可能性按指数上升,因此一些开放定址法的 hash 将 α 限制在0.75,超过0.75就会重新调整大小,将散列表扩大至原来的两倍。

posted @ 2019-09-26 17:03  ITs-WHY  阅读(738)  评论(0编辑  收藏  举报