最大化平面值中的点

Maximize point in plane value

所以,基本上,我需要一种方法来找出平面中坐标严格小于一个点的最大值的点。

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

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) space.

的东西

示例:

每个点的最佳值是:

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

这是一个构建时间为 O(N log N) 的算法(如果您雄心勃勃并实现了一种奇特的数据结构,则为 O(N))以及 space 和 O(log N) 时间查询.

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

为了解决 y 轴上的一维问题,我们将 非支配 点保留在平衡二叉搜索树中。 (如果有一个点y值小,值大,则该点占优势。)查询,在树中找到query.y的前导。要插入,首先查询 y 以确保新点未被支配。如果它是非支配的,则插入它并删除它支配后的点。分摊插入时间为 O(log N)。