使用1D的2D区间树

时间:2012-01-08 18:42:57

标签: c# collections 2d intervals interval-tree

我正在使用此处的{#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逐步执行它之前,比较每个元素以重叠所需的边界。

1 个答案:

答案 0 :(得分:2)

看起来,您不需要实现不是间隔树而是KD树数据结构。如果我没记错的话,KD-Trees可以为低维度启用O(log N)搜索时间。

快速google返回了许多结果,例如:http://www.codeproject.com/KB/architecture/KDTree.aspx您可以去检查它是否符合您的需求,或者如果没有,还可以找到其他实施方案。