Entdeckte ich containsAll()
(a List
interface-Methode) während einige Codierung heute, und es sieht alles ziemlich glatt. Weiß jemand, wie viel diese Kosten in Bezug Leistung/Iterationen?
Den Dokumentation hat nicht viel zu bieten im Sinne von, dass.
.equals(..)
(Hinweis: dies ist über die Listen, wie Sie in der angegebenen Frage. Andere Sammlungen sich unterschiedlich Verhalten)Es ist also O(n*m), wobei n und m sind die Größen der beiden Sammlungen.
contains()
, aberHashSet
/HashMap
tun es in O(1) jede geordnete Sammlung könnte es tun, in O(logn).Collection.containsAll()
ist überschrieben durchList.containsAll()
.Verwenden Sie die Quelle, Luke 🙂
Edit: Wie Bozho darauf hingewiesen, du fragst nach
List.containsAll()
überschriebenCollection.containsAll()
. Die folgenden Wanderungen sind vor allem mit der letzteren:Meisten
Collection
Klassen verwenden die Implementierung voncontainsAll
vonAbstractCollection
, was macht es so:Es gibt keine Garantie, dass einige die Umsetzung macht es komplett anders, obwohl-führen könnten, entweder zu besseren oder schlechteren Laufzeitverhalten.
Den oben genannten Umsetzung von
containsAll
mindestens O(n), wobei n die Anzahl der Elemente in derCollection
parameter Sie übergeben, plus welcher Zeitcontains
nimmt:HashSet
/HashMap
könnte dies O(1) - (best case, keine Kollisionen), so dass die Gesamt-Laufzeit voncontainsAll
wäre immer noch O(n)ArrayList
,contains
dauert O(m) wobei m die Anzahl der Elemente in der Liste (ohne den parameter), so dass die gesamte Zeit fürcontainsAll
wäre O(n*m)addAll
Umsetzung, nichtcontainsAll
. Aber OP: für die meisten ImplementierungencontainsAll
KostenO(n^2)
; es tut nichts besonders cool.List
Implementierungen.containsAll
dauert in der RegelO(n)
mal die Kosten einescontains
Abfrage.wenn Sie anrufen, A. containsAll(B)
openjdk durchläuft alle Elemente von B ruft a enthält(b).
A. contains(b) durchläuft alle Elemente Einer Berufung ein.equals(b)
Dies ist übernommen aus der Quelle für open jdk 7
contains()
besseres zu bieten Implementierungen jedoch. DenkeHashSet
.betrachten
n.ContainsAll(m)
bestmögliche Fall ist O(m), und das ist, wenn n eine perfekte hash-set.
angesichts unsortierte Listen, die ich kann kommen mit einem O(n*log(n) + m*log(m)) Algorithmus