Hash表
散列(Hash)表
基本概念
- 基本思想:记录的储存位置与关键字之间存在对应关系
- 对应关系-hash函数
- Address(i) = H(key) 根据关键字函数映射
散列表的查找
1 | 根据散列表函数 H(key)=k |
正题
数值的哈希
Hash函数的作用就是通过对数据进行计算。得出存放该放该数据的对应位置。使得数据和存放位置相对应完成高效的查找。因此,Hash表的各种操作能否做到常数时间的关键就是Hash函数的构造。
取余法
用关键字key除于M的余数作为hash表中的位置函数表达式可以写成:h(k)=k%P ,适用于整数
乘积取整法
用关键字k除于一个在(0 ,1)中的实数A
(最好是无理数),得到一个(0 ,k)之间的实数;取出小数部分 ,乘以M,再取整数部分 ,即得k在Hash表中位置。函数表达式为:这类函数适用于小数
冲突处理法
散列表会有冲突,即多个不同的关键值对应同一个索引,所以需要设计一些结构去解决这些冲突
挂链法(Separate Chaining)
挂链法是一种解决冲突的方法。具体来说就是当有两个不同键值对应的索引相同的是,用链表去把它们连起来。
当查询/插入/删除一个元素时 ,只需要进入对应链表暴力查询/插入/删除即可。
开放地址法
在开放地址法中,所有的元素都被直接散列表,散列表中,而非像挂链法一样,在每个散列表的位置上再挂出去一条链。所以我们需要闪电表的大小不能小于插入的元素个数。
开放地址法依赖于一个特殊的函数H(x ,k) ,它指明了如果前K次尝试访问位置都被占住,那么下一个应该尝试访问哪个位置。
特殊的,我们不能简单将一个元素从散列表中删除。因为这可能会使部分元素在将再不能被查询到,所以我们只能将它打上删除标记及标记为“已删除”。当尝试插入“已删除”的位置时就插入。查询时则并不在“已删除”的位置停下,而是接着通过H(x ,k)。尝试下一次访问。
评论
TwikooUtterances