Java笔试题常见知识点:哈希函数和哈希冲突
哈希函数的构造方法有哪些?
直接定址法(适用于均匀哈希函数)
数字分析法(适用于关键字位数比哈希地址位数大,且关键字已知)
平方取中法
折叠法
除留余数法(一般笔试题都采用这种构造方法) H(key)=key mod p
随机数法
产生哈希冲突的影响因素有哪些:
哈希函数的选择
处理冲突的方法
哈希表的装填因子(装填因子=表中填入的记录数 / 哈希表长度)
处理冲突的方法
1.开放定址法
给一组关键字、H(key)=key mod p、哈希表长度和处理冲突的方法,如何构造出哈希表?
(1)线性探测再散列:di=1,2,3,…m-1
例题:关键字19,14,23,01,68,20,84,27,55,11,10,79,按H(key)=key mod 13和线性探测再散列方法处理冲突,请构造表长为16的哈希表
答:哈希表长为16(序号0~15)
每个关键字对13取余
19%13=6-----占据6号位置
14%13=1-----占据1号位置
…
遇到重复序号时,余数+1继续取余,还重复就把最开始的余数+2…直到序号不重复
(2)二次探测再散列:di=1^2, -1^2, 2^2, -22…k2,-k^2
和线性探测再散列类似,
只是遇到重复序号时,余数先+1^2,若还重复,就+(-1 ^2)…直到不重复
2.再哈希法
3.链地址法
4.建立一个公共溢出区
衡量哈希表查找效率的量度——平均查找长度(ASL)
已知一组关键字为(19,14,23,01,68,20,84,27,55,11,10,79),则按哈希函数H(key)=key mod 13和链地址法处理冲突的平均查找长度为?
每个关键字都对13取余,得到的余数决定该关键字连到哪个位置
构造出的哈希表如下:
竖着看,
第一列有6个元素,所以长度是16
第二列有4个元素,所以长度是24
第三列…
所以ASL=(16+24+31+41) / 12=1.75