目录
1.什么是散列表
2.散列的主要作用
3. 散列表的查找步骤
4.散列函数的设计
4.1直接定址法
4.2 数字分析法
4.3 平方取中法
4.4 折叠法
4.5 除留余数法
4.6 随机数法
1.什么是散列表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中
一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,
函数f(key)为哈希(Hash) 函数或者哈希函数。
散列技术之在记录的存储位置和它的关键字之间建立一个确定的关系f,使得每个关键字key对应一个存储
位置f(key),这个地址是唯一的.
提炼:
散列表是面向查找的存储结构.
2.散列的主要作用
1.存储;
2.查找.
3. 散列表的查找步骤
1.当存储记录时,通过散列函数计算出记录的散列地址;
2.当查找记录时,我们通过同样的时散列函数计算记录的散列地址,并按此散列地址访问该记录.
(唯一的关键字对应唯一的地址,不需要进行任何比较和交换,散列技术即是一种存储方法,也是一种查找方法,散列的记录之间是没有关系的,查找唯一值的效率特别高-直接通过函数就可以了.)
4.散列函数的设计
散列函数的设计原则:
1.计算简单;
2.分布均匀(计算出来的散列地址需要分布均匀).
设计散列函数需要考虑的点:
1.计算散列地址需要的时间;
2.关键字的长度;
3.散列值的大小;
4.关键字的分布情况;
5.记录查找的频率.
下面介绍一些设计散列函数的方法:
4.1直接定址法
f(key) = akey+b
虽然简单,但是并不常用.
例一:例如有一个从1-100岁的人口数字统计表,f(key) = key
| 地址 | 年龄 | 人口 |
| 00 | 0 | 500万 |
| 01 | 1 | 650万 |
| 02 | 2 | 450万 |
| ... | ...... | ...... |
| 20 | 20 | 1500万 |
| ... | ...... | ...... |
例二:需要统计1980年以后出生的人口数,f(key)=key-1980
| 地址 | 出生年份 | 人口 |
| 00 | 1980 | 1500w |
| 01 | 1981 | 1600w |
| 02 | 1982 | 1300w |
| ...... | ...... | ...... |
| 20 | 2000 | 1500w |
4.2 数字分析法
数字分析法通常适合处理关键字位数比较大的情况,如果我们现在要存储某家公司员工登记表,如果用手机作为
关键字,那么我们发现抽取后的四位数字作为散列地址也是不错的选择(当然也要满足一定的条件才能这么做)
通过来说,比如说小明的电话号码是18701931234,那么187是运营商接入号,0193是地区识别码,1234是真正的用户编号,那么如果这个公司的员工电话号码的运营商接入号和地区识别码都是一样的,那么后面思维数字作为散列地址可以说很香了.
4.3 平方取中法
平方取中法是将关键字平方之后取中间若干位数字作为散列函数,事先不知道关键字的分布且位数不是很大的情况.
4.4 折叠法
折叠法是将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并按照散列表表长取后几位作为
散列地址.事先不知道关键字的分布,知道关键字位数比较多的.
4.5 除留余数法
此方法位最常用的构造散列函数的方法,对于散列长度为m的散列函数计算公式为:
f(key) = key mod p(p<m)
4.6 随机数法
选择一个随机数,取关键字的随机函数值为它的散列地址,即f(key) = random(key),
这里的random是随机函数,当关键字的长度不等时,采用这个方法构造散列函数是比较合适的.