hashmap
-
haspmap是啥
-
haspmap什么时候用
-
运用场景及后续
hash函数的构造方法
-
直接定制法:所谓直接定址法就是说,取关键字的某个线性函数值为散列地址,即
优点:简单、均匀,也不会产生冲突。 缺点:需要事先知道关键字的分布情况,适合查找表较小且连续的情况。
由于这样的限制,在现实应用中,此方法虽然简单,但却并不常用。
-
数字分析法:如果关键字时位数较多的数字,比如11位的手机号"130****1234",其中前三位是接入号;中间四位是HLR识别号,表示用户号的归属地;后四为才是真正的用户号。如下图所示。
-
平方取中法: 这个方法计算很简单,假设关键字是1234,那么它的平方就是1522756,再抽取中间的3位就是227,用做散列地址。
平方取中法比较适合不知道关键字的分布,而位数又不是很大的情况。(常用)
-
除留余数法:用关键字取余(常用)
-
折叠法:将关键字分割成位数相同的几部分(最后一部分的可以不相同)然后取这几部分的叠加和(舍去进位)作为hash地址。关键字位数很多,而且关键字中的每一位上数字分布大致均匀时,可以采用折叠法得到hash地址[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eohzn1QE-1590744897747)(D:\图片\博客图片\1B3D10EC5EF5B7A6FDF1903B4A1E4FCC.jpg)]
-
随机数法:选择一个随机函数,取关键字的随机函数值为他的hash地址即H(key)=random,其中random为随机函数。通常关键字长度不等时采用这种方法。
-
解决冲突
1. 线性探测
3. 链地址(拉链法)
## 哈希查找
(构造hash函数用什么方法就用什么函数查找)
1. 判断是否为空
2. 运用hash函数算出hash地址比较关键字是否相等
3. 冲突解决:线性探测,二次探测,拉链法
4. 直至end
#### (1)线性探测
顾名思义就是按照线性探测一个一个探测,算出hash的地址然后比较关键字是否相等,不相等的将hash地址加一直至结束。
### (2)二次探测
求出hash地址将地址上的关键字相比较,不等加1^2再不等加-1^2再不等加2^2.....直至结束
### (3)拉链法
求出hash地址将地址上的链表关键字相比较,不等的话再看相同哈希地址上的下一位关键字直至结束。
### ASL
为平均查找长度
决定ASL的因素:散列函数,处理冲突的方法,散列表的装填英子。
装填因子=填入记录数/hash长度(见书260页)