哈希范围

时间:2010-08-18 20:24:46

标签: c# data-structures

我有一系列范围元素。每个元素都有一个开始和结束。在数组中,范围不重叠,并对它们进行排序。

即。 (代码只是为了说明,不要指望它编译):

var arr = { [0,3], [5,10], [15,59] };

给定一个值(比如说9),是否有一个范围的哈希函数可以让我快速获得包含该值的范围的元素?

当然有天真的解决方案,只需循环每个元素,直到找到合适的元素;更精细的一个,就像范围开始时的二元搜索一样;以及使用范围创建二叉树的专利权。

但有人知道使用哈希的方法吗?

3 个答案:

答案 0 :(得分:3)

您可以提前预先计算最近的邻居并将其存放在某处。在您的示例中,该表具有0..59个条目,您可以在每个索引处存储最近范围的索引。

这样会非常快。

答案 1 :(得分:1)

如何使用Dictionary<int, Element>来保存所有范围内的所有数字,i。即添加四个条目

0, [0,3]
1, [0,3]
2, [0,3]
3, [0,3]

等等其他范围。它使用字典使用哈希,但我怀疑它是最有效的解决方案。

答案 2 :(得分:0)

您可以为arr。

中的索引创建起始值的索引
var arr = { [0,3], [5,10], [15,59] };

var dictStart = new Dictionary<int, int>();
dictStart.Add(0, 0);
dictStart.Add(5, 1);
dictStart.Add(15, 2);

现在要获得范围,您可以对dictStart dict的值进行二进制搜索,以查找要搜索的值高于的第一个元素。然后选择上一个条目。

难以解释。作为一个例子,查找9.搜索得到元素e = [5,1]。

var range = arr[e[1]];   // = [5, 10]
bool isWithin = val <= range[1] && val >= range[0];

因此,它将减少记忆侵入。关键是快速搜索范围的起始值。

我想它会解决问题,但它不是哈希。