(log,)(logn)时间内(x,y)间隔中的项目数

时间:2014-07-30 05:17:48

标签: algorithm range kdtree range-tree

作业

我需要使用一个数据结构+算法,它返回由O(x,y)值组成的范围内的元素数(即返回xy平面上矩形范围内的元素数) (LOGN * logn)时间。


我正在考虑两个可能性,kd-tree和一个范围树。 kd树非常适合这种情况,因为它可以在O(logn + k)范围内找到元素(对于需要报告的k个元素)。但我不需要报告元素,我只需要计算范围内的元素数量。

范围树可以工作,我可以在每个节点中拥有一个属性,该属性包含多少比自身少的属性。这样,我可以确定在O(logn)次中有多少元素小于特定值(通过转到两个边界并找到彼此小于的节点数的差异)。但是,我不认为这适用于同时具有(x,y)维度的数据集。


我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:0)

您所描述的是在线二维正交范围计数问题。 "在线"表示在预处理数据之后,查询一个接一个地进行。 "正交"表示范围是轴对齐矩形。而且,与范围报告相反,范围计数仅计算属于该范围内的项目数。

在最坏的情况下,每个节点存储其下的节点总数的k-d树可以在O(n ^(1-1 / k))中执行范围计数。这是因为any orthogonal range can intersect at most O(n^(1-1/k)) leaves of a k-d tree。在2-d的情况下,这意味着范围计数查询可以在O(sqrt(n))中执行,这比所需的O((log(n))^ 2更差。

您的第三段没有意义,因为范围树是以高维定义的。实际上,它是高维正交范围计数问题的教科书解决方案。它在正确的O((log(n))^ 2)查询时间内解决了在线二维正交范围计数。我建议你阅读一篇开创性的论文Multidimensional Divide-and-Conquer,由Jon Louis Bentley撰写,他是几个独立发现的范围树之一。相关部分是2.1.2。

由于这是一个家庭作业问题,我不会详细说明,但我可能已经说了太多。