簡體   English   中英

我如何使HashSet操作成為O(n)?

[英]How can I make HashSet operations to be O(n)?

我如何使HashSet操作成為O(n)?

它具有標准的收集,添加,刪除,包含操作,但由於它使用基於哈希的實現,因此這些操作為O(1)。

但是什么時候運算O(n)?

謝謝!

導致O(n)行為的一種病理情況是,所有元素都具有相同的哈希碼。

NPE通常是正確的。

但是,我應該補充一點,在Java 8中,在鍵類型實現Comparable的情況下,對HashMapHashSet進行了改進,以用二進制樹替換長哈希鏈。 (參見JEP-180

這意味着,病理情況下, O(N)時,所有的元素具有相同的散列碼密鑰類型執行操作僅發生Comparable 如果鍵類型實現Comparable則在HashMapHashSetget的最壞情況的復雜度為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.

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