hashmap算法复杂度为什么为O(1)

作者&投稿:伊果 (若有异议请与网页底部的电邮联系)
为什么顺序查找的复杂度是O(n),但是Hash查找就是O(1)?~

因为hash相当于给每个元素存了一个地址。
为什么在数组这样的数据结构中查找元素不可能达到O(1)?因为数组只存了首元素的地址,只能往后搜或者知道数组长度的话还可以优化一下,但肯定达不到常数复杂度。
而hash在查找元素的时候,利用hash函数算出相应值的地址,不需要遍历查找。hash查找时间也不一定是O(1),最也可能是O(n)。

不正确,执行该算法时需要空间
O(1)表示该程序所占用的空间和所用数据量无关。
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。
如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)

因为hashMap内部维护了一个Entry数组,hashcode即数组下标,根据key.hashcode()即可在数组中get到Entry对象,即O(1)。当然,这是理想情况。
倘若数据量大,则可能发生hash碰撞,即一个hashcode可能对应多个key,这时候这个Entry数组中的元素就不是Entry了,而是一个Entry链表。调用map.get(key)的时候,遇到了链表,则会遍历链表,调用equals方法比较key。当然,jdk8做了优化,链表长度超过8的时候,会转变为红黑树结构。当然,除了数据量之外,发生hash碰撞的概率还跟负载因子loadFactor有关。

下面是JDK实现containsKey的主要代码: int hash = hash(k); int i = indexFor(hash, table.length); Entry e = table[i]; while (e != null) { if (e.hash == hash && eq(k, e.key)) return true; e = e.next; }containsValue的复杂度是O(n),对于hashmap,value是依赖于key的,所以只能遍历整个集合。以下是JDK实现的主要代码:Entry[] tab = table; for (int i = 0; i < tab.length ; i++) for (Entry e = tab[i] ; e != null ; e = e.next) if (value.equals(e.value)) return true; return false;


hashmap和hashtable的区别
2、Hashtable:HashTable中hash数组默认大小是11,增加的方式是 old*2+1。二、线程安全不同 HashMap不是线程安全的,HashTable是线程安全。HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。三、null不同 ashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

hashmap和hashtable的区别
2、Hashtable:HashTable中hash数组默认大小是11,增加的方式是old*2+1。二、线程安全不同 HashMap不是线程安全的,HashTable是线程安全。HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。三、null不同 ashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

hashtable和hashmap的区别
2、Hashtable:HashTable中hash数组默认大小是11,增加的方式是 old*2+1。二、线程安全不同 HashMap不是线程安全的,HashTable是线程安全。HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。三、null不同 ashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

黄冈市19524107303: Java HashMap 复杂度的问题 -
符绍健脾: containsKey的复杂度是O(1),它是直接根据给定的参数key来计算hashcode,看看相关位置上是否有.如果相关位置已被占用,就继续寻找下一个位置.下面是JDK实现containsKey的主要代码:int hash = hash(k);int i = indexFor(hash, table....

黄冈市19524107303: 时间复杂度O与空间复杂度O是什么意思 -
符绍健脾: 如果你学过数据结构的话,应该会有所了解,这两个值,是在处理一个数据时,所花费的时间和内存占用空间大小,进而来优化算法的.比如数据的排序,有很多算法,有不同的时间和空间复杂度.

黄冈市19524107303: java HashMap 最多放多少个key 不影响查询效率 -
符绍健脾: 查询效率和有多少个key没关系.而且查询效率这个词是相对的,不是绝对意义上的. 理论上来说,map保存的key越多,查询越慢(查询所消耗的时间越多,而且这是一定的).但是同等数量的数据(比如100000条),map的查询速度要比数组要快.

黄冈市19524107303: HashMap和HashSet的区别 -
符绍健脾: hash是一种很常见也很重要的数据结构,是用hash函数根据键值(key)计算出存储地址,以便直接访问.由完美hash函数(即键值和地址是一一对应的)计算出的地址,在访问时,时间复杂度为O(1). Java的Object对象提供了...

黄冈市19524107303: TreeMap和TreeSet的区别与联系 -
符绍健脾: TreeMap和TreeSet的区别与联系 TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类.虽然 TreeMap 和TreeSet 实现的接口规范不同,但 TreeSet...

黄冈市19524107303: 数据结构与算法 算法的时间复杂度是怎么求的 -
符绍健脾: 就是求一个多项式,比如for(i=0;i<n;i++); 这里做的次数是n次,那么这个复杂度就是O(n) for(i=0;i<n;i++)for(j=i+1;j<n;j++); 这里做的次数是(n+1)*n/2 最高阶是n^2所以复杂度是O(n^2)

黄冈市19524107303: 为什么见周围人描述算法复杂度都用大 O 符号而不是大 Θ -
符绍健脾: 因为更多时候复杂度都是一个上限值,比如说冒泡排序,O(n^2),但细心的你会发现在优化算法并给入特定输入参数的时候,该排序的复杂度可以达到O(n).详见《算法导论》第三版(机械工业出版社),第27页O记号.

黄冈市19524107303: KMP模式串特征向量算法时间复杂度为O(m)? -
符绍健脾: 算法复杂度是o(m),而是o(m+n)如果从字符串S中匹配字符串T要先对T进行遍历,求一个next数组根据next数组匹配的时候,当出现Si!=Tj时,下一次的比较应该是Si和Tnext[j]进行比较,不需要回溯因此,时间复杂度O(strlen(s)+strlen(t))

黄冈市19524107303: Android 中ArrayList和LinkedList有什么区别 -
符绍健脾: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦 LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存...

黄冈市19524107303: 什么是算法复杂度 -
符绍健脾: 算法复杂度,即算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源. 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法.一个算法的...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网