手头的问题:
在D维空间中给出一组N个点,其所有坐标都> = 0(在2D中,点将全部在第一象限中,在第一个八分区中为3D,依此类推......) ,删除在每个坐标中具有值大于或等于的另一个点的所有点。
在2D中,结果为:
(图片来自Vincent Zoonekynd的回答here)并且有一个简单的算法,在该答案中详述,在N*log(N)
中运行。
通过分块,我应该把它带到N*log(H)
,但对此的优化是另一个问题。
我有兴趣将解决方案扩展到3个维度(如果它仍然合理的话可能是4个),但是我目前的3D算法非常慢,很麻烦,并且不能很好地推广到4D:
max(child1, child2)
这仍然在N*log(N)
中运行,但需要2种不同的排序和2*N
- 大结构。
扩展这将需要另一种类型和禁止的2*N^2
- 大四元树。
是否有更高效(尤其是CPU方式)的方法?
我不认为它是相关的,但我用C语写,代码是here。
答案 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是数字尺寸]“。我还怀疑很难做得更好,因为大维最近邻算法是一个众所周知的未解决的问题。