2008-08-18 10 views
2

Ich möchte eine Datenstruktur, die Abfrage ermöglicht, wie viele Artikel in letzten X Minuten. Ein Element kann einfach ein einfacher Bezeichner oder eine komplexere Datenstruktur sein, vorzugsweise befindet sich der Zeitstempel des Elements in dem Element und wird nicht außerhalb gespeichert (als ein Hash oder ähnliches würde er keine Probleme mit mehreren Elementen haben wollen, die dasselbe haben) Zeitstempel).Alternde Datenstruktur in C#

Bisher scheint es, dass ich mit LINQ leicht Elemente mit Zeitstempel größer als eine bestimmte Zeit filtern und eine Zählung aggregieren konnte. Obwohl ich zögere zu versuchen, .NET 3.5 spezifische Sachen in meiner Produktionsumgebung noch zu arbeiten. Gibt es weitere Vorschläge für eine ähnliche Datenstruktur?

Der andere Teil, dass ich interessiert bin in Alter alte Daten aus ist, wenn ich nur für Zählungen von Gegenständen weniger als 6 Stunden würde Ich mag alles, was älter ist als die entfernt wird fragen werden werde von meine Datenstruktur, weil dies ein lang laufendes Programm sein kann.

Antwort

3

Eine einfache verknüpfte Liste kann dafür verwendet werden.

Im Grunde fügen Sie neue Elemente zum Ende hinzu, und entfernen Sie zu alte Elemente von Anfang an, es ist eine billige Datenstruktur.

Beispiel-Code:

list.push_end(new_data) 
while list.head.age >= age_limit: 
    list.pop_head() 

Wenn die Liste beschäftigt genug sein wird, Abhacken größere Stücke als einer nach dem anderen zu rechtfertigen, dann bin ich mit dmo, eine Baumstruktur oder etwas ähnliches verwenden, die Beschneidung erlaubt auf einer höheren Ebene.

2

Ich denke, dass eine wichtige Überlegung die Häufigkeit der Abfrage im Vergleich zum Hinzufügen/Entfernen sein wird. Wenn Sie häufig Abfragen tun wird ein B-Baum kann der Weg zu gehen (vor allem, wenn Sie eine große Sammlung haben werden):

http://en.wikipedia.org/wiki/B-tree

Sie einige Faden durchlaufen haben könnte und diesen Baum aufzuräumen periodisch oder mach es Teil der Suche (wieder, abhängig von der Verwendung). Im Grunde genommen werden Sie eine Baumsuche durchführen, um den Punkt "x minutes ago" zu finden, und dann die Anzahl der untergeordneten Knoten auf den Knoten mit neueren Zeiten zählen. Wenn Sie die Anzahl der untergeordneten Knoten unter den Knoten auf dem neuesten Stand halten, kann diese Summe schnell ausgeführt werden.