【问题标题】:Finding nearest value in a SortedDictionary在 SortedDictionary 中查找最近的值
【发布时间】:2013-12-26 19:32:57
【问题描述】:

我有一个排序字典

 SortedDictionary<int, CPUOptimizationObject> myDict;

现在我想找到 X 以上的第一个值。 我可以做这样的事情

foreach (var iKey in MyDict.Keys)
{
   if (iKey >= thresholdKey)
   {
       foundKey = iKey;
       break;
   }
}

但这在性能方面并不好。
有更好的建议吗?
(在集合中是否有类似 Binary search for SortedDictionary 的方法?)

【问题讨论】:

  • 使用双精度键不是一个好主意。如果您正在寻找最近的匹配项,您在其中存储了什么?为什么要使用 SortedDictionary?您要解决的实际问题是什么?
  • 您可以调用 ToList() 然后执行 BinarySearch 或 LINQ。但不确定那是否更快。也许您可以改进您的工程以获得更好的键或其他列表类型,如 Panagiotis 已经说过的。
  • 你对双倍的看法是正确的。固定为整数。
  • double 在一段历史代码中,由 3 个字符串翻译而来。在问题中更改了它,但问题仍然存在
  • 您不能使用BinarySearch,因为KeyCollection-class 没有实现IList(作为数组或列表),因此它不允许随机访问。所以我怀疑你是否可以轻松改进它。

标签: c# collections dictionary sorteddictionary


【解决方案1】:

虽然理论上,找到大于给定值的最小项是可以在二叉搜索树上有效执行的操作(这是 SortedDictionary 的实现方式)SortedDictionary 不会公开您对该数据类型执行此类搜索的方法。

您需要使用不同的二叉搜索树实现,以便有效地执行此类搜索,同时仍使用相同类型的数据结构。没有合适的 .NET 类型;您需要使用 3rd 方实现(其中有很多)。

【讨论】:

    【解决方案2】:

    如果这样更快,您可以尝试。但我想只有多次执行搜索才会更快。

    var keys = new List<int>(myDict.Keys);
    int index = keys.BinarySearch(thresholdKey);
    

    【讨论】:

    • 这肯定会更慢,毫无疑问,除非您执行多个搜索。
    【解决方案3】:

    在您的 Sorteddictionary 上使用 .toList() 创建一个临时列表 n 现在因为结果是一个列表 n 你可以这样做

      n.Find(item =>item >20)
    

    检索第一个匹配的键,

    【讨论】:

      【解决方案4】:

      我不知道这是否比 foreach 有更好的性能,但这应该可以:

      var foo = myDict.FirstOrDefault(i => i.Key > thresholdKey);
      

      【讨论】:

      • 这写起来更短,但它会做几乎完全相同的事情。
      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2017-01-23
      • 2021-12-26
      相关资源
      最近更新 更多