3.5. dictionary, d_array, h_array, map und sortseq im Vergleich

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]Tipp

Wenn man gar nicht weiß oder abschätzen kann, was man benötigt, kann man immer mit einer sortseq beginnen, wobei man sich eine lineare Ordnungsfunktion compare() eventuell selbst schreiben muss, und dann am Ende die sortseq durch diejenige Struktur ersetzen, deren Operationen man wirklich benötigt, und die sich im gegebenen Fall am besten verhält.

Tabelle 3.1. dictionary, d_array, h_array und map im Vergleich

 dictionaryd_arrayh_arraymapsortseq
Schlüsseltyplinear geordnetlinear geordnetgehashtint oder Pointer-Typ oder Item-Typlinear geordnet
ZugriffszeitO(log n) im schlechtesten FallO(log n) im schlechtesten FallO(1) Erwartungswert, O(n) im schlechtesten FallO(1) Erwartungswert, O(n) im schlechtesten Fall. Schneller als h_arrayO(log n) im schlechtesten Fall, O(log min(d,n-d)) bei Fingersuche, O(1) erwartet bei bekanntem Finger
Platzverbrauchmittelmäßigmittelmäßiggeringsehr geringhoch
forall_defined Reihenfolgesortiertsortiertunsortiertunsortiertsortiert
Löschen eines Schlüssel-Wert-Paares möglich?jajajaneinja
Aufspalten, aneinanderhängen, mischen möglich?neinneinneinneinja
Einfügen an einer bestimmten Stelle möglich?neinneinneinneinja, über Finger
Variablenpersistenzjajaneinneinja