C # -Wörterbücher sind ein einfacher Weg, um herauszufinden, ob etwas existiert usw. usw. Ich habe jedoch eine Frage dazu, wie sie funktionieren. Angenommen, ich verwende anstelle eines Wörterbuchs eine ArrayList. Anstatt ContainsKey
(oder eine äquivalente Methode in einer anderen Sprache) zu verwenden, durchlaufe ich die ArrayList, um zu überprüfen, ob dort etwas vorhanden ist (oder eine binäre Suche durchzuführen, wenn Daten sortiert sind oder ähnliches). Was ist der Unterschied in der Effizienz? ContainsKey
Verwendet die Methode eine effizientere Methode, als die Schlüssel zu durchlaufen und zu überprüfen, ob das, was ich suche, vorhanden ist?
Wenn wir beispielsweise eine bestimmte Hash-Funktion erstellt haben, die dem Datentyp entspricht, den ich habe, und der speziell für diesen Datensatz entwickelt wurde, dann ist diese Hash-Funktion in der Tat schneller als das Durchlaufen von Daten. Aber Wörterbücher sind allgemein. Die ContainsKey-Methode ist nicht spezifisch für die Daten, die sie erhält, sondern eine allgemeine Suchmethode.
Grundsätzlich frage ich: Wörterbücher sind für Programmierer hilfreich. Sie enthalten Methoden, die bei vielen Dingen helfen, und sie kombinieren Zeichenfolgen mit Ganzzahlen (Schlüssel und Werte) und vielem mehr. Aber was bieten sie in Bezug auf Effizienz? Was ist der Unterschied in einem mit dictionary
vs einem ArrayList
vonstructs(string,int)
quelle
Data Structures
Dieser Wiki-Link kann Ihnen mehr helfenAntworten:
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:
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?
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:
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.
quelle