Space 在 ArrayList 或 Map 中添加树/图的 n 个节点的复杂度
Space complexity of adding n nodes of a tree / graph in an ArrayList or Map
假设我们有一个二叉树
class node {
int data;
node left;
node right;
}
现在假设我创建了一个 ArrayList<node>
并在其中添加了所有 n 个节点,它的复杂度是常量 space 还是 n
?
我的困惑是,由于 node
不是原始数据结构而是对象,它必须使用 CALL BY REFERENCE
,因此它不应该使用额外的 space 来更改某些数据在节点的 class 实例中,也在 ArrayList<>
中进行更改。
此外,我推测 ArrayList<type> abc = xyz; //another arraylist of same type
使用 CALL BY REFERENCE
因此它使用常量 space,但是 ArrayList<type> abc = new ArrayList<>(xyz)
创建了一个新实例因此它应该使用额外的 space.
现在,当我在 ArrayList<node>
中添加 class 个实例时,我必须使用 new
关键字初始化数组列表, ArrayList<node> abc = new ArrayList<>();
在我将实例添加到列表。所以它应该使用额外的 space 但是因为我们正在使用已经在树中定义的 class 实例并且树中的任何更改也会反映在列表中,因此它应该使用常量 space。以上哪一个是正确的,我哪里错了?
EDIT :我知道即使是引用也会占用一些space,但不会比实际占用的内存少很多吗space最初的对象?
node is not a primitive data structure but an object
Java 中没有对象 variables/fields。只有原始变量和参考变量。
it must use CALL BY REFERENCE
Java 仅按值调用。基元按值传递,引用按值传递。
when I am adding class instances in ArrayList
Java 不支持此功能。您只能添加引用。
So it should use extra space
只有添加的引用使用额外的 space。对象未被复制。
space 复杂度当然是 n
的函数,而不是常数。这是因为即使 ArrayList 只包含对树对象的引用,这些引用本身也会占用 space(我不是 JVM 专家所以我不确定确切的数量,但它只是几个字节) .当然引用占用的space会比对象本身占用的少很多,但还是会占用space.
编辑:
明确地说,如果您问的是 ArrayList 占用的空间是否 space 少于对象本身,那么是的,确实如此,但那是 而不是 space 复杂性意味着什么。 Space 复杂性与存储数据需要多少 space 无关,而是关于 space 要求如何随着数据的增长 乘以 。当我说 space 复杂度是 O(n) 或 线性 时,我的意思是 ArrayList 大小按比例增加 与对象的数量。对象数量的两倍使 ArrayList 的大小增加一倍,对象数量的五倍使 ArrayList 的大小增加五倍,依此类推。 常数 或 O(1) 复杂度意味着,即使您可能需要额外的 space,space 的数量你需要保持不变,不会随着你添加项目而增加。
我相信你真正想问的是 "Will adding an ArrayList double my space requirements, or will it require no extra space?" 而我对两者的回答是否定的。它不会加倍 space 要求,因为它只使用引用,但它需要 一些 额外的 space 来存储这些引用。这与 space 复杂性无关。
TLDR: Space 要求 ≠ Space 复杂性.
假设我们有一个二叉树
class node {
int data;
node left;
node right;
}
现在假设我创建了一个 ArrayList<node>
并在其中添加了所有 n 个节点,它的复杂度是常量 space 还是 n
?
我的困惑是,由于 node
不是原始数据结构而是对象,它必须使用 CALL BY REFERENCE
,因此它不应该使用额外的 space 来更改某些数据在节点的 class 实例中,也在 ArrayList<>
中进行更改。
此外,我推测 ArrayList<type> abc = xyz; //another arraylist of same type
使用 CALL BY REFERENCE
因此它使用常量 space,但是 ArrayList<type> abc = new ArrayList<>(xyz)
创建了一个新实例因此它应该使用额外的 space.
现在,当我在 ArrayList<node>
中添加 class 个实例时,我必须使用 new
关键字初始化数组列表, ArrayList<node> abc = new ArrayList<>();
在我将实例添加到列表。所以它应该使用额外的 space 但是因为我们正在使用已经在树中定义的 class 实例并且树中的任何更改也会反映在列表中,因此它应该使用常量 space。以上哪一个是正确的,我哪里错了?
EDIT :我知道即使是引用也会占用一些space,但不会比实际占用的内存少很多吗space最初的对象?
node is not a primitive data structure but an object
Java 中没有对象 variables/fields。只有原始变量和参考变量。
it must use CALL BY REFERENCE
Java 仅按值调用。基元按值传递,引用按值传递。
when I am adding class instances in ArrayList
Java 不支持此功能。您只能添加引用。
So it should use extra space
只有添加的引用使用额外的 space。对象未被复制。
space 复杂度当然是 n
的函数,而不是常数。这是因为即使 ArrayList 只包含对树对象的引用,这些引用本身也会占用 space(我不是 JVM 专家所以我不确定确切的数量,但它只是几个字节) .当然引用占用的space会比对象本身占用的少很多,但还是会占用space.
编辑:
明确地说,如果您问的是 ArrayList 占用的空间是否 space 少于对象本身,那么是的,确实如此,但那是 而不是 space 复杂性意味着什么。 Space 复杂性与存储数据需要多少 space 无关,而是关于 space 要求如何随着数据的增长 乘以 。当我说 space 复杂度是 O(n) 或 线性 时,我的意思是 ArrayList 大小按比例增加 与对象的数量。对象数量的两倍使 ArrayList 的大小增加一倍,对象数量的五倍使 ArrayList 的大小增加五倍,依此类推。 常数 或 O(1) 复杂度意味着,即使您可能需要额外的 space,space 的数量你需要保持不变,不会随着你添加项目而增加。
我相信你真正想问的是 "Will adding an ArrayList double my space requirements, or will it require no extra space?" 而我对两者的回答是否定的。它不会加倍 space 要求,因为它只使用引用,但它需要 一些 额外的 space 来存储这些引用。这与 space 复杂性无关。
TLDR: Space 要求 ≠ Space 复杂性.