Du musst ein wenig graben , um zu sehen , wie das Wörterbuch in C # implementiert ist - Es ist nicht so offensichtlich , wie HashMap (eine Hash - Tabelle) oder TreeMap (a sortierten Baum) (oder ConcurrentSkipListMap - eine Sprungliste ).
Wenn Sie in den Abschnitt "Bemerkungen" eintauchen:
Die generische Dictionary-Klasse bietet eine Zuordnung von einer Reihe von Schlüsseln zu einer Reihe von Werten. Jede Ergänzung des Wörterbuchs besteht aus einem Wert und dem zugehörigen Schlüssel. Das Abrufen eines Werts mithilfe seines Schlüssels erfolgt sehr schnell in der Nähe von O (1), da die Dictionary-Klasse als Hash-Tabelle implementiert ist.
Und da haben wir es. Es ist eine Hash-Tabelle . Beachten Sie, dass ich den Wikipedia-Artikel dort verlinkt habe - es ist eine ziemlich gute Lektüre. Vielleicht möchten Sie den Abschnitt zur Kollisionsauflösung lesen. Es ist möglich, einen pathologischen Datensatz abzurufen, bei dem die Suche auf O (N) verschoben wird (z. B. fällt alles, was Sie einfügen, aus irgendeinem Grund auf denselben Hashwert oder Index in der Hash-Tabelle und Sie haben keine lineare Prüfung mehr ).
Während das Wörterbuch eine Allzwecklösung ist, sollten Sie keine konkreten Typen (wie das Wörterbuch) weitergeben - Sie sollten die Schnittstellen weitergeben. In diesem Fall ist diese Schnittstelle IDictionary
( docs ). Dazu sind Sie perfekt in der Lage, Ihre eigene Wörterbuchimplementierung zu schreiben, die die Daten optimal für Ihre Daten ausführt.
In Bezug auf die Effizienz verschiedener Lookup / enthält?
- Eine unsortierte Liste durchgehen: O (N)
- Binäre Suche eines sortierten Arrays: O (log N)
- Sortierter Baum: O (log N)
- Hash-Tabelle: O (1)
Für die meisten Menschen ist die Hash-Tabelle genau das, was sie wollen.
Möglicherweise stellen Sie fest, dass das SortedDictionary genau das ist, was Sie möchten:
Die SortedDictionary<TKey, TValue>
generische Klasse ist ein binärer Suchbaum mit O-Abruf (log n), wobei n die Anzahl der Elemente im Wörterbuch ist. In dieser Hinsicht ähnelt es der SortedList<TKey, TValue>
generischen Klasse. Die beiden Klassen haben ähnliche Objektmodelle und beide haben einen O (log n) -Abruf.
Wenn die Datenstruktur jedoch nicht optimal zu Ihren Daten passt, erhalten Sie die Tools (die Schnittstellen), mit denen Sie eine schreiben können, die für Ihre Daten am besten geeignet ist.
Das Wörterbuch selbst ist ein abstrakter Datentyp . Sie geben mir ein Wörterbuch und ich weiß, was ich damit machen kann und welche Tools ich dort verwenden kann, da es ein Wörterbuch ist. Wenn Sie mir eine ArrayList geben würden, würde ich meinen eigenen Code zum Suchen, Einfügen oder Löschen von Elementen aus der Liste schreiben. Dies verschwendet meine Zeit und bedeutet auch, dass die Wahrscheinlichkeit eines Fehlers größer ist, wenn ich den Code immer wieder von Ort zu Ort kopiere.
Data Structures
Dieser Wiki-Link kann Ihnen mehr helfen