大话数据结构读书笔记(6)----散列表(哈希表)

1、定义

散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。
这里把对应关系f称为散列函数,又称为哈希(Hash)函数。采用散列技术将记录存储在一块连续的内存空间中,这块连续存储空间称为散列表或哈希表(hash table)。

散列技术既是一种存储方法,也是一种查找方法。线性表,树,图等结构数据元素之间存在某种逻辑关系,散列技术的记录之间不存在逻辑关系,只与关键字有关。因此,散列主要是面向查找的存储结构。
散列技术最适合的求解问题是查找与给定值相等的记录。对于查找来说,简化了比较过程,效率会大大提高,但散列技术也不具备很多常规数据结构的能力。如果碰到两个关键字key1≠key2,但是却有f(key1)=f(key2),这种现象我们称为冲突(collision),并把key1和key2称为散列函数的同义词(synonym)。

2、散列函数的构造方法

散列函数需要参考两个原则
1)计算简单
可以保证查找的效率,计算时间不应该超过其他查找技术与关键字比较的时间。
2)散列地址分布均匀
尽量让散列地址均匀地分布在存储空间中,可以保证存储空间的有效利用,减少为处理冲突而耗费的时间。

散列函数的构造方法
1)直接定址法
取关键字的某个线性函数值为散列地址,即
f(key)=a*key+b
2)数字分析法
比如用某公司员工的手机号作为关键字,可以选择后四位为散列地址,如果冲突较多,可以采取翻转、循环移位、位数叠加等方法,合理将关键字分配到散列表的各位置。
3)平方取中法
假设关键字为1234,平方就是1522756,取中间三位为227用做散列地址。平方取中法比较适合于不知道关键字的分布,而位数也不是很大的情况。
4)折叠法
折叠法是将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。
5)除留余数法
对于散列表长为m的散列函数公式为:
f(key)=key mod p (p<=m)
6)随机数法
取关键字的随机函数值为它的散列地址。f(key)=random(key)。

3、处理散列冲突的方法

1)开放地址法
产生冲突之后,就寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。公式为:
这里写图片描述
2)在散列函数法
3)链地址法
大话数据结构读书笔记(6)----散列表(哈希表)_第1张图片
链地址法提供了绝对不会出现找不到地址的保障。

你可能感兴趣的:(计算机体系结构,c-c++)