2009-09-19 6 views
9

Ich brauche eine ziemlich spezialisierte Sammlung von .NET, und ich denke nicht, dass die BCL mir helfen kann, aber ich dachte, ich würde es da rausschmeißen, wenn jemand etwas Ähnliches wüsste.Existiert eine sortierte Warteschlange in .NET?

Grundsätzlich meine Anforderungen sind somit:

  • Ich habe eine Liste von Paaren von Werten, wie zum Beispiel: (3, 10), (5, 10), (3, 7), (5, 5)
  • Reihenfolge ist wichtig, dh. (3, 10)! = (10, 3)
  • Duplikate einzelner Werte sind in Ordnung, doppelte Paare sollten jedoch gelöscht werden (vorzugsweise im Hintergrund).
  • Der Kicker ist, ich brauche diese Liste die ganze Zeit sortiert. Ich bin immer nur an dem ersten Wert in der Liste interessiert, der durch den Sortieralgorithmus definiert wird.

So, einige Beispiel-Code, was ich will (wie ich es wahrscheinlich umgesetzt würde sich vorstellen, andere Implementierungen, die oben sind in Ordnung zu passen) zu tun in der Lage:

public class Pair 
{ 
    public Pair(int first, int second) 
    { First = first; Second = second; } 
    public int First { get; set; } 
    public int Second { get; set; } 
} 

SortedQueue<Pair> foo = new SortedQueue<Pair>((left, right) => { 
    return right.First - left.First; 
}); 

foo.Add(new Pair(10, 3)); 
foo.Add(new Pair(4, 6)); 
foo.Add(new Pair(6, 15)); 
foo.Add(new Pair(6, 13)); // This shouldn't cause a problem 

Pair current = foo.Shift(); // current = (4, 6) 

Antwort

11

Ich zitiere:

Ich brauche diese Liste die ganze Zeit sortiert. Ich bin immer nur an der ersten Wert in der Liste interessiert, wie durch die Sortieralgorithmus zu jeder Zeit definiert.

Das klingt wie Sie nicht wollen eine Sorted Queue aber ein Priority Queue tun. Wenn Leistung ein Problem ist, wird ein PQ sicherlich schneller sein, O (log n) vs O (n). Aber das Drop-Duplikat-Problem würde erfordern, dass Sie ein paralleles HashSet <> auch beibehalten.

+5

Siehe "Priority queue in. Net", http://stackoverflow.com/questions/102398/priority-queue-in-net –

+0

Vielen Dank für den richtigen Namen und Link. Und jetzt, wo ich über den Wikipedia-Artikel blicke, war die Art, wie ich daran dachte, sie zu implementieren, eine Mischung aus den beiden Typen, die in den 'einfachen Implementierungen' aufgelistet sind (eine Liste mit einem Flag, ob sie sortiert ist oder nicht) Bei der Einfügung, dann sortieren Sie, wenn Sie vor dem Abrufen benötigt werden). Und danke dangph für die Verbindung zu einigen tatsächlichen Implementierungen. –

+0

Für die Aufzeichnung, das war für eine Implementierung von A * Suche auch, die dieser Wikipedia-Artikel einige Anmerkungen auf auch hat, also doppelte Anerkennung. –

5

Sie haben schaute auf SortedDictionary oder SortedList?

+3

Für eine Sekunde dachte ich, ich muss blind geworden sein. Ein Problem jedoch, unterstützen keine doppelten Schlüssel, was eine Voraussetzung ist. –

+0

Ich habe Neuigkeiten für Sie Matt: Wenn du Schlüssel dupliziert, ist es das gleiche Objekt. Die Lektion hier besteht darin, Equals so zu überschreiben, dass sie auf einer von Ihnen festgelegten Basis gleich sind. –

+0

Ich würde viel lieber mit LINQ über manuelle überschreiben gleich ... – RCIX

0

SortedList wäre am besten, alles, was Sie tun müssen, ist dann IComparable in Ihrer Pair-Klasse zu implementieren, und es würde sie automatisch bestellen. Was das Entfernen von Duplikaten anbelangt, denke ich nicht, dass die sortierte Liste das handhabt, aber Sie könnten davon erben und diese Funktionalität hinzufügen.

0

sollten Sie höchstwahrscheinlich eine Lookup-Klasse verwenden, wie The Skeet in his answer erwähnt. Dann bauen Sie und greifen sie mit etwas wie folgt aus:

List<Lookup<int, int>> yourList = new List<Lookup<int, int>>(); 
yourList.Add(new Lookup(3,5)); 
//... 
var list = from item in yourList 
      orderby list.Key //or whatever sort criteria you want here 
      select item; 
//use list 

Die Syntax ein wenig aus in 1 oder 2 Punkte sein können, aber es sollte funktionieren.

1

In .NET ist zu diesem Zeitpunkt nichts eingebaut, das alle Ihre Anforderungen erfüllt. In .NET 4.0 gibt es eine SortedSet-Klasse. Ich weiß, dass es dir jetzt wahrscheinlich nicht viel nützt.

SortedList kommt nahe, wenn Sie IComparable implementieren. Sie würden einfach das Paar als Schlüssel und Wert verwenden. Sie würden den Verweis auf Ihr Paar nur zweimal speichern, so dass kein großer Speicheraufwand entsteht. Aber das wird sich nicht um Duplikate kümmern.

Es gibt zahlreiche Möglichkeiten, um es selbst zu schreiben, aber nichts eingebaut, das vollständig entspricht, was Sie brauchen. Es gibt ein paar Open-Source-SortedSet-Implementierungen (zum Beispiel gibt es eine in Spring.Net). Das könnte jetzt deine beste Wette sein.

+0

Nach vielen Male der Verwendung von Hashes in Perl/PHP, um einfach Zugriff auf einen bestimmten Typ zu bekommen, und jedes Mal, wenn ich nur die Schlüssel in einer Sammlung verwende, fühlt es sich an wie ein Hack und ich will mich übergeben. Unglücklicherweise sind wir damit beschäftigt. Aber! Dies ist ein persönliches Projekt, und ich habe bereits VS 2010 installiert, also könnte ich das vielleicht doch benutzen ... –

2

Überprüfen Sie die , die bereits eine Implementierung genau wie Sie, eine IntervalHeap oder Priority Queue genannt hat. Hier ist eine Dokumentation aus dem C5 Buch: IPriorityQueue<T>

Verwandte Themen