Lernziele
| Wann benutzt man welchen assoziativen Containertyp? |
| Eine Übersicht über die 5 assoziativen Containertypen von LEDA |
Eine der häufigsten Fragen zu den assoziativen
Containertypen von LEDA lautet schlicht „Wann benutze ich
denn welchen dieser 5 Typen?“ oder „Ich muss mir zu
Objekten eines Typs K andere Objekte eines Typs
V merken. Nehme ich da jetzt ein
d_array oder ein
h_array oder was?“ Dieser Abschnitt
versucht, das bisher über diese Typen Gesagte in Form von
Tabelle 3.1
zusammenzufassen und Faustregeln zu deren Verwendung zu geben.
Das wichtigste Entscheidungskriterium ist sicher der Typ der
Schlüssel, die verwendet werden sollen. In einer
map können nur der Typ int,
Pointer-Typen und Item-Typen verwendet werden. Bei den anderen
Containertypen muss der Schlüsseltyp linear geordnet oder
gehasht sein. Eine lineare
Ordnung lässt sich meist leicht selbst definieren; eine geeignete
Hash-Funktion zu finden, die sich für die gegebene Verteilung der
Schlüssel gut verhält, fällt dagegen i. Allg. viel schwerer.
Falls keine speziellen Operationen nötig sind, die nur
sortseq bietet, sind als Nächstes
Zugriffszeit und Platzverbrauch gegeneinander abzuwägen. Die
hashenden Typen h_array und
map sind diesbezüglich den anderen i. Allg. im
Vorteil. Diese sind aber nur dann von Nutzen, wenn nicht über die
Schlüssel in einer bestimmten Reihenfolge iteriert werden
muss. Zudem kann in einer map kein
Schlüssel-Wert-Paar gelöscht werden, was bei dynamisch wachsenden
und schrumpfenden Strukturen notwendig ist.
![]() | Tipp |
|---|---|
Wenn man gar nicht weiß oder abschätzen kann, was man
benötigt, kann man immer mit einer
|
Tabelle 3.1. dictionary, d_array, h_array und map im Vergleich
dictionary | d_array | h_array | map | sortseq | |
|---|---|---|---|---|---|
| Schlüsseltyp | linear geordnet | linear geordnet | gehasht | int oder Pointer-Typ oder Item-Typ | linear geordnet |
| Zugriffszeit | O(log n) im schlechtesten Fall | O(log n) im schlechtesten Fall | O(1) Erwartungswert, O(n) im schlechtesten Fall | O(1) Erwartungswert, O(n) im schlechtesten Fall. Schneller als h_array | O(log n) im schlechtesten Fall, O(log min(d,n-d)) bei Fingersuche, O(1) erwartet bei bekanntem Finger |
| Platzverbrauch | mittelmäßig | mittelmäßig | gering | sehr gering | hoch |
forall_defined Reihenfolge | sortiert | sortiert | unsortiert | unsortiert | sortiert |
| Löschen eines Schlüssel-Wert-Paares möglich? | ja | ja | ja | nein | ja |
| Aufspalten, aneinanderhängen, mischen möglich? | nein | nein | nein | nein | ja |
| Einfügen an einer bestimmten Stelle möglich? | nein | nein | nein | nein | ja, über Finger |
| Variablenpersistenz | ja | ja | nein | nein | ja |