[英]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
並且它也包含方法。 它還調用了set
的add
方法。
任何人都可以確認並解釋上面整個代碼的時間復雜度是多少? 另外,需要多少空間?
我相信它的O(n)因為你循環遍歷數組,並且contains
和add
應該是恆定時間,因為它是基於散列的集合。 如果它不是基於散列的並且需要在整個集合上進行迭代以進行查找,則上限將是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
insert
和contains
是O(1)
。 (因為HashSet
是基於HashMap
而它的 memory 復雜度是O(n)
)
rest 很簡單,您要循環的主數組是O(n)
的順序,因此 function 的總順序將為O(n)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.