快速算法找出超平面下的点数

时间:2012-08-12 16:00:14

标签: algorithm geometry partitioning space

在Euclidean空间中给出点,是否有一个快速算法来计算“任意超平面”下的点数?快速意味着时间复杂度低于O(n)

对点进行预处理或排序的时间是可以的

而且,即使不是高维,我也想知道是否存在可用于二维空间的那个

3 个答案:

答案 0 :(得分:2)

如果您愿意预先处理这些点,那么您必须至少访问一次,即O(n)。如果你考虑测试点作为预处理的一部分在哪一侧,那么你有一个O(0)算法(使用O(n)预处理)。所以我不认为这个问题有道理。

尽管如此,我还是会尝试给出一个有用的答案,即使这不是OP所要求的。

选择超平面单位法线和根点。如果平面以参数形式给出

  

(P - O).N == 0

然后你已经有了这些,只要确保正常是单位化的。

如果以分析形式给出:Sum(i = 1到n:a [i] x [i])+ d = 0,则向量A =(a 1,... a [ n])是平面的法线,N = A / || A ||是单位平面法线。平面上的点O(对于原点)是d N.

您可以通过将每个点P投影到N上来测试每个点P的哪一侧检查参数的符号:

设V = P - O.V是从选择的原点O到P的矢量。

设s为projection of V onto N。如果s为负,则P在超平面“下”。

如果你对这个主题生锈了,你应该去看矢量投影的链接,但我会用我的符号来总结。或者,你可以接受我的话,最后跳到公式。

如果alpha是V和N之间的角度,那么从余弦的定义我们得到cos(alpha)= s || N || / || V || = s / || V ||因为N是单位法线。但我们也从向量代数知道cos(alpha)= || V ||(V.N),其中“。”是标量积(a.k.a. dot product,或euclidean inner product)。

将这两个表达式等同于cos(alpha)我们有

  

s =(V.V)(V.N)

(使用|| V || ^ 2 == V.V)的事实。

所以你的预处理工作是计算N和O,你的测试是:

bool is_under = (dot(V, V)*dot(V, N) < 0.);

我不相信它可以更快地完成。

答案 1 :(得分:0)

设置点值时,请使用该点设置的检查条件。然后增加或不增加计数器。为O(n)

答案 2 :(得分:0)

我通过使用具有O(N log N)预处理时间复杂度和O(N log N)内存复杂度的分治和二元搜索在2D维度中找到O(logN)算法

基本思想是点可以分为左N / 2点和右N / 2点,线下的点数(2D维)是线下左点数的总和以及该线下的正确点数。我将称为无限线,将整点分为“左”和“右”作为“分界线”。分界线看起来像'x = k'

如果每个“左点”和“右点”按y轴顺序排序,则可以通过使用二进制搜索“点数”快速找到特定点的数量 - 右下角的点数其y值低于该线与分界线'的交叉点的y值。

因此时间复杂度

T(N)= 2T(N / 2)+ O(log N)

最后时间复杂度为O(log N)