Каков самый быстрый (скорость вставки) способ достижения приоритетного сбора массивов в .Net? - PullRequest
3 голосов
/ 14 мая 2011

Я пишу очередь с определенным приоритетом. Его структура должна быть такой:

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

Мне нужно эффективно определить, существует ли список для данного приоритета; если нет, создайте список и добавьте сообщение, в противном случае добавьте сообщение в существующий список.

Я написал красно-черное дерево, но это кажется излишним для этого и, возможно, не самым быстрым решением. У него также есть недостаток, заключающийся в том, что он не может легко захватывать сообщения по приоритету, что я должен делать после завершения записи.

Я думал о Словаре, но, если я не ошибаюсь, у него нет простого способа сказать: «Если ключ __ существует, дайте мне значение, соответствующее ему, иначе дайте мне ноль». Или я что-то упустил?

EDIT

Моя текущая реализация должна иметь 32 фиксированных списка. Применимый список добавлен, а применимый бит установлен в 32-битном флаге. Я использую алгоритм де Брюина, чтобы получить младший бит. Это эффективно, но добавляет другую сложность, которую я хочу облегчить.

Ответы [ 3 ]

3 голосов
/ 14 мая 2011

Может быть, вы должны использовать 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});
}
3 голосов
/ 14 мая 2011

Хм, что не так с Dictionary в качестве основного контейнера? Вы получаете O (1) время доступа / вставки в среднем вместо O (log n) с rb-деревьями. Просто оберните 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...
    }
}
3 голосов
/ 14 мая 2011

SortedDictionary будет выполнять работу.Просто используйте TryGetValue (), чтобы условно найти список.

...