我正在使用此处的{#3}}的C#区间树集合类 - >右手边 - >下载。
我需要从集合中获取与给定间隔重叠的间隔。 .Get(left, right)
似乎很容易。但是我需要2D间隔,显然这不是从1D开始的。
我听说有关嵌套的事情。
IntervalTree<IntervalTree<stored_type, float>, float> intervals;
然而,再一次,这似乎没有看出来。来自其他任何移动间隔的公寓似乎都很昂贵,并且确定在哪里添加它们似乎很复杂。
IntervalTree<stored_type, float> intervals_x;
IntervalTree<stored_type, float> intervals_y;
我不确定我是否会这样做Get(left, right, upper, lower)
。据推测,stored_type的一个实例将存在并且属于两个集合,但是如果集合在事物发生变化时重新安排自己会有问题吗?
但是.Get(...)
完成了List<stored_type>
。区间列表中的内容远远少于此区域,但此List
中的大量项目仍需要快速处理,但独立地,它们不需要订单。我可以将List
转换为另一个集合(如LinkedList或HashSet),以便比遍历它更快地遍历吗?
编辑:
所以可能类似以下内容。
class interval_tree_2D
{
private IntervalTree<stored_type, float> x =
new IntervalTree<stored_type, float>();
private IntervalTree<stored_type, float> y =
new IntervalTree<stored_type, float>();
public void add(stored_type n,
float left, float right, float lower, float upper)
{
intervals_x.AddInterval(left, right, n);
intervals_y.AddInterval(upper, lower, n);
}
public HashSet<stored_type> get(
float left, float right, float lower, float upper)
{
var i1 = x.Get(left, right);
var i2 = y.Get(lower, upper);
var i3 = i1.to_HashSet();
var i4 = i2.to_HashSet();
return i3.union(i4);
}
}
除了没有to_HashSet()之外,所以我不得不使用双循环来找出两个集合相交的位置。此外,每个元素的x和y都是硬编码的。
我真的很喜欢一些反馈。在我使用HashSet和foreach逐步执行它之前,比较每个元素以重叠所需的边界。
答案 0 :(得分:2)
看起来,您不需要实现不是间隔树而是KD树数据结构。如果我没记错的话,KD-Trees可以为低维度启用O(log N)搜索时间。
快速google返回了许多结果,例如:http://www.codeproject.com/KB/architecture/KDTree.aspx您可以去检查它是否符合您的需求,或者如果没有,还可以找到其他实施方案。