競技プログラミング用のSortedDictionaryとQueueを使った平易な実装。キーの重複が可能で、キーが同一のものはFIFO(先入れ先出し)になります。確認はしていないけれど挿入と取り出しがO(log n)で出来るはずです。IEnumerableコードが長くなるので面倒なので実装していません。
// キーの重複がOKな優先度付きキュー public class PriorityQueue<TKey, TValue> { SortedDictionary<TKey, Queue<TValue>> dict = new SortedDictionary<TKey, Queue<TValue>>(); int count = 0; public int Count { get { return count; } } public void Add(TKey key, TValue value) { if (!dict.ContainsKey(key)) { dict[key] = new Queue<TValue>(); } dict[key].Enqueue(value); count++; } public KeyValuePair<TKey, TValue> Dequeue() { var queue = dict.First(); if (queue.Value.Count <= 1) { dict.Remove(queue.Key); } count--; return new KeyValuePair<TKey, TValue>(queue.Key, queue.Value.Dequeue()); } }
使い方:
var p = new PriorityQueue<int, int>(); while (p.Count != 0) { var kvpair = p.Dequeue(); Console.WriteLine(kvpair.Key + ", " + kvpair.Value); ... p.Add(key, value); }