0

我正在寻找一种可以对特定键进行搜索的数据结构。关键是间隔。一旦将单个值传递给此结构,它应该找到正确的间隔(适当的键),然后该键可能指向其他几个值。

我搜索了多个值的一些键,发现了这样的内容:

Dictionary<double,LinkedList<T>>

但是这里的键值是一个简单的双精度值,而不是区间类型。如果是区间类型,我必须将区间作为键传递。但是我需要基于单个值进行搜索并找到间隔。

换句话说,我们能否拥有一个具有自定义搜索行为的类字典结构?(例如,将搜索作为 Func<,> 参数传递。)

4

3 回答 3

2

我不知道这样的现有结构。但是有很多方法可以自己解决这个问题。首先想到的是为字典编写一个扩展方法,如下所示:

public static class DictionaryRangeExtensions
{
    public IEnumerable<T> FindValuesInRange(this Dictionary<double,T> dictionary, double lowerBound, double upperBound)
    {
         dictionary.Where(kvp=> kvp.Key > lowerBound && kvp.Key < uppoerBound).Select(kvp=>kvp.Value);
    }
}
于 2013-01-23T06:03:24.833 回答
2

如果希望将范围作为键并按值查找,我认为这将作为键:

public class Range
{
   public Range(double lower, double upper)
   {
       this.lower = lower;
       this.upper = upper;
   }

   public override Equals(object obj)
   {
       if(obj is double) return ((double)obj) > lower && ((double)obj) < upper;
       //sensibly complete this method
   }

   //also override GetHashcode, probably to use the hashcode of upper and lower
}
于 2013-01-23T06:15:37.013 回答
0

对于非重叠间隔,如果您可以将值映射到恒定时间的间隔 - @tallseth 建议,间隔作为普通字典中的键。

如果您必须搜索值落入的区间 - 将区间存储为排序数组(您可以轻松地这样做,因为区间不重叠,因此<为每对区间定义)。比你二分查找找到区间值落入。使用间隔,您可以索引字典或让数据包含“间隔”,并使用适当的函数从 dat 中选择间隔进行排序/散列。

于 2013-01-23T06:25:32.887 回答