散列表
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。
我们把这种对应关系f称为散列函数,又称为哈希(Hash)函数。
散列表(哈希表):即采用散列技术将记录存储在一块连续的存储空间中,这个空间即为散列表。关键字对应的记录存储位置为散列地址。
散列函数的构造方法
原则:
1,计算简单:尽量减少散列函数的计算时间
2,散列地址分布均匀:尽量让散列地址均匀地分布在存储空间中,这样可以保证存储空间的有效利用,并减少为处理冲突而耗费的时间。
方法:
1,直接定址法:f(key)=key,f(key)=a*key+b
2,数字分析法:利用数字的特性选择部分数字作为关键字,适合关键字位数比较大的情况,如果事先知道关键字的分布且关键字的若干位分布较均匀,就可以考虑用这个方法。
3,平方取中法:关键字平方,再取中间几位数字
4,折叠法:将关键字从左到右分割成位数相等的几部分,然后叠加求和,并按散列表表长,取后几位作为散列地址。此方法事先不需要知道关键字的分布,适合关键字位数较多的情况。
5,除留余数法: f(key)=(key) mod p (p<=m)
6,随机数法:选择一个随机数,取关键字的随机函数值为它的散列地址。即f(key)=random(key)
所以应当根据不同的情况采用不同的散列函数
1,计算散列地址所需的时间
2,关键字的长度
3,散列表的大小
4,关键字的分布情况
5,记录查找的频率
处理散列冲突的方法
1,开放定址法:f(key)=(f(key)+d) mod m
2,再散列函数法:结合多个散列函数计算,若冲突,换另一个散列函数
3,链地址法:每个关键字以单链表的方式存放
4,公共溢出区法:为所有冲突的关键字建立了一个公共的溢出区来存放。(若散列表查找不到数据,则在溢出表顺序查找)
散列表查找实现
其中定义散列表表结构,初始化散列表,散列函数的选择及使用,插入关键字,查找关键字,鉴于代码比较简单,不再写出。
reference:《大话数据结构》