构造哈希函数与冲突解决办法

146 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

前言

前面讲了哈希查找表的相关概念,以及构造好的哈希函数和制定一个好的解决冲突的方案要解决的问题。今天就来解决这些问题。

构造哈希函数

要求:

  1. n个数据原仅占用n个地址,虽然散列查找是以空间换时间,但仍希望散列的地址空间尽量小
  2. 无论用什么方法存储,目的都是尽量均匀地存放元素,以避免冲突

常用的哈希函数构造方法有:直接定址法、除留余数法、乘余取整法、数字分析法、平方取中法、折叠法、随机数法

直接定址法

Hash(key) = a*key+b (a、b为常数)

优点:以关键码key的某个线性函数值为哈希地址,不会产生冲突

缺点:要占用连续地址空间,空间效率低

例:关键码集合为{100,300,500,700,800,900},取哈希函数为Hash(key)=key/100

image.png

除留余数法

Hash(key) = key mod p (p是一个整数)

特点:以关键码除以p的余数作为哈希地址

若哈希表长为m,取p值时一般p小于等于m且为质数

冲突解决办法

开放定址法

有冲突时就去寻找下一个空的哈希地址,只要哈希表足够大,空的哈希地址总能找到,并将数据元素存入

链地址法

将具有相同哈希地址的记录链成一个单链表,m个 哈希地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构。

例如:47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89的哈希函数为

image.png

注:有冲突的元素可以插在表尾,也可以插在表头。