使用键值范围的字典对象

Jef*_*ron 22 .net c# lookup dictionary

我需要一种专门的字典.我的用例是这样的:用户想要指定值的范围(范围也可以是单个点)并为特定范围分配值.然后,我们想要使用单个值作为键来执行查找.如果此单个值出现在其中一个范围内,那么我们将返回与该范围关联的值.

例如:

// represents the keyed value
struct Interval
{
    public int Min;
    public int Max;
}

// some code elsewhere in the program
var dictionary = new Dictionary<Interval, double>();
dictionary.Add(new Interval { Min = 0, Max = 10 }, 9.0);
var result = dictionary[1];
if (result == 9.0) JumpForJoy();
Run Code Online (Sandbox Code Playgroud)

这显然只是一些代码来说明我正在寻找的东西.有谁知道实现这样的事情的算法?如果是这样,他们会指向我吗,拜托?

我已经尝试在Interval上实现一个自定义IEqualityComparer对象并重载Equals()和GetHashCode()但到目前为止无济于事.可能是我做错了.

Eri*_*ert 27

字典不是您所描述的操作的适当数据结构.

如果要求间隔永远不会重叠,那么您可以构建一个排序的间隔列表并对其进行二进制搜索.

如果间隔可能重叠,那么您需要解决更难的问题.要有效地解决这个问题,你需要构建一个区间树:

http://en.wikipedia.org/wiki/Interval_tree

这是一个众所周知的数据结构.请参阅"算法简介"或任何其他体面的数据结构文本.

  • 虽然 Jeffrey Cameron 的评论已经很老了,但 SortedList 目前没有快速查找最近的键操作是毫无价值的。此时,List 类和 List.BinarySearch 方法可以提供快速的最近键查找。 (2认同)

Hen*_*man 6

这仅在间隔不重叠时才起作用.而你的主要问题似乎是从单个(键)值转换为间隔.

我会在SortedList周围写一个包装器.SortedList.Keys.IndexOf()会找到一个索引,可用于验证间隔是否有效,然后使用它.

  • 实际上,如果要求间隔不重叠,则问题是微不足道的; 你可以二元搜索排序列表.如果允许间隔重叠,那么你就会遇到一个相当困难的问题. (4认同)