![](/img/trans.png)
[英]how can i amend this code to have a time complexity of o(log n) or o(n) instead of o(n^2)
[英]How can I make HashSet operations to be O(n)?
我如何使HashSet操作成為O(n)?
它具有標准的收集,添加,刪除,包含操作,但由於它使用基於哈希的實現,因此這些操作為O(1)。
但是什么時候運算O(n)?
謝謝!
導致O(n)行為的一種病理情況是,所有元素都具有相同的哈希碼。
NPE通常是正確的。
但是,我應該補充一點,在Java 8中,在鍵類型實現Comparable
的情況下,對HashMap
和HashSet
進行了改進,以用二進制樹替換長哈希鏈。 (參見JEP-180 )
這意味着,病理情況下, O(N)
時,所有的元素具有相同的散列碼與密鑰類型不執行操作僅發生Comparable
。 如果鍵類型實現Comparable
則在HashMap
或HashSet
上get
的最壞情況的復雜度為O(logN)
。
如果您的哈希函數(您的哈希生成函數本身)將生成O(n)復雜度的哈希鍵,則您的所有操作都將處於這種復雜度。
一種無需覆蓋類(如NPE一樣)的簡單方法是用相同的哈希碼創建許多鍵。 例如
Set<Long> longs = new HashSet<>();
for (int i = 0; i < 10000; i++) {
Long element = ((long) i << 32) + (i & 0xFFFFFFFFL);
assert element.hashCode() == 0;
longs.add(element);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.