具有自定义搜索行为的类似字典的结构

本文关键字:字典 结构 自定义 搜索 | 更新日期: 2023-09-27 17:55:11

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

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

Dictionary<double,LinkedList<T>>

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

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

具有自定义搜索行为的类似字典的结构

我不知道

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

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);
    }
}

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

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
}

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

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