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

Schreibe einen Kommentar