我正在写一个特定的优先级队列。其结构需要如下:
Priority(<int>) Data(List<Object>)
1 a, b, g, h
3 c, d, j
4 k
10 e, f, i
我需要能够有效地查找是否存在给定优先级的列表;如果没有,请创建列表并添加消息,否则将消息附加到现有列表。
我写过一棵红黑树,但这似乎有点过分,可能不是最快的解决方案。它还有一个缺点,就是无法按优先级轻松获取消息,我需要在写完成后才能这样做。
我想到了词典,但除非我弄错了,否则没有简单的方法说“如果键__存在,给我相应的值,否则给我null”。或者我错过了什么?
修改
我目前的实施是拥有32个固定列表。将适用的列表添加到32位标志中并将适用的位设置。我使用De Bruijn的算法来获得LSB。这是有效的,但增加了我想要缓解的其他复杂性。
答案 0 :(得分:3)
SortedDictionary将填补这份工作。只需使用TryGetValue()有条件地找到列表。
答案 1 :(得分:3)
也许你应该使用Dictionary<int,List<object>>
public void Add(int priority,object data)
{
if(dictionary.ContainsKey(priority))
dictionary[priority].Add(data);
else
dictionary.Add(priority,new List<object>{data});
}
答案 2 :(得分:3)
嗯,Dictionary
作为底层容器有什么问题?平均而言,您获得O(1)访问/插入时间,而不是使用rb-tree获得O(log n)。只需根据您的需要包裹Dictionary
,例如:
internal public class PriorityQueue<TValue>
{
private Dictionary<int, List<TValue>> mDict;
// only Add, TryGetValue shown...
public void Add(int pPriority, TValue pInput)
{
List<TValue> tTmp;
if (mDict.TryGetValue(pPriority, tTmp))
{
tTmp.Add(pInput);
}
else
{
mDict.Add(pPriority, new List<TValue>{ pInput });
}
}
public bool TryGetValue(int pPriority, out List<TValue>)
{
// obvious...
}
}