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; } } |
您可以在这个链接上看到一个实况示例。