Vorlesung 09: Mengen. Peter Thiemann SS 2010



Ähnliche Dokumente
OCP Java SE 8. Collections

Einführung in die Programmierung

19 Collections Framework

12 Collections Framework. Interfaces Maps and Collections. Collection Interface. Überblick. Collection = Containterklasse, die andere Objekte enthält.

Objektorientierte Programmierung

19 Collections Framework

Java Einführung Collections

Software Engineering Klassendiagramme Assoziationen

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmieren in Java

Einführung in die Programmierung für Wirtschaftsinformatik

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Java Generics & Collections

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

Programmierzertifikat Objekt-Orientierte Programmierung mit Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Große Übung Praktische Informatik 1

Kapitel 12: Java Collection Teil II

Kapitel 12: Java Collection Teil II

Objektorientierte Programmierung

Gebundene Typparameter

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung

Vorlesung 07: Collections. Peter Thiemann SS 2010

Studentische Lösung zum Übungsblatt Nr. 7

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

EndTermTest PROGALGO WS1516 A

Client-Server-Beziehungen

Programmierkurs Java

Modellierung und Programmierung 1

Einführung in die Java- Programmierung

5. Tutorium zu Programmieren

Scala kann auch faul sein

Einstieg in die Informatik mit Java

1 topologisches Sortieren

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Erwin Grüner

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

WPF Steuerelemente Listbox, ComboBox, ListView,

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmieren in Java

JAVA KURS COLLECTION

U08 Entwurfsmuster (II)

Typumwandlungen bei Referenztypen

368 4 Algorithmen und Datenstrukturen

Kapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse

Algorithmen und Datenstrukturen

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Factory Method (Virtual Constructor)

Tutorium 5 - Programmieren

Kapiteltests zum Leitprogramm Binäre Suchbäume

Arrays Fortgeschrittene Verwendung

15 Optimales Kodieren

Java Kurs für Anfänger Einheit 5 Methoden

Algorithmen und Datenstrukturen Suchbaum

Codes und Informationsgehalt

public class SternchenRechteckGefuellt {

Der lokale und verteilte Fall

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

5 Projekt Bankverwaltung

Datenstrukturen & Algorithmen

Programmierung I Einführung in Python, Beyond the Basics

Einführung in die Programmierung

Datenstrukturen in Java

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup Conrad Kobsch

B-Bäume I. Algorithmen und Datenstrukturen 220 DATABASE SYSTEMS GROUP

SEP 114. Design by Contract

Übersicht Programmablaufsteuerung

Vererbung & Schnittstellen in C#

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Theoretische Grundlagen der Informatik

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Breiten- und Tiefensuche in Graphen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Übungen Programmieren 1 Felix Rohrer. Übungen

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Java: Vererbung. Teil 3: super()

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

Computeranwendung und Programmierung (CuP)

BEISPIELKLAUSUR Softwareentwicklung:

WebService in Java SE und EE

Programmieren I. Kapitel 7. Sortieren und Suchen

Suchen und Sortieren

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Transkript:

Vorlesung 09: Mengen Peter Thiemann Universität Freiburg, Germany SS 2010 Peter Thiemann (Univ. Freiburg) JAVA 1 / 43

Inhalt Mengen HashSet LinkedHashSet CopyOnWriteArraySet EnumSet SortedSet NavigableSet Peter Thiemann (Univ. Freiburg) JAVA 2 / 43

Mengen Eine Menge ist eine Ansammlung von Elementen ohne Duplikate ohne Berücksichtigung der Reihenfolge Hinzufügen eines bereits vorhandenen Elements hat keine Wirkung. Das Interface Set hat die gleichen Methoden wie das Interface Collection aber andere Verträge für add und addall Peter Thiemann (Univ. Freiburg) JAVA 3 / 43

Beispiel (Mengen) // Erinnerung: Collection<Task> assert mondaytasks.tostring().equals ( [code logic, phone Paul] ); assert phonetasks.tostring().equals ( [phone Mike, phone Paul] ); // Menge aus Collection Set<Task> phoneandmondaytasks = new TreeSet<Task> (mondaytasks); phoneandmondaytasks.addall (phonetasks); // doppelte Elemente fallen weg assert phoneandmondaytasks.tostring().equals( [code logic, phone Mike, phone Paul] ); Peter Thiemann (Univ. Freiburg) JAVA 4 / 43

Arbeiten mit Mengen Set ist Interface Methoden arbeiten mit allen Implementierungen Unterschiede der Implementierungen: unterschiedliche Komplexität der Operationen (einfügen, löschen, Durchlauf, etc) Job des Programmierers: Auswahl der geeigneten Implementierung nach Notwendigkeiten der Aufgabe Peter Thiemann (Univ. Freiburg) JAVA 5 / 43

Sechs Implementierungen von Mengen Implementierungen von Set<E> HashSet<E> LinkedHashSet<E> CopyOnWriteArraySet<E> EnumSet<E extends Enum<E>> Implementierungen von SortedSet<E> und NavigableSet<E> TreeSet<E> ConcurrentSkipListSet<E> Peter Thiemann (Univ. Freiburg) JAVA 6 / 43

HashSet HashSet Peter Thiemann (Univ. Freiburg) JAVA 7 / 43

HashSet HashSet Erzeugung durch Konstruktor HashSet (int initialcapacity) Implementierung durch Hashtabelle Array indiziert durch eine Hashfunktion, die aus den Elementen ausgerechnet wird Beispiel (aus java.lang.string) int hashcode() { int hash = 0; for (char ch : str.tochararray()) { hash = hash 31 + ch; } return hash; } Peter Thiemann (Univ. Freiburg) JAVA 8 / 43

HashSet Kollisionen Problem: hashcode ist nicht injektiv Es kommt zu Kollisionen. Beispiel: QB.hashCode() == Pa.hashCode() (Kollisionsfreiheit prinzipiell nicht möglich für Typen mit mehr als 2 3 2 Werten.) Eine Lösung: Überlauflisten 1 "AA" 2 3 4 5 6 7 "QB" "Pa" Peter Thiemann (Univ. Freiburg) JAVA 9 / 43

HashSet Aufwand (Einfügen und Suchen) Ohne Kollisionen: Aufwand für Einfügen, Suchen und Löschen eines Elements ist konstant Je voller die Hashtabelle, desto wahrscheinlicher sind Kollisionen Beim Einfügen, Suchen und Löschen kommt der Durchlauf der Überlaufliste hinzu Je voller die Hashtabelle, desto langsamer der Zugriff Reorganisation bei gewissem Füllungsgrad (rehashing): z.b. kopieren der Elemente in neues, doppelt so großes Array Peter Thiemann (Univ. Freiburg) JAVA 10 / 43

HashSet Aufwand (Durchlauf) Der Iterator muss jeden Eintrag der Hashtabelle untersuchen Aufwand = Größe der Hashtabelle + Anzahl der Einträge Peter Thiemann (Univ. Freiburg) JAVA 11 / 43

LinkedHashSet LinkedHashSet Peter Thiemann (Univ. Freiburg) JAVA 12 / 43

LinkedHashSet HashSet mit schnellem Iterator Subklasse von HashSet Zusätzliche Garantie: Iterator durchläuft die Elemente in der Reihenfolge, in der sie eingefügt wurden Implementiert durch zusätzliche verkettete Liste 1 "AA" 2 3 Start 4 5 6 7 "QB" "Pa" Peter Thiemann (Univ. Freiburg) JAVA 13 / 43

LinkedHashSet Aufwand Einfügen, Suchen, Löschen wie HashSet Extra Aufwand (größere Konstante und erhöhter Speicherbedarf) für Verwaltung der verketteten Liste Aufwand für Iterator = Anzahl der Einträge Insbesondere: next() läuft in konstanter Zeit LinkedHashSet lohnt nur, falls der schnellere Iterator wichtig ist Peter Thiemann (Univ. Freiburg) JAVA 14 / 43

CopyOnWriteArraySet CopyOnWriteArraySet Peter Thiemann (Univ. Freiburg) JAVA 15 / 43

CopyOnWriteArraySet Mengenimplementierung für Spezialanwendungen Menge implementiert durch ein Array Jede Änderung des Inhalts bewirkt die Erzeugung eines neuen Arrays! Aufwand für Einfügen O(n) Aufwand für Suchen O(n) Aufwand für Iterator.next() O(1) Vorteil von CopyOnWriteArraySet Nebenläufige Verwendung möglich ohne das Lesen zu verlangsamen (Geeignet für subject/observer Muster) Peter Thiemann (Univ. Freiburg) JAVA 16 / 43

EnumSet EnumSet Peter Thiemann (Univ. Freiburg) JAVA 17 / 43

EnumSet Spezielle Eigenschaften von Enum Jede Enumeration hat die Eigenschaften die Anzahl m der Elemente ist bekannt jedes Element hat eine feste Nummer value.ordinal() Implementierung durch Bitset Array von 32-Bit Zahlen Jede Bitstelle steht für ein Element Mengenoperationen durch Bitmanipulation Bit setzen: einfügen Bit löschen: Element entfernen Bitweise-und: Schnittmenge Bitweise-oder: Vereinigung Iterator liefert Elemente in natürlicher Reihenfolge Aufwand Einfügen, Entfernen: O(1) clear, isempty, size: O(m) Iterator next: O(m) Peter Thiemann (Univ. Freiburg) JAVA 18 / 43

EnumSet Statische Factory Methoden Menge aus den angegebenen Elementen <E extends Enum<E>> EnumSet<E> of (E first, E... rest); Menge mit einem Intervall von Elementen <E extends Enum<E>> EnumSet<E> range (E from, E to); Menge mit allen Elementen <E extends Enum<E>> EnumSet<E> allof (E from, E to); Leere Menge <E extends Enum<E>> EnumSet<E> noneof (E from, E to); Peter Thiemann (Univ. Freiburg) JAVA 19 / 43

EnumSet Verwendung der Factory Methoden enum Season { SPRINT, SUMMER, AUTUMN, WINTER } EnumSet<Season> s1 = EnumSet.of (Season.SPRING, Season.AUTUMN); EnumSet<Season> s2 = EnumSet.range (Season.SPRING, Season.AUTUMN); EnumSet<Season> all seasons = EnumSet.allOf (Season.class); EnumSet<Season> no seasons = EnumSet.noneOf (Season.class); Peter Thiemann (Univ. Freiburg) JAVA 20 / 43

EnumSet Manipulation von EnumSet Kopie eines EnumSet <E extends Enum<E>> EnumSet<E> copyof (EnumSet<E> s); Umwandlung Collection EnumSet (mindestens ein Element erforderlich) <E extends Enum<E>> EnumSet<E> copyof (Collection<E> s); Komplement eines EnumSet Peter Thiemann (Univ. Freiburg) JAVA 21 / 43

SortedSet SortedSet Peter Thiemann (Univ. Freiburg) JAVA 22 / 43

SortedSet Mengen über geordneten Elementen Iterator durchläuft Elemente in aussteigender Ordnung interface SortedSet<E> { public E first(); public E last(); public Comparator<? super E> comparator(); public SortedSet<E> subset (E fromelement, E toelement); public SortedSet<E> headset (E toelement); public SortedSet<E> tailset (E fromelement); } Ab Java 6: NavigableSet<E> als Subinterface von SortedSet<E> gleiche Implementierungen Peter Thiemann (Univ. Freiburg) JAVA 23 / 43

SortedSet Konstruktion TreeSet<E> implementiert SortedSet<E> Konstruktoren TreeSet () verwendet die natürliche Ordnung TreeSet (Comparator<? super E> comparator) verwendet die durch comparator definierte Ordnung Peter Thiemann (Univ. Freiburg) JAVA 24 / 43

SortedSet Beispiel: Verschmelzen zweier sortierter Tasklisten Vorher mit zwei Iteratoren implementiert Set<Task> naturallyorderedtasks = new TreeSet<Task> (mondaytasks); naturallyorderedtasks.addall (tuesdaytasks); assert naturallyorderedtasks.tostring().equals( [code db, code gui, code logic, phone Mike, phone Paul] ); Aufwand zum Verschmelzen von Mengen mit insgesamt m Elementen Verschmelzen von zwei sortierten Listen: O(m) Verschmelzen über TreeSet<Task>: O(m log m). Peter Thiemann (Univ. Freiburg) JAVA 25 / 43

SortedSet Erweitertes Beispiel: Aufgaben mit Prioritäten public enum Priority { HIGH, MEDIUM, LOW } public final class PriorityTask implements Comparable<PriorityTask> { private final Task task; private final Priority priority; PriorityTask(Task task, Priority priority) { this.task = task; this.priority = priority; } public Task gettask() { return task; } public Priority getpriority() { return priority; } Peter Thiemann (Univ. Freiburg) JAVA 26 / 43

SortedSet Erweitertes Beispiel: Aufgaben mit Prioritäten (Forts.) public int compareto(prioritytask pt) { int c = priority.compareto(pt.priority); return (c!= 0)? c : task.compareto(pt.task); } public boolean equals(object o) { if (o instanceof PriorityTask) { PriorityTask pt = (PriorityTask)o; return task.equals(pt.task) && priority.equals(pt.priority); } else return false; } public int hashcode() { return task.hashcode(); } public String tostring() { return task + : + priority; } } Peter Thiemann (Univ. Freiburg) JAVA 27 / 43

SortedSet Arbeiten mit PriorityTask NavigableSet<PriorityTask> prioritytasks = new TreeSet<PriorityTask>(); prioritytasks.add (new PriorityTask (mikephone, Priority.MEDIUM)); prioritytasks.add (new PriorityTask (paulphone, Priority.HIGH)); prioritytasks.add (new PriorityTask (databasecode, Priority.MEDIUM); prioritytasks.add (new PriorityTask (interfacecode, Priority.LOW)); assert prioritytasks.tostring().equals( [phone Paul: HIGH, code db: MEDIUM, phone Mike: MEDIUM, code gui: LOW] ) Peter Thiemann (Univ. Freiburg) JAVA 28 / 43

SortedSet Teilbereiche mit SortedSet-Methoden public SortedSet<E> subset (E fromelement, E toelement); public SortedSet<E> headset (E toelement); public SortedSet<E> tailset (E fromelement); subset liefert alle Elemente fromelement und < toelement headset liefert alle Elemente < toelement tailset liefert alle Elemente fromelement Die Argumente selbst müssen weder in der Menge noch im Ergebnis enthalten sein. Das fromelement kann dazugehören. Das toelement gehört nie zum Ergebnis. Peter Thiemann (Univ. Freiburg) JAVA 29 / 43

SortedSet Beispiele mit SortedSet-Methoden Mit den Teilbereichsmethoden kann eine Taskliste nach Prioritäten unterteilt werden. Dafür ist eine kleinste Task erforderlich: public class EmptyTask extends Task { public EmptyTask() {} public String tostring() { return ; } } Peter Thiemann (Univ. Freiburg) JAVA 30 / 43

SortedSet Beispiele mit SortedSet-Methoden (Forts.) PriorityTask firstlowprioritytask = new PriorityTask (new EmptyTask(), Priority.LOW); SortedSet<PriorityTask> highandmediumprioritytasks = prioritytasks.headset (firstlowprioritytask); assert highandmediumprioritytasks.tostring().equals( [phone Paul: HIGH, code db: MEDIUM, phone Mike: MEDIUM] ); Oder auch PriorityTask firstmediumprioritytask = new PriorityTask (new EmptyTask(), Priority.MEDIUM); SortedSet<PriorityTask> mediumprioritytasks = prioritytasks.subset (firstmediumprioritytask, firstlowprioritytask); assert mediumprioritytasks.tostring().equals( [code db: MEDIUM, phone Mike: MEDIUM] ); Peter Thiemann (Univ. Freiburg) JAVA 31 / 43

SortedSet Grenzen der Teilbereichsmethoden Angenommen, gesucht ist die Menge aller Aufgaben mit mittlerer Priorität bis mikephone inklusive Zur Verwendung von subset müsste die nächstgrößere Task zu mikephone konstruiert werden. Kann mit Trick erreicht werden. (Was ist der Nachfolger von "Mike" in der natürlichen Ordnung auf String?) Besser: Verwende NavigableSet! Peter Thiemann (Univ. Freiburg) JAVA 32 / 43

SortedSet Eigenschaften der Teilbereiche Die Teilbereiche sind keine neuen, eigenständigen Mengen! Einfügen und Löschen in die unterliegende Menge wirkt auch auf den Teilbereichen PriorityTask logiccodemedium = new PriorityTask (logiccode, Priority.MEDIUM); prioritytasks.add (logiccodemedium); assert mediumprioritytasks.tostring().equals( [code db: MEDIUM, code logic: MEDIUM, phone Mike: MEDIUM] ); und umgekehrt: mediumprioritytasks.remove (logiccodemedium); assert prioritytasks.tostring().equals( [phone Paul: HIGH, code db: MEDIUM, phone Mike: MEDIUM, code gui: LOW] ); Peter Thiemann (Univ. Freiburg) JAVA 33 / 43

NavigableSet NavigableSet Peter Thiemann (Univ. Freiburg) JAVA 34 / 43

NavigableSet Weiterentwicklung von SortedSet interface NavigableSet<E> extends SortedSet<E> { public E pollfirst(); public E polllast (); public NavigableSet<E> subset (E fromelement, boolean frominclusive, E toelement, boolean toinclusive); public NavigableSet<E> headset (E toelement, boolean toinclusive); public NavigableSet<E> tailset (E fromelement, boolean frominclusive); public E ceiling (E e); public E floor (E e); public E higher (E e); public E lower (E e); public NavigableSet<E> descendingset(); public Iterator<E> descendingiterator(); Peter Thiemann (Univ. Freiburg) JAVA 35 / 43

NavigableSet Erste und letzte Elemente public E pollfirst(); public E polllast (); liefern das erste bzw letzte Element der Menge und entfernen es oder null, falls leer Unterschiede zu first und last: werfen Exception, falls Menge leer Elemente werden nicht entfernt Beispiel: Die nächst-fällige Aufgabe PriorityTask nexttask = prioritytasks.pollfirst(); assert nexttask.tostring().equals( phone Paul: HIGH ); Peter Thiemann (Univ. Freiburg) JAVA 36 / 43

NavigableSet Teilbereiche public NavigableSet<E> subset (E fromelement, boolean frominclusive, E toelement, boolean toinclusive); public NavigableSet<E> headset (E toelement, boolean toinclusive); public NavigableSet<E> tailset (E fromelement, boolean frominclusive); Verbesserung der Methoedn von SortedSet<E>: Zugehörigkeit der from und to Elemente kann separat spezifiziert werden. Beispiel: Alle MEDIUM-Priorität Aufgaben mikephone PriorityTask mikephonemedium = new PriorityTask (mikephone, Priority.MEDIUM); NavigableSet<E> closedinterval = prioritytasks.subset( firstmediumprioritytask, true, mikephonemedium, true); assert closedinterval.tostring().equals( [code db: MEDIUM, phone Mike: MEDIUM] ); Peter Thiemann (Univ. Freiburg) JAVA 37 / 43

NavigableSet Bestmögliche Treffer E ceiling (E e) liefert das kleinste Element e oder null E floor (E e) liefert das größte Element e oder null E higher (E e) liefert das kleinste Element > e oder null E lower (E e) liefert das größte Element < e oder null Peter Thiemann (Univ. Freiburg) JAVA 38 / 43

NavigableSet Beispiel (Bestmögliche Treffer) Aufgabe: Finde in einer Menge von String die größten drei Strings "x-ray". NavigableSet<String> stringset = new TreeSet<String> (); Collections.addAll (StringSet, abc, cde, x ray, zed ); String last = stringset.floor ( x ray ); assert last.equals ( x ray ); String secondtolast = last == null? null : stringset.lower (last))); String thirdtolast = secondtolast == null? null : stringset.lower (secondtolast); Peter Thiemann (Univ. Freiburg) JAVA 39 / 43

NavigableSet Navigieren in umgekehrter Reihenfolge public NavigableSet<E> descendingset(); public Iterator<E> descendingiterator(); Verwendung der umgekehrten Ordnung, ohne zuvor einen Comparator explizit zu konstruieren. NavigableSet<String> headset = stringset.headset (last, true); NavigableSet<String> reserveheadset = headset.descendingset(); assert reserveheadset.tostring().equals( [x ray, cde, abc] ); String conc = ; for (String s : reserveheadset) { conc += s + ; } assert conc.equals( x ray cde abc ); Peter Thiemann (Univ. Freiburg) JAVA 40 / 43

NavigableSet TreeSet<E> Implementierung von NavigableSet<E> durch balancierten binären Suchbaum Verwendet Rot-schwarz Baum (red-black tree) Peter Thiemann (Univ. Freiburg) JAVA 41 / 43

NavigableSet ConcurrentSkipListSet<E> Implementierung von NavigableSet<E> Level 2 12 31 61 Level 1 12 31 47 61 Level 0 12 15 23 31 35 47 55 61 Level 0 enthält alle Elemente Level n + 1 enthält eine Teilliste von Level n Suchen: Beginne bei höchstem Level Einfügen: Beginne bei 0; werfe eine Münze; falls Kopf, füge ins nächsthöhere Level ein; usw Peter Thiemann (Univ. Freiburg) JAVA 42 / 43

NavigableSet Zusammenfassung: Aufwand add contains next HashSet O(1) O(1) O(h) LinkedHashSet O(1) O(1) O(1) CopyOnWriteArraySet O(n) O(n) O(1) EnumSet O(1) O(1) O(m) TreeSet O(log n) O(log n) O(log n) ConcurrentSkipListSet O(log n) O(log n) O(1) h ist die Kapazität der Hashtabelle m ist die Anzahl der Element der Enumeration Peter Thiemann (Univ. Freiburg) JAVA 43 / 43