[英]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.