algorithm -> 2D天际线查询/有效边界的算法

标签 algorithm optimization

目前的问题是:
给定一组在D维空间中的N个点,它们的所有坐标>=0(在2D中,这些点都在第一象限中,在3D中,在第一个八分之一,依此类推…),移除所有在每个坐标中有值大于或等于另一个点的点。
在2d中,结果是:
(图片来自Vincent Zoonekynd的答案here)并且有一个简单的算法,在这个答案中详细说明,它运行在N*log(N)中。
对于分块,我应该把它带到N*log(H),但是对它的优化是为了另一个问题。
我有兴趣将解决方案扩展到三维(如果仍然合理的话,可能还会扩展到4维),但我当前的三维算法速度很慢,很麻烦,不能很好地推广到4d:
在X轴上排序点,注释每个点的位置。
初始化一种具有N个叶子的段树,叶子将保存点的y值,节点将保存max(child1, child2)
Z轴上的排序点
对于最大Z的每个点:
检查它在x顺序中的位置,尝试将它放在该位置的段树中
首先检查是否有一个点已经向下(所以它有>z),在一个更高的位置(所以它有>x)和一个更大的y(这个成本日志(n),谢谢树)
如果找到该点,则丢弃当前点,否则插入该点并更新树
这仍然在N*log(N)中运行,但需要两种不同的类型和2*N大结构。
扩展它需要另一种类型和一个禁止的大四叉树。
有没有更有效(特别是CPU方面)的方法?
我认为这与此无关,但我是用c编写的,代码是here

最佳答案

如果我是在n维做这件事,我会用最近的邻居k-d树。树是一种基于点到n维空间中某个位置的距离对点进行排序的快速方法。默认情况下,k-d树通过创建嵌套树,根据点到某个位置的欧氏距离对点进行排序。
有一种方法来改变距离度量,以正确地匹配你要去的。在你建立了树-你只需要点是“最远的”(根据你的度量)从原点。
欧氏距离度量:
SQRT(尺寸总和(坐标**2))
我建议采用公制(可能有误):
维度上的和(坐标)
链接:
维基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是维度数]”。我还怀疑很难做得更好,因为大维最近邻算法是一个众所周知的未解决问题。

关于algorithm -> 2D天际线查询/有效边界的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580795/

相关文章:

algorithm - 为什么用 Big O 表示法而不是 Theta 给出算法复杂度?

algorithm - 伪代码算法,用于计算从 N 个不等向量中选择的 N 个值的所有排列而不重复

matlab公式优化: Radial Basis Function

optimization - 计算对在 Clojure 1.4 中出现频率的快速方法

java - 从文件中读取字符串最快的方法是什么?

mysql - 琐碎算术计算的数据库优化

c++ - 大小为 N 和 N 的所有排列不一定等于数组的大小

algorithm - 沿已知轴在外部路径边缘内查找内部路径的位置

java - 寻找回文的低效解决方案

java - 使用多个相似的类高效地执行 CRUD 操作?