面试中关于HashMap的时间复杂度O(1)的思考
来源:互联网 发布:二次供水设备厂家 知乎 编辑:程序博客网 时间:2024/06/18 03:20
今天在面试的时候说到HashMap,面试官问了这么一个问题:你说HashMap的get迭代了一个链表,那怎么保证HashMap的时间复杂度O(1)?链表的查找的时间复杂度又是多少?
在这之前我是阅读过HashMap的源码的:Java7源码浅析——对HashMap的理解
由上一个博客可知我们对HashMap的查询,如源代码所示:
public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }
分四步:
1.判断key,根据key算出索引。
2.根据索引获得索引位置所对应的键值对链表。
3.遍历键值对链表,根据key找到对应的Entry键值对。
4.拿到value。
分析:
以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突,才能使链表长度尽可能短,理想状态为1。因此可以得出结论:HashMap的查找时间复杂度只有在最理想的情况下才会为O(1),而要保证这个理想状态不是我们开发者控制的。
3 0
- 面试中关于HashMap的时间复杂度O(1)的思考
- java中hashmap容器实现查找O(1)时间复杂度的思考
- java中hashmap容器实现查找O(1)时间复杂度的思考
- 关于时间复杂度O(N)的思考
- 时间复杂度O(n),空间复杂度O(1)的排序
- 返回数组中任意某个重复的数字--时间复杂度O(n)空间复杂度O(1)
- 数组中未出现的最小正整数(时间复杂度O(N),空间复杂度O(1))
- java HashMap在不发生冲突的情况下get(key)时间复杂度是o(1)
- 面试9:时间复杂度为O(n)的排序算法
- 关于算法的时间复杂度问题的思考
- 关于程序的运算时间复杂度的一点思考
- 数组中只出现一次的数字,时间复杂度O(n),空间复杂度O(1)的解法
- 数组中重复的数字(剑指offer)+时间复杂度O(n)空间复杂度O(1)的想法
- 关于中位数的时间复杂度为什么是O(n)
- 统计数组中每个元素出现的个数,时间复杂度 O(n),空间 O(1)
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- 人人都来写算法 之 移除字符串中重复的字符,时间复杂度要求O(n),空间复杂度O(1)
- 在O(n)时间复杂度O(1)空间复杂度求一个数组中出现多次和未出现的数字
- oracle Trace File Analyzer (TFA)使用方法(含BUG解决)一
- 深入浅出ES6(十一):生成器 Generators,续篇
- [uboot] uboot启动kernel篇(一)——Legacy-uImage & FIT-uImage
- 安装python 时出现no acceptable C compiler found in $PATH问题
- python 生成词云
- 面试中关于HashMap的时间复杂度O(1)的思考
- centos 6.5 安装历程
- 面试被虐系列_算法分析篇_排序算法
- MySQL数据库(一)---安装、配置、使用
- 矩阵、向量求导(未完)
- 数据迁移后的迁移结果比对方法
- Linux相关权限
- QQ邮箱接收MIMEText的内容为空
- Fragment系列(三)