簡體   English   中英

什么是在.Net中實現優先級數組收集的最快(插入速度)方式?

[英]What is the fastest (insert speed) way to achieve a prioritized collection of arrays in .Net?

我正在寫一個特定的優先級隊列。 其結構需要如下:

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。 這是有效的,但增加了我想要緩解的其他復雜性。

SortedDictionary將填補這份工作。 只需使用TryGetValue()有條件地找到列表。

也許你應該使用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});
}

嗯,作為底層容器的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...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM