2009-09-19 14 views
9

Potrzebuję dość wyspecjalizowanej kolekcji .NET i nie sądzę, że BCL może mi pomóc, ale pomyślałem, że wyrzucę ją tam, gdyby ktoś wiedział o czymś podobnym.Czy posortowana kolejka istnieje w .NET?

Zasadniczo moje wymagania są więc:

  • mam listę par wartości, takich jak: (3, 10), (5, 10), (3, 7), (5, 5)
  • Zamówienie jest ważne, tj. (3, 10)! = (10, 3)
  • Duplikaty pojedynczych wartości są w porządku, ale zduplikowane pary należy upuścić (najlepiej po cichu).
  • Kicker jest, potrzebuję tej listy posortowanej przez cały czas. Interesuje mnie tylko pierwsza wartość na liście, jaką definiuje algorytm sortowania w tym samym czasie.

Więc jakiś przykład kodu, co chcę być w stanie to zrobić (jak ja sobie wyobrazić, że to prawdopodobnie być realizowane, inne implementacje, które pasują powyższe są grzywny):

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) 

Odpowiedz

11

cytuję:

muszę to lista posortowana cały czas. Zawsze interesuje mnie tylko pierwsza wartość na liście zdefiniowana przez algorytm sortowania w dowolnym momencie.

To brzmi jak ty nie chcą posortowanej kolejki ale Priority Queue. Jeśli wydajność jest problemem, to PQ z pewnością będzie szybszy, O (log n) kontra O (n). Ale problem z duplikatem kropli wymagałby również zachowania równoległego HashSet <>.

+5

Zobacz "Kolejka priorytetowa w .Net", http://stackoverflow.com/questions/102398/priority-queue-in-net –

+0

Dziękuję za poprawną nazwę i link. A teraz, kiedy przeglądam artykuł wikipedia, sposób, w jaki myślałem o jego implementacji, był mieszanką dwóch typów wymienionych w "prostych implementacjach" (zachowując listę z flagą, czy została posortowana, czy nie, po prostu dołącz na insercie, a następnie sortuj w razie potrzeby przed pobraniem). I dziękuję za link do niektórych rzeczywistych implementacji. –

+0

Dla przypomnienia, było to również dla implementacji wyszukiwania A *, które to artykuł wikipedia zawiera również uwagi, więc podwójne kudo. –

5

Mają cię spojrzał na SortedDictionary lub SortedList?

+3

Przez sekundę myślałem, że musiałem być ślepy. Jeden problem jednak nie obsługuje duplikatów kluczy, co jest wymogiem. –

+0

Mam dla ciebie wiadomości Matt: Jeśli klucz jest duplikowany, to ten sam obiekt. Lekcja tutaj polega na zastąpieniu równań, aby były równe na podstawie ustalonej przez ciebie. –

+0

Zdecydowanie wolałbym używać LINQ nad ręcznym przesłonięciem równym ... – RCIX

0

SortedList byłby najlepszy, wszystko, co musisz zrobić, to zaimplementować funkcję IComparable w klasie Pair i automatycznie je uporządkować. Jeśli chodzi o usuwanie duplikatów, nie sądzę, że posortowana lista to obsługuje, ale można ją dziedziczyć i dodawać tę funkcję.

0

powinieneś najprawdopodobniej użyć klasy Lookup jako The Skeet wspomina w his answer. Następnie należy zbudować i dostęp do niego z czymś takim:

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 

składnia może być trochę off w 1 lub 2 punktach, ale to powinno działać.

1

Nie ma nic wbudowanego w .NET w tym momencie, który spełnia wszystkie twoje wymagania. W .NET 4.0 istnieje klasa SortedSet. Zdaję sobie sprawę, że prawdopodobnie teraz ci nie pomaga.

SortedList jest blisko, jeśli zaimplementujesz funkcję IComparable. Po prostu użyjesz Pary jako klucza i wartości. Przechowywałbyś odwołanie do pary tylko dwa razy, więc nie jest to nadmierne obciążenie pamięci. Ale to nie zajmie duplikatów.

Istnieje wiele sposobów, aby napisać to samemu, ale nic w tym wbudowanego nie pasuje do tego, czego potrzebujesz. Istnieje kilka implementacji SortedSet Open Source (na przykład w Spring.Net). To może być teraz twój najlepszy zakład.

+0

Po wielu użyciach haszy w Perlu/PHP, aby uzyskać dostęp do ustawionego typu, a za każdym razem, gdy używam tylko klucza w kolekcji, czuję się jak włamywacz i chcę zwymiotować. Niestety, to właśnie utknęliśmy. Ale! To jest osobisty projekt, a ja już zainstalowałem VS 2010, więc mogę po prostu użyć tego ... –

Powiązane problemy