Warum sollte ich ein HashSet über ein Wörterbuch?
Ich versuche zu implementieren, die eine Liste von Cache-Pfade auf einer A* - Algorithmus. Derzeit ist die Cache-Pfade gespeichert sind, in einer Liste wie dieser:
readonly List<CachedPath> _cachedPaths = new List<CachedPath>();
Die Operationen, die über diese Liste sind:
FirstOrDefault zu bekommen, ein element, das erfüllt bestimmte Bedingungen
var cached = _cachedPaths.FirstOrDefault(p => p.From == from && p.To == target && p.Actor == self);
Entfernen und element
_cachedPaths.Remove(cached);
Ergänzungen
_cachedPaths.Add(new CachedPath {
From = from,
To = target,
Actor = self,
Result = pb,
Tick = _world.WorldTick
});
HINWEIS: Die Klasse CachedPath hat GetHashCode und Equals überschrieben, indem Sie einfach die Aus, und die Schauspieler, also zwei Instanzen, die diese Attribute haben den gleichen hash und Gleichheit.
Gegeben, dass eine schnelle Suche (Enthält), Insertionen und Deletionen in eine 'HashSet' sind O(1) (wenn ich mich nicht Irre), als ich mit einem 'HashSet' für diese Operationen. Das problem ist nur das FirstOrDefault, musste ich aufzählen der ganzen Sammlung, um es zu bekommen.
Angesichts dieses Problems, als auch eine Wörterbuch-indiziert durch den hash Aus, und Schauspieler:
Dictionary<int, CachedPath> cachedPath
Wieder, wenn ich mich nicht Irre, Wörterbuch bietet auch O(1) bei Einfügungen, Löschungen, und auch der Abruf per Schlüssel. Dies führt mich zu glauben, dass ein Wörterbuch ist ein HashSet + O(1) element retrieval-Funktionen.
Bin ich etwas fehlt? Ist wirklich Wörterbuch besser als HashSet in dem Sinne, dass es unterstützt mehr Operationen?
Vielen Dank im Voraus.
InformationsquelleAutor David Jiménez Martínez | 2015-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dictionary
ist nicht besser alsHashSet
, es ist nur anders.HashSet
wenn Sie speichern möchten, eine ungeordnete Sammlung von Elementen, undDictionary
wenn Sie möchten, ordnen Sie einen Satz von Elementen, genannt "Schlüssel", mit einer anderen Sammlung von Artikel, die als "Werte"Könnte man denken, ein
HashSet
alsDictionary
ohne zugeordnete Werte (in der TatHashSet
ist manchmal umgesetzt mit einemDictionary
hinter der Szene), aber es ist nicht notwendig, darüber nachzudenken, es in dieser Weise: das denken der beiden als völlig unterschiedliche Dinge funktioniert ebenfalls sehr gut.In Ihrem Fall könnten Sie möglicherweise die Leistung verbessern, indem Sie ein Wörterbuch, um Schauspieler, wie diese:
Diese Weise Ihre lineare Suche würde schnell wählen Sie eine sub-Liste basiert auf einer Schauspieler, und dann Suche Linear Zielgruppe:
werden oder indem eine Gleichheit comparer Auffassung, dass alle drei Elemente, und mit einem
Dictionary
mitCachedPath
wie beide Schlüssel und Werte, und das benutzerdefinierte, IEqualityComparer<T>
als Schlüssel comparer:Jedoch, dieser Ansatz setzt Voraus, dass es höchstens ein Element in das Wörterbuch mit identischen
From
,To
, undActor
.InformationsquelleAutor dasblinkenlight
Einem hashset nicht eine exception werfen, wenn die Durchführung einer Beurteilung. Stattdessen gibt es eine bool spiegelt den Erfolg der add.
Auch ein hashset nicht erforderlich, ein keyValue-pair-Mädchen.
Ich benutze hashsets garantieren eine einzigartige Sammlung von Werten.
InformationsquelleAutor Scott Nimrod