[英]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.