最大化平面值点

时间:2016-06-11 13:42:32

标签: c++ algorithm geometry plane

所以,基本上,我需要一种方法来确定平面中的点是什么,其最大值的坐标严格小于一个点。

一种方法是检查所有具有复杂性的点。

O(N) time, N being the number of points.
O(1) space.

另一种方法是使用二进制索引树(BIT)来实现它,这将给出复杂性

O(log(max(X))*log(max(Y)) time, X being the maximum x coordinate and Y being the max y coordinate.
O(max(X)*max(Y)) space, this is the main problem, I can't afford that much space.

我想要一些具有对数复杂度且尽可能接近O(N)空间的东西。

示例:

Example

每个点的最佳值是:

A -> 0 ( none )
B -> 2 ( A )
C -> 2 ( A )
D -> 0 ( none )
E -> 10 ( D )

1 个答案:

答案 0 :(得分:1)

这是一个具有O(N log N)构造时间的算法(O(N),如果你雄心勃勃并实现其中一个奇特的数据结构)和空间和O(log N)时间查询。

我们的想法是使用O(log N)时间插入对1D问题进行增量解决,并使用链接的Wikipedia页面上描述的标准技术制作中央数据结构(平衡二叉搜索树)partially persistent 。要构建2D数据结构,请按x增加对点进行排序,然后将它们按顺序插入到1D结构中,从而保存对按x排序的列表中的1D快照的引用。要查询2D结构,在我们使用point.x≥query.x插入一个点之前对最后一个快照进行二进制搜索,然后进行一维查询。

要解决y轴上的1D问题,我们将非支配点保留在平衡二叉搜索树中。 (如果存在具有较小y值和较大值的另一个点,则占优势。)要查询,请在树中查找query.y的前导。要插入,首先查询y以确保新点不受支配。如果它是非支配的,那么插入它并删除它占主导地位的点。摊销的插入时间为O(log N)。