簡體   English   中英

集合的時間復雜度在Java

[英]Time complexity of set in Java

有人能告訴我下面代碼的時間復雜度嗎?

a是一個int數組。

Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < a.length; i++) {
    if (set.contains(arr[i])) {
        System.out.println("Hello");
    }
    set.add(arr[i]);
}

我認為它是O(n) ,但我不確定,因為它使用的是Set並且它也包含方法。 它還調用了setadd方法。

任何人都可以確認並解釋上面整個代碼的時間復雜度是多少? 另外,需要多少空間?

我相信它的O(n)因為你循環遍歷數組,並且containsadd應該是恆定時間,因為它是基於散列的集合。 如果它不是基於散列的並且需要在整個集合上進行迭代以進行查找,則上限將是n ^ 2。

整數是不可變的,因此空間復雜度為2n,我認為這簡化為n,因為常數無關緊要。

如果你有數組中的對象並設置,那么你將有2n個引用和n個對象,所以你是3n,它仍然是線性的(乘以常數)空間約束。

編輯 - 是的“這個類為基本操作(添加,刪除,包含和大小)提供恆定的時間性能,假設散列函數在桶之間正確地分散元素。”

看到這里

理解HashSet是問題的關鍵

根據 Javadoc 中的HashSet

這個 class 實現了 Set 接口,由 hash 表(實際上是一個 HashMap 實例)支持......這個 class 為基本操作(添加,刪除,包含和大小)提供恆定的時間性能

關於HashSet的更完整的解釋https://www.geeksforgeeks.org/hashset-contains-method-in-java/?ref=rp

所以HashSet insertcontainsO(1) (因為HashSet是基於HashMap而它的 memory 復雜度是O(n)

rest 很簡單,您要循環的主數組是O(n)的順序,因此 function 的總順序將為O(n)

暫無
暫無

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

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