06-哈希表

基本介绍

散列表(Hash table,也叫哈希表 ),是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中 一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放的数组叫做散列表。时间复杂度接近于O(1)。

哈希介绍

hash-散列

散列可以通过一定的计算规则,使得集合中的元素可以分类排列,从而快速查找。

哈希函数介绍

哈希的过程中需要使用哈希函数进行计算。

哈希函数是一种映射关系,根据数据的关键词 key ,通过一定的函数关系,计算出该元素存储位置的函数。

  • 直接地址法
  • 除留余数法
  • 数字分析法

哈希冲突

选用哈希函数计算哈希值时,可能不同的key会得到相同的结果。

解决方法

拉链法

将所有关键字为近义词的结点链接在同一个单链表中

hashmap中解决hash冲突的方式就是拉链发,且装填因子为0.75。

装填因子指的是单链和主链的比例。
06-哈希表_第1张图片

开放地址法

用开放定址法解决冲突的做法是:当冲突发生时,使用某种探测技术在散列表中形成一个探测序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探测到开放的地址则表明表中无待查的关键字,即查找失败。

当冲突发生时,使用某种探查(亦称探测)技术在散列表中寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到

按照形成探查序列的方法不同,可将开放定址法区分为线性探查法、二次探查法、双重散列法等。

Java中,ThreadLocal所使用的就是开放寻址法。

影响哈希冲突的因素

  1. 哈希函数是否均匀;
  2. 处理冲突的方法;
  3. 哈希表的加载因子。

哈希表的加载因子和容量决定了在什么时候桶数(存储位置)不够,需要重新哈希。

加载因子太大的话桶太多,遍历时效率变低;太大的话频繁 rehash,导致性能降低。所以加载因子的大小需要结合时间和空间效率考虑。

你可能感兴趣的:(#,数据结构和算法)