用于保存和检索平面中的点的数据结构

时间:2015-02-19 02:28:04

标签: algorithm data-structures

定义1:当且仅当x <0时,点(x,y)是控制点(x',y')。 x'和y&lt; Y”。

定义2:点(x,y)由点(x',y')控制当且仅当x'&lt; x和y'&lt;收率

我正在尝试提供数据结构以支持以下操作:

  • Add(x,y) - 以O(logn)复杂度向系统添加点(x,y),其中n是系统中的点数。

  • 删除(x,y) - 以O(logn)复杂度从系统中移除一个点(x,y),其中n是系统中的点数。

  • 分数(x,y) - 返回点数(x,y)控制数 - (x,y)控制的点数。最坏情况复杂度O(logn)。

我尝试使用多个AVL树解决它,但无法提供足够优雅的解决方案。

2 个答案:

答案 0 :(得分:2)

  

当且仅当x <0时,点(x,y)是控制点(x&#39;,y&#39;)。 X&#39;和y&lt;   ý&#39;

     

点(x,y)由点(x&#39;,y&#39;)控制,当且仅当x&#39; &LT; x和   ý&#39; &LT;收率

让我们假设(x,y)是正方形的中间。 (x,y)是B平方中的控制点,由C中的点控制。

所需的输出是点数(x,y)控制减去由(x,y)控制的点数(x,y)。这是B中的点数减去C中的点数B-C(参考A,B,C,D中的点数仅为A,B,C,D)。

我们可以轻松计算A+C中的点数,这只是x&#39;的点数。 &LT; X。 同样适用于C+D(带有y&#39; y的点),B+D(x&#39;&gt; x)。 我们将A+C加到C+D A+2C+D。 将A+B加到B+D A+2B+D。 扣除两个:A+2B+D-(A+2C+D) = 2B-2C,除以2:(2B-2C)/2 = B-C这是所需的输出。

(我假设处理1D案件很简单,没有必要解释。)

答案 1 :(得分:1)

为了将来参考

解决方案大纲:

我们将维护两个AVL树。

  • Tree_X:将按照X坐标保存点。
  • Tree_Y:将保存按Y坐标排序的点。

两棵树中的每个节点都将包含以下附加数据:

  1. 左子树中的叶数。
  2. 右子树中的叶数。
  3. 对于点$(x,y)$,我们将定义区域A,B,C,D:

    • 点(x&#39;,y&#39;)在A中,如果x&#39; &LT; x和y&#39; &GT;收率
    • 如果x&#39;则点(x&#39;,y&#39;)在B中。 &GT; x和y&#39; &GT;收率
    • 点(x&#39;,y&#39;)在C中,如果x&#39; &LT; x和y&#39; &LT;收率
    • 点(x&#39;,y&#39;)在D中,如果x&#39; &GT; x和y&#39; &LT;收率

    现在很明显得分(x,y)= | C | - | B |。 但是| A | + | C |,| B | + | D |,| A | + | B |,| C | + | D |可以很容易地从我们的两个AVL树中检索到,我们很快就会看到。 请注意[(| A | + | C | + | C | + | D |) - (| A | + | B | + | B | + | D |)] / 2 = | C | - | B |

    实施所需的操作:

    • 添加(x,y) - 我们将向两个AVL树添加点(x,y)。由于我们存储的附加数据仅在插入路径上受影响,并且由于插入发生在(logn)中,因此Add(x,y)的总成本为O(logn)。

    • 删除(x,y) - 我们将从两个AVL树中删除点(x,y)。由于我们存储的附加数据仅在删除路径上受到影响,并且由于删除发生在(logn)中,因此Remove(x,y)的总成本为O(logn)。

    • 得分(x,y) - 我将展示如何以类似的方式和相同的复杂性成本计算$ | B | + | D | $。很明显,$ | B | + | D | $是满足$ x&#39;的点数。 &GT; X $。要计算这个数字,我们将:

      1. 在AVL_X中查找x。复杂性O(logn)。
      2. 在Tree_X中向上直到根,在每一个右转,我们将总结儿子左子树中的元素数量。复杂度O(logn)。
      3. Remove(x,y)的总成本为O(logn)。