关于c#:建议适用于键范围查找的数据结构


Suggest data structure suitable for key range lookup

我正在寻找类似于scg.dictionary的数据结构,但有数字范围作为键。

最需要性能的主要操作是查找与指定范围重叠的键。

例如,假设下面的地图

1
2
3
[ 5, 15] -> King
[35, 50] -> Bear
[25, 40] -> Doll

当[10,30]传递给搜索算法时,它必须用以下条目回复:

1
2
[ 5, 15] -> King
[25, 40] -> Doll

理想情况下,搜索方法应该返回IEnumerable,而不是将结果复制到中间容器中。类似于sortedset.getviewBetween

使用模式是沿着

1
2
3
4
5
6
7
8
var lookup = new RangeDictionary<int>();
lookup.Add( 5, 15, 'King' );
lookup.Add( 35, 50, 'Bear' );
lookup.Add( 25, 40, 'Doll' );

var results = lookup.FindIntersection( 10, 30 );
foreach( var pair in results )
  Console.WriteLine("[{0}, {1}] -> {2}", pair.Key.From, pair.Key.To, pair.Value );

有现成的解决方案吗?


以下是一个可能的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class RangeDictionary<T> : Dictionary<Range, T>
{
    public void Add(int from, int to, T value)
    {
        Add(new Range(from, to), value);
    }

    public IEnumerable<KeyValuePair<Range, T>> FindIntersection(int from, int to)
    {
        return this.Where(x => x.Key.IntersectWith(from, to));
    }
}

public struct Range
{
    public Range(int from, int to)
        : this()
    {
        From = from;
        To = to;
    }
    public int From { get; }
    public int To { get; }

    public bool IntersectWith(int from, int to)
    {
        return this.From <= to && this.To >= from;
    }
}

您可以在这个链接上看到一个实况示例。