散列表
定义
维基百科定义:[ 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表 ]
一句话说:散列的实质就是在元素的存储位置和它的关键码(key)之间建立一种函数映射关系。使得关键码和存储位置一一对应:
Address=hash(key)
散列函数
- 取余法(或者叫除留余数法),常用
- 数字分析法
- 平方取中法(mid-square)
- 折叠法
取余法的散列函数表示为:
hash ( key ) = key % p p<=m
除数选择:设散列表允许的地址数为m,取一个不大于m,但是最接近或等于m的质数p作为除数。
冲突解决技术
因为不同的key,可能散列之后映射到相同的地址,所以冲突解决是很有必要的。冲突解决可以分为两类:
- 开散列方法 ( open hashing,拉链法,separate chaining,链地址法)
- 闭散列方法 ( closed hashing,开地址方法,open addressing )。
- 线性探查法 (linaer probing)
- 二次探查法 (quadratic probing)
- 双散列法
区别:开散列法把发生冲突的关键码存储在散列表主表之外,而闭散列法把发生冲突的关键码存储在表中另一个槽内。
- 搜索成功的平均搜索长度ASL: 是指搜索到表中已有元素的平均探查次数;
- 搜索不成功的平均搜索长度ASL:是指在表中搜索不到待查的元素,但找到插入位置的平均探查次数。即从每个位置起到第一个为空的位置时的探查次数的和的平均数。
注:内容大部分是对《数据结构 / 殷人昆》散列表的总结。