3

我正在写一个特定的优先级队列。它的结构需要如下所示:

Priority(<int>)    Data(List<Object>)
1                  a, b, g, h
3                  c, d, j
4                  k
10                 e, f, i

我需要能够有效地查找给定优先级的列表是否存在;如果没有,则创建列表并添加消息,否则将消息附加到现有列表中。

我写了一棵红黑树,但这似乎有点过头了,可能不是最快的解决方案。它还有一个缺点,就是不能轻松地按优先级抓取消息,我需要在编写完成后才能做到这一点。

我想过Dictionary,但除非我弄错了,否则它没有简单的方式来说“如果键__存在,则给我对应的值,否则给我null”。还是我错过了什么?

编辑

我目前的实现是有 32 个固定列表。将适用列表添加到 32 位标志中并设置适用位。我使用 De Bruijn 的算法来获得 LSB。这是有效的,但增加了我想减轻的其他复杂性。

4

3 回答 3

3

SortedDictionary 将填补这份工作。只需使用 TryGetValue() 有条件地查找列表。

于 2011-05-14T11:16:47.493 回答
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});
}
于 2011-05-14T11:18:23.383 回答
3

嗯,Dictionary作为底层容器有什么问题?您平均获得 O(1) 访问/插入时间,而不是使用 rb-trees 的 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...
    }
}
于 2011-05-14T11:28:46.370 回答