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

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

  加载中

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

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

     加载中

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

  • 18
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值