首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HashMap空间复杂度

HashMap空间复杂度
EN

Stack Overflow用户
提问于 2017-04-16 04:27:22
回答 1查看 21.4K关注 0票数 10

下面是一个解决"在每个节点中填充下一个右指针“难题的示例解决方案:

填充每个下一个指针以指向其下一个右节点。如果没有下一个右节点,则应将下一个指针设置为空。

代码语言:javascript
复制
public void connect(Node root) {
    HashMap<Integer,List<Node>> map = new HashMap<Integer,List<Node>>();
    traverse(root, map , 0);
}

private void traverse(Node root, HashMap<Integer,List<Node>> map , int level){

    if(root != null){

        if(map.containsKey(level)){
            List<Node> temp = map.get(level);
            Node set = temp.get(temp.size() -1 );
            set.next = root;
            root.next = null;
            temp.add(root);
            map.put(level,temp);
        }
        else{
            root.next = null;
            List<Node> temp = new ArrayList<Node>();
            temp.add(root);
            map.put(level,temp);
        }
        level++;
        traverse(root.left, map , level);
        traverse(root.right, map,level);
        System.out.println("test");
    }
}

解决方案本身并不重要,但我正在努力确定其空间复杂性:

从逻辑上讲,我们存储在HashMap中的对象类型应该对其空间复杂性产生影响,但是我们如何通过拥有映射的键和值来确定它呢?

换句话说,如果我们在这个映射中只存储5个键(5个节点),我们是否可以得出结论:HashMap<Integer,List<Node>> map = new HashMap<Integer,List<Node>>();的空间复杂性只是O(n),或者因为这些键的值是List,所以应该更多?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-16 04:32:54

既然我们在这个映射中只存储了5个键,那么我们可以得出这样的结论: HashMap> map =新HashMap>();的空间复杂性只是O(n),或者因为这些键的值是List,所以应该更多吗?

不是的。

HashMap的一般实现使用桶,它基本上是一个链表链,每个节点都包含<key, value>对。因此,如果您有重复的节点,这并不重要-它仍然将复制每个键与它的值在链表节点。

您可以找到不同的哈希表实现及其冲突解决技术这里

编辑

在这个例子中,我们有5个键和一组列表的每个关键点,但是我们是如何确定整个空间复杂性的呢?

大O符号中hashmap的空间复杂性是O(n),其中n是条目的数量。记住,大O表示法描述了随输入数增长的顺序,它没有反映算法所占的精确的数值空间。对于hashmap,随着条目数量的增加,hashmap的空间将线性增加。所以空间复杂性就是O(n)

但是,我认为您是在寻找hashmap所占用的确切空间,这完全取决于散列函数、键类型和值。在上面的图片中,所占的总空间是桶(散列)中的单元格数+每个桶/链接列表中的条目数,每个条目的大小为键类型的大小+值类型空间的大小。

HIH。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43433699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档