散列原理
不同数据结构访问方式:循秩、循位置、循关键码、循值
Vector | List | BST | Hashing |
---|---|---|---|
rank | posi | key | value |
实例:设置散列表长M,实现key到value的映射,此处的hash函数为key对M取模余
1.散列表长M应与value总数N同阶同次
2.
λ
=
N
/
M
\lambda=N/M
λ=N/M称为填装因子
散列函数
M-A-D法
multiply-add-divide
平方取中
取key的平方的中间若干位,构成地址,这样原关键码中的各位对于最终的散列有平均的影响力
折叠汇总
伪随机数法
排解冲突
多槽位法
将每个桶划分为多个槽位
独立链
每个桶存放一个指针,冲突的词条组成列表
开放定址
为每个桶都事先约定好若干备用桶, 每一个桶单元面向所有词条开放,所有桶单元位于一段连续的内存空间
开放寻址法的核心思想是,如果出现了散列冲突,我们就重新探测一个空闲的位置
线性试探:当我们往散列表中插入数据时,如果某个数据经过散列函数之后,存储的位置已经被占用了,我们就从当前位置开始,依次往后查找(到底后从头开始),看是否有空闲位置,直到找到为止。
查找数据:通过散列函数求出要查找元素的键值对应的散列值,然后比较数组中下标为散列值的元素和要查找的元素是否相等,若相等,则说明就是我们要查找的元素;否则,就顺序往后依次查找。如果遍历到数组的空闲位置还未找到,就说明要查找的元素并没有在散列表中。
桶排序(计数排序)
复杂度为O(n+M),n为排序数量,M为元素取值范围,很多情况下M=O(n)或者远小于n,则可在线性复杂度O(n)内完成排序
思想:划分多个范围相同的子区间,每个桶为一个子区间,将各个元素分配到各个桶中,每个子区间再排序,最后合并
子区间(桶)个数自己决定