用于> 2D天际线查询/有效前沿的算法

时间:2016-06-02 00:19:46

标签: algorithm optimization

手头的问题:

在D维空间中给出一组N个点,其所有坐标都> = 0(在2D中,点将全部在第一象限中,在第一个八分区中为3D,依此类推......) ,删除在每个坐标中具有值大于或等于的另一个点的所有点。

在2D中,结果为:enter image description here

(图片来自Vincent Zoonekynd的回答here)并且有一个简单的算法,在该答案中详述,在N*log(N)中运行。 通过分块,我应该把它带到N*log(H),但对此的优化是另一个问题。

我有兴趣将解决方案扩展到3个维度(如果它仍然合理的话可能是4个),但是我目前的3D算法非常慢,很麻烦,并且不能很好地推广到4D:

  • 在x轴上对点进行排序,注释每个点的位置
  • 使用N个叶子初始化一种分段树,其中叶子将保持点的y值,节点将保持max(child1, child2)
  • z轴上的点排序
  • 对于最大z的每个点:
    • 检查x顺序中的位置,尝试将其放在该位置的分段树中
    • 首先检查是否有一个点已经向下(因此它有> z),在更高的位置(因此它有> x)并且y更大(这是成本log(N),谢谢树)
    • 如果找到所述点,则丢弃当前点,否则将其插入并更新树

这仍然在N*log(N)中运行,但需要2种不同的排序和2*N - 大结构。

扩展这将需要另一种类型和禁止的2*N^2 - 大四元树。

是否有更高效(尤其是CPU方式)的方法?

我不认为它是相关的,但我用C语写,代码是here

1 个答案:

答案 0 :(得分:0)

如果我在N-Dimensions中这样做,我会使用最近邻k-d树。树是基于它们与N-D空间中的位置的距离对点进行分类的快速方法。默认情况下,K-D树通过创建嵌套树,根据它们与某个位置的欧氏距离对点进行排序。

有一种方法可以更改距离指标,以正确匹配您的目标。建立树后 - 您只需要从原点“最远”(根据您的度量标准)的点。

欧几里德距离度量标准:

  

sqrt(sum_over_dimensions(coord ** 2))

我建议建议度量标准(可能是错误的):

  

sum_over_dimensions(coord)

链接:

Wiki K-D树:

https://en.wikipedia.org/wiki/K-d_tree

关于K-D树指标的溢出帖子:

Can I use arbitrary metrics to search KD-Trees?

数学指标的定义:

https://en.wikipedia.org/wiki/Metric_(mathematics)

总结 - 我怀疑如果你在这个问题上花了足够的时间,你可以为你的问题建立一个强大的N维解决方案,这个解决方案具有“O(kn log n)的最坏情况复杂性。”其中k是数字尺寸]“。我还怀疑很难做得更好,因为大维最近邻算法是一个众所周知的未解决的问题。