簡體   English   中英

在while循環中聲明數組是否會影響空間復雜度

[英]Does declaring an array inside a while loop affects the space complexity

在 Java 中 - 假設我有一個運行 log n 次的 while 循環,因此時間復雜度為 O(logn),並且在該循環內,我在每次迭代時聲明一個大小為 2 的數組:

While (high > low)
Int[] arr = arrFunc(mid, 0);

因此,在每次迭代中,我們創建一個運行在前一個數組之上的數組,因為它被 java 垃圾收集器“銷毀”。 那么空間復雜度是 o(1) 嗎? 還是 o(logn)?

空間復雜度概念與語言無關。

在這里,由於您在每次迭代中都創建了一個新結構,因此您增加了同樣多的空間復雜度。

如果您的算法在時間復雜度上是O(log n) ,那么這部分的空間復雜度也是O(log n)

另外,不要忘記O是算法可能達到的上限。 這不是算法將使用的實際空間。


正如@luk2302正確指出的那樣,如果您的算法不是每次都創建一個新數組,而是可以重用現有數組,那么您的空間復雜度會下降到O(1)


您可以通過使用以下 VM 選項運行以下代碼片段來確認上述假設

-Xmx2048M -Xms64M -XX:+UseZGC

恆定空間復雜度

這里,數組在循環之前被實例化

Set<Long> set = new HashSet<>();
int[] a = new int[1_000_000];
while (true) {
    long memory = Runtime.getRuntime().totalMemory();
    set.add(memory);
    Arrays.fill(a, Integer.MAX_VALUE);
    System.out.println(set);
}

印刷

[67108864]
[67108864]
[67108864]
[67108864]
[67108864]
[67108864]
[67108864]
...

線性空間復雜度

Set<Long> set = new HashSet<>();
while (true) {
    long memory = Runtime.getRuntime().totalMemory();
    set.add(memory);
    int[] a = new int[1_000_000];
    Arrays.fill(a, Integer.MAX_VALUE);
    System.out.println(set);
}

印刷

[67108864]
[67108864, 100663296]
[67108864, 100663296, 134217728]
[67108864, 100663296, 134217728, 167772160]
[67108864, 100663296, 134217728, 167772160, 201326592]
[67108864, 100663296, 134217728, 167772160, 201326592, 234881024]
[67108864, 100663296, 134217728, 167772160, 201326592, 234881024, 268435456]
[67108864, 100663296, 134217728, 167772160, 201326592, 234881024, 268435456, 301989888]
[67108864, 100663296, 134217728, 167772160, 201326592, 234881024, 268435456, 301989888, 335544320]
[67108864, 100663296, 134217728, 167772160, 201326592, 234881024, 268435456, 301989888, 335544320, 369098752]
[167772160, 67108864, 100663296, 134217728, 201326592, 234881024, 268435456, 301989888, 335544320, 369098752, 402653184]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM