【问题标题】:What is the fastest (insert speed) way to achieve a prioritized collection of arrays in .Net?在.Net中实现数组优先集合的最快(插入速度)方法是什么?
【发布时间】:2011-05-14 11:05:42
【问题描述】:

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

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。这很有效,但增加了我想减轻的其他复杂性。

【问题讨论】:

标签: c# .net sortedlist jump-list


【解决方案1】:

也许你应该使用Dictionary&lt;int,List&lt;object&gt;&gt;

public void Add(int priority,object data)
{
    if(dictionary.ContainsKey(priority))
       dictionary[priority].Add(data);
    else
       dictionary.Add(priority,new List<object>{data});
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案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...
          }
      }
      

      【讨论】:

      • 奇怪的是,这个解决方案比我最初在调试模式下运行时接受的解决方案稍慢,但在 VS 之外运行时更快。我想知道为什么。
      • 第一个解决方案需要在Add 内进行两次字典查找:一个用于ContainsKey,另一个用于使用索引器。上述解决方案只进行一次查找(使用TryGetValue)。从理论上讲,由于平均而言两者都是 O(1),因此应该没有区别,但是您会得到额外方法调用的开销,并且 O(1) 嗯,嗯,只是理论上的。关于调试和发布模式的区别:好吧,我只是推测,但我可以想象使用ref参数时会注入一些额外的代码......
      猜你喜欢
      • 2010-09-23
      • 2020-10-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多