java中hashmap容器实现查找O(1)时间复杂度的思考
来源:互联网 发布:长征知识知多少 编辑:程序博客网 时间:2024/06/03 19:44
我一直有个疑问,为什么hashmap能够实现O(1)的查找复杂度。。纵使其存储了一些键值对<key,value>,那也只能保证你找到了key值之后,能够在O(1)事件内查询到value值。。而我的疑问是,怎么保证key值的查找也在O(1)事件内完成。而这也是整个hashmap中最关键的问题。
一、理解:
通过阅读jdk的源码,我对该问题的理解如下:
我们知道hashmap在存储键值对时借助了“数组+链表”的方式。
我们对一个键值对的查询,是分为四步的。
- 先根据key值计算出hash值以及h值(h值是java实现中处理得到的更优的index索引值)
- 查找table数组中的h位置,得到相应的键值对链表
- 根据key值,遍历键值对链表,找到相应的键值对,
- 从键值对中取出value值。
只有以上四步都能在O(1)时间内完成,hashmap才能拥有O(1)的时间复杂度。易知,步骤1(计算)、步骤2(数组的查找)和步骤4(从键值对中取value值)都可以在O(1)时间内完成。那么,步骤3中链表的长度决定了整个hashmap容器的查找效率,这也是hashmap容器设计的关键。必须采用优秀的hash算法以减少“冲突”,使得链表的长度尽可能短,理想状态下链表长度都为1。
二、结论:
- hashmap容器O(1)的查找时间复杂度只是其理想的状态,而这种理想状态需要由java设计者去保证
- 在由设计者保证了链表长度尽可能短的前提下,由于利用了数组结构,使得key的查找在O(1)时间内完成
- 可以将hashmap分成两部分来看待,hash和map。map只是实现了键值对的存储,也就是以上查询步骤的第4步。而其整个O(1)的查找复杂度很大程度上是由hash来保证的。
- hashmap对hash的使用体现出一些设计哲学,如:通过key.hashCode()将普通的object对象转换为int值,从而可以将其视为数组下标,利用数组O(1)的查找性能。
0 0
- java中hashmap容器实现查找O(1)时间复杂度的思考
- java中hashmap容器实现查找O(1)时间复杂度的思考
- 面试中关于HashMap的时间复杂度O(1)的思考
- java实现时间复杂度O(1)的LFU缓存
- java HashMap在不发生冲突的情况下get(key)时间复杂度是o(1)
- 关于时间复杂度O(N)的思考
- 用Lua实现插入、删除和查找时间复杂度为O(1)的集合
- 用Lua实现插入、删除和查找时间复杂度为O(1)的集合
- 从顺序表中删除所有值为x的元素(Java实现),要求时间复杂度O(n),空间复杂度O(1)
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- java中如何高效判断两个容器是否有相同元素(时间复杂度为O(1))
- 具有增删改 O(1)复杂度的和查找O(lg)复杂度的特定容器--用于特定特征的数据
- C++实现一个栈,出栈,入栈,返回最小值 时间复杂度为O(1),查找字符串中第一个重复出现的字符
- 【每日一题】查找一个字符串中第一个只出现两次的字符。要求时间复杂度为O(N),空间复杂度为O(1)
- 设计桟的 min、push以及pop的时间复杂度都是O(1) Java 实现
- 返回数组中任意某个重复的数字--时间复杂度O(n)空间复杂度O(1)
- 数组中未出现的最小正整数(时间复杂度O(N),空间复杂度O(1))
- Java 用两个队列实现一个栈,要求top()的时间复杂度为O(1)
- DWZ整合ZTREE
- android volume level adjustment
- pbzip2 安装与使用
- 使用Xcode 7 beta免费真机调试iOS应用程序
- Android贴吧系统学习-----对时间的处理方法
- java中hashmap容器实现查找O(1)时间复杂度的思考
- Android自动滚动 轮播循环的ViewPager
- Hadoop 2.0中用户安全伪装/模仿机制实现原理
- Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- jquery 表格中动态添加、删除行与子行(存在一点点小bug,待完善)
- 欢迎使用CSDN-markdown编辑器
- java static 作用
- Access语句语法
- Codevs 1044 拦截导弹