簡體   English   中英

集合視圖的 contains() 的時間復雜度是多少?

[英]What is the time complexity of contains() of a Set view?

如果我有一個 TreeSet 並且我在keySet()的 Set 視圖上使用contains()時間復雜度是 O(1) 嗎?

Map<String, Integer> map1 = new TreeMap<>();
map1.keySet().contains(xyz);

我想知道例如contains()對於 HashSet 和 LinkedHashSet 是 O(1) 但對於 TreeSet 是 O(log(N)) 但是keySet()方法不返回 HashSet、LinkedSet 或 TreeSet 而只是一個 Set 視圖總的來說,這讓我不確定。

在這里這里進行了檢查,但找不到任何與性能相關的信息。

從那以后我發現了這個問題: 什么是集合視圖? 這讓我覺得contains()的調用是由 TreeMap 而不是 Set 進行的,因此是 O(log(N))?

map1.keySet().contains(xyz); 與調用map1.containsKey(xyz); . 您可以通過查看源代碼來驗證它:

public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
    // […]

    public Set<K> keySet() {
        return navigableKeySet();
    }

    /**
     * @since 1.6
     */
    public NavigableSet<K> navigableKeySet() {
        KeySet<K> nks = navigableKeySet;
        return (nks != null) ? nks : (navigableKeySet = new KeySet<>(this));
    }

    // […]

    static final class KeySet<E> extends AbstractSet<E> implements NavigableSet<E> {
        private final NavigableMap<E, ?> m;
        KeySet(NavigableMap<E,?> map) { m = map; }

        // […]

        public boolean contains(Object o) { return m.containsKey(o); } // [<-- delegates back to map]

        // […]
    }

    // ...
}

=> 鍵集與集合本身具有相同的運行時特性。 在 TreeMap 的情況下,包含操作的復雜度為 O(log(n))。

暫無
暫無

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

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