字符串哈希的java哈希映射的复杂性

字符串哈希的java哈希映射的复杂性,java,complexity-theory,time-complexity,Java,Complexity Theory,Time Complexity,我在HashMap类中查看java源代码 final int hash(Object k) { int h = 0; if (useAltHashing) { if (k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h = hashSeed; } h ^= k.hashCode(); 那么

我在HashMap类中查看java源代码

final int hash(Object k) {
    int h = 0;
    if (useAltHashing) {
        if (k instanceof String) {
            return sun.misc.Hashing.stringHash32((String) k);
        }
        h = hashSeed;
    }

    h ^= k.hashCode();
那么,hashmapObject.put(“somestring”)的时间复杂度是多少? 是O(1)还是O(n),其中n是字符串中的字符数。

在最坏的情况下(实际上,这种情况很少发生,只有当我们有一个糟糕的哈希函数时才会发生)hashmap中的
put
方法的复杂性是
O(n)
,因为尽管我们将元素添加到链表的开头(
O(1)
)但是我们仍然需要遍历bucket(链表)来确定新元素是否已经存在。
更新: 根据Java8中的注释,its
O(logn)
。本优化仅作简要说明 当bucket的大小超过阈值时,树映射的特殊实现被用作bucket。阈值由变量
static final int treefyu threshold=8设置

在最坏的情况下(实际上,这种情况很少发生,只有当我们有一个糟糕的散列函数时)HashMap中的
put
方法的复杂性是
O(N)
,因为尽管我们在链表的开头添加了元素(
O(1)
),但我们仍然需要循环遍历bucket(链表)以确定新元素是否已存在。
更新: 根据Java8中的注释,its
O(logn)
。这个优化只是简单地描述了一下
当bucket的大小超过阈值时,树映射的特殊实现被用作bucket。阈值由变量
static final int TREEIFY_threshold=8;
HashMap.java

中设置。它是O(1)w.r.t。映射的大小通常是感兴趣的。它是O(N)w.r.t.字符串的长度。

它是O(1)w.r.t.映射的大小,这通常是人们感兴趣的。它是O(N)w.r.t.字符串的长度。

HashMap
添加一些东西保证是
O(1)
(假设完美的哈希分布)。您的哈希函数可能是
O(无论什么)
虽然…你的
等于
…检查此输出向
哈希映射添加一些东西
保证是
O(1)
(假设完美的哈希分布)。你的哈希函数可能是
O(无论什么)
尽管…你的
等于
…检查此输出哈希映射(或哈希表)是一个关联数组。它可以用链表实现,但我不相信Java是。顺便说一句,我没有否决投票。尽管如此,你的答案没有错。只是可以更准确。你说的
put
函数有一个更坏的情况,即
O(n)
@controlnetictwerkguroorc java中的bucket是linkedList(不是java.util.linkedList,而是更简单的版本)。还有一个变量表,它实际上是一个包含类型为的对象的数组linkedList@CyberneticTwerkGuruOrcJava
HashMap
使用链表的一个版本来允许在同一个bucket中有多个项。最坏情况下的复杂性只有在哈希函数退化时才会发生——值得一提。hash map(或哈希表)是一个关联数组。它可以用链表实现,但我不相信Java是。顺便说一句,我没有否决投票。尽管如此,你的答案没有错。只是可以更准确。你说的
put
函数有一个更坏的情况,即
O(n)
@controlnetictwerkguroorc java中的bucket是linkedList(不是java.util.linkedList,而是更简单的版本)。还有一个变量表,它实际上是一个包含类型为的对象的数组linkedList@CyberneticTwerkGuruOrcJava
HashMap
使用链表的一个版本来允许在同一个bucket中包含多个项。最糟糕的情况是,只有当哈希函数退化时才会出现复杂性——值得一提的是。