Hash表的时间复杂度为什么是O(1)?

hash表的时间复杂度】hash表的时间复杂度为什么是O(1)?能回答这个问题的答案之前,肯定必须先了解hash表的数据结构。如下图所示:

  Hash表的时间复杂度为什么是O(1)?_第1张图片

     如图中清晰可知,hash表是基于数组+链表的实现的。数组在内存中是一块连续的空间,只要知道查找数据的下标就可快速定位到数据的内存地址,即数组查找数据的时间复杂度为O(1)。hash表的存储结构是的形式,数据读取时,只需提供key就可快速查找到value。hash表依据数组利用下标快读查找数据的特性来实现这样的查找方式的。也就是如上图中所示,hash表的物理存储其实是数组

     如果我们能够根据 key 计算出数组下标,那么就可以快速在数组中查找到需要的 key 和 value。那hash表示怎样实现的呢,如下图所示:

     Hash表的时间复杂度为什么是O(1)?_第2张图片

     由图中展示的一样,最简单的方法就是余数法,即使用 hash 表的数组长度对 key的hashCode 求余, 余数即为 hash 表数组的下标,使用这个下标就可以直接访问得到 hash 表中存储的 。但是如果不同的 key 计算出来的数组下标相同怎么办?于是就有了图一中所示的链表,它就是为了解决这个问题(所谓的hash冲突)而衍生的。这里需要注意的是 数据并不会直接存储在 Hash 表的数组中,因为数组要求存储固定数据类型,主要目的是每个数组元素中要存放固定长度的数据。所以,数组中存储的是 数据元素的地址指针。一旦发生 Hash 冲突,只需要将相同下标,不同 key 的数据元素添加到这个链表就可以了。查找的时候再遍历这个链表,匹配正确的 key。

你可能感兴趣的:(java)