赞
踩
散列表:
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
这个映射函数叫做 散列函数,存放记录的 数组 叫 做散列表。
散列表利用的是数组支持按照下标随机访问数据的特性(时间复杂度O(1)),所以散列表其实就是数组的一种扩展,由数组演化而来。
散列函数:
一个把查找表中的关键字映射成关键字对应的地址的函数,记为:Hash(key) = Addr
冲突:
散列函数可能把两个或两个以上的不同的关键字映射到同一地址,称这种情况为 “冲突”,这些发生碰撞的不同关键字称为 同义词。
取关键字或关键字的某个线性函数值为散列地址。散列函数:H(key) = key 或 H(key) = a·key + b,其中a和b为常数。
这种方法计算最简单,并且不会产生冲突。
假设散列表长度为m,取一个不大于m但最接近或等于m的质数p,散列函数:H(key) = key MOD p,p<=m。
对 p 的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。
当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。
拉链法:
HashMap 利用拉链法解决冲突的
将产生冲突的 hash 地址作为自变量,通过某种冲突解决函数得到一个新的空闲的 hash 地址。
线性探测法:
平方探测法:
即为所有冲突的关键字建立一个公共的溢出区来存放
在查找时,对给定值通过散列函数计算出散列地址后,先与基本表的相应位置进行比对
如果相等,则查找成功;如果不相等,则到溢出表去进行顺序查找
如果对于基本表而言,有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高
和装填因子有关。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。