[英]What is the cost of ContainsAll in Java?
.equals(..)
將當前元素與它們進行比較(注意:正如您在問題中所指定的,這是關於列表的。其他集合的行為有所不同) 因此它是O(n * m),其中n和m是兩個集合的大小。
public boolean containsAll(Collection<?> c) {
Iterator<?> e = c.iterator();
while (e.hasNext())
if (!contains(e.next()))
return false;
return true;
}
使用源盧克:)
編輯:正如Bozho所指出的,您正在詢問List.containsAll()
,它重寫了Collection.containsAll()
。 以下是有關后者的主要討論:
大多數Collection
類將使用AbstractCollection
的containsAll
的實現 ,其實現方式如下:
public boolean containsAll(Collection<?> c) {
for (Object e : c)
if (!contains(e))
return false;
return true;
}
但是,不能保證某些實現會完全不同地執行它-這可能導致更好或更壞的運行時行為。
上述實施containsAll
將至少O(n),其中n是項目的數量Collection
你傳遞參數 , 再加上任何時間contains
需要:
HashSet
/ HashMap
它可能是O(1)(最好的情況下,沒有沖突),因此containsAll
的整體運行時間仍然是O(n) ArrayList
, contains
將采用O(m),其中m是列表中的數字項(不是參數),所以containsAll
的總時間為O(n * m) 如果您正在呼叫A.containsAll(B)
openjdk迭代B的所有調用A.contains(b)的元素。
A.contains(b)迭代A的所有元素,調用a.equals(b)
這是從開源jdk 7獲取的
考慮
n。包含全部(m)
最好的情況是O(m),即n是一個完美的哈希集。
考慮到未排序的列表,我可以提出O(n * log(n)+ m * log(m))算法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.