【问题标题】:ArrayList containing references to TreeNodes, what is the space complexity?ArrayList 包含对 TreeNodes 的引用,空间复杂度是多少?
【发布时间】:2015-05-25 08:44:30
【问题描述】:
   TreeNode root = new TreeNode(5);
    ArrayList<TreeNode> arr = new ArrayList<TreeNode>();
    for(int i = 0; i < n; i++){
        arr.add(root);
    }

在上面的代码中,单个TreeNode 对象被添加到ArrayList&lt;TreeNode&gt; arr 中n 次。我认为arr 的空间复杂度应该为O(1),因为它保存了对堆上单个内存块的引用。我正在和我的朋友讨论这个问题,他们有不同的看法,认为它可能具有O(n) 复杂性。大家觉得呢?

【问题讨论】:

  • 答案取决于 n 是什么。
  • 你能详细说明你的答案吗?

标签: java object arraylist space-complexity


【解决方案1】:

您正在保存引用,但它们仍然是 n 个引用。我认为您实际上是在寻找将 n 个对象存储在ArrayList 中的内存开销。使用的内存可能会被实际对象支配,但仍然有一个长度为 n 的数组支持 ArrayList 保存引用。

【讨论】:

  • 如果我的 TreeNode 对象有非常大的内存(比如 500KB)分配给它,并且每个引用(这里是 Object 数据结构)不会占用接近 500KB 的任何地方,那么在这些情况下我应该说空间复杂度为 O(1)?因为与实际对象的内存相比,引用内存非常少。
  • 与对象实际使用的内存相比,引用使用的内存太小了,无法考虑。但是您必须将其视为 O(n),因为归根结底,它仍然是一个数组,如果 n 足够大,它就会计数。考虑将一个对象放入列表中大约 10k 次。只有 1 个对象和 10k 个引用。你现在看到了吗? O(n) 在那里,此时引用可能会使用比实际对象更多的内存。注意:10k 是任意数字。
【解决方案2】:

ArrayList 仍然需要存储引用 n 次,使得它成为 O(n)。

ArrayList 由Object[] 支持,如果您查看源代码

public boolean add(E e) {
    ensureCapacity(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

每当添加一个元素时,它都会添加到支持对象数组中。

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2014-01-01
    • 2015-06-06
    • 2020-03-10
    • 2018-07-23
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多