2013-04-02 6 views
8

Gibt es eine vorhandene Datenstruktur, die für Hashing-Daten verwendet werden kann und die Möglichkeit bietet, das älteste Element zu löschen?Wörterbuch mit begrenzter Größe, das älteste Elemente entfernt?

Der Ansatz, an den ich gerade denke, ist, dass ein Dictionary und eine Queue mit dem Dictionary schnell nachschlagen und das älteste Element mit einer Queue aus dem Dictionary löschen können.

+0

Müssen Sie andere Elemente als die ältesten entfernen? Und müssen Sie viele Elemente speichern - mit anderen Worten, wie wichtig ist die Leistung bei solchen Löschungen? –

+0

Welche Art von Daten mit dieser potentiellen Sammlung werden gespeichert? – MethodMan

+0

Um das älteste Element zu löschen, benötigen Sie eine festgelegte Größe oder Zeit, um ... –

Antwort

10

Sie können eine OrderedDictionary verwenden. Dies wird die Reihenfolge beibehalten (im Gegensatz zu SortedDictionary, die mit Schlüsseln bestellt werden). Sie können dann das erste verfügbare Element entfernen, das als das älteste gilt.

+4

+1. Beachten Sie, dass das Entfernen des ersten Elements O (n) ist, was in Ordnung sein kann, da die Frage keine Zeitanforderungen für diese Operation spezifiziert. –

+0

@AlexeiLevenkov - Guter Punkt. Wenn die Optimierung der Schlüssel ist, lohnt es sich auch, Kapazitätsgrößen zu testen, um das OrderedDictionary mit http://www.dotnetperls.com/dictionary-optimization zu initialisieren (obwohl der Artikel sich auf die Standard-Dictionary-Sammlung bezieht, sollte das Prinzip dennoch gelten)) – keyboardP

0

System.Collections.Generic.SortedList ist nur ein Wörterbuch, das nach Schlüssel sortiert. Wenn der Schlüssel in irgendeiner Weise temporär ist, können Sie einfach RemoveAt verwenden, um das erste Element zu entfernen, wenn Sie eine bestimmte Größe erreichen, wenn Sie einen weiteren Eintrag hinzufügen möchten.

Wahrscheinlich, da Sie Dictionary erwähnt haben, haben Sie wahrscheinlich keinen temporären Schlüssel. Aber eine Dictionary ist nur eine Sammlung von KeyValuePair<K,V> Objekte. So könnten Sie eine sortierte Liste haben, in der der Wert KeyValuePair<K,V> ist und der Schlüssel das Datum/die Uhrzeit ist, zu der das Element hinzugefügt wurde.

0

Da Sie eine bestimmte Anforderung haben, würde ich das Dictionary mit einer Queue/Buffer hinter implementieren (z. B. Ringpuffer in Kommentaren erwähnt).

OrderedDictionary ist eine gute Wahl und eine gute Quelle, wie man das macht (ich möchte es hier nicht veröffentlichen, aber Sie können es leicht finden) - Sie brauchen nur etwas besser als eine ArrayList, um Ihre Elemente zu halten mache die Ausquerung) - da du ständig das "erste" entfernst.

Verwandte Themen