Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 求超平面下点个数的快速算法_Algorithm_Geometry_Partitioning_Space - Fatal编程技术网

Algorithm 求超平面下点个数的快速算法

Algorithm 求超平面下点个数的快速算法,algorithm,geometry,partitioning,space,Algorithm,Geometry,Partitioning,Space,欧几里德空间中的给定点,是否有一种快速算法来计算任意超平面下的点数?Fast表示时间复杂度低于O(n) 对点进行预处理或排序的时间可以 而且,即使不是高维的,我想知道是否存在一个可以在二维空间中使用的点值设置时,使用该点设置的检查条件。然后递增或不递增计数器。O(n)如果您愿意预处理这些点,那么您必须至少访问每个点一次,即O(n)。如果你考虑一个点的测试作为预处理的一部分,那么你得到了O(0)算法(带有O(n)预处理)。因此,我认为这个问题并不像前面所说的那样有意义 尽管如此,我还是会尝试给出一

欧几里德空间中的给定点,是否有一种快速算法来计算任意超平面下的点数?Fast表示时间复杂度低于O(n)

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


而且,即使不是高维的,我想知道是否存在一个可以在二维空间中使用的点值设置时,使用该点设置的检查条件。然后递增或不递增计数器。O(n)

如果您愿意预处理这些点,那么您必须至少访问每个点一次,即O(n)。如果你考虑一个点的测试作为预处理的一部分,那么你得到了O(0)算法(带有O(n)预处理)。因此,我认为这个问题并不像前面所说的那样有意义

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

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

(p-O).N==0

那么你已经有了这些,只要确保正常的是统一的

如果它以解析形式给出:Sum(i=1到n:a[i]x[i])+d=0,那么向量a=(a,…a[n])是平面的法线,n=a/| a |是单位平面法线。平面上的点O(原点)为d N

通过将点p投影到N上并检查参数符号,可以测试点p位于哪一侧:

设V=p-O。V是从所选原点O到p的向量

让我们成为第一个。如果s为负,则P在超平面下

如果你对这个主题不太熟悉,你应该去矢量投影的链接,但我会用我的符号在这里总结。或者,你可以相信我的话,直接跳到最后的公式

如果alpha是V和N之间的角度,那么根据余弦的定义,我们有cos(alpha)=s | | | N | | |/| V | |=s/| | V | |,因为N是单位法线。但我们也从向量代数中知道cos(alpha)=| | | | | | | | | |(V.N),其中“.”是标量积(也称点积或欧几里德内积)

将cos(alpha)的这两个表达式相等

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

(使用| | V | | ^2==V.V这一事实)

所以你的前期工作是计算N和O,你的测试是:

bool is_under = (dot(V, V)*dot(V, N) < 0.);
bool小于=(点(V,V)*点(V,N)<0);
我不相信它能做得更快。

我通过使用分治和二进制搜索,在二维空间找到了O(logN)算法,其中O(N logN)预处理时间复杂度和O(N logN)内存复杂度

其基本思想是,点可以分为左N/2点和右N/2点,线下的点数量(在二维尺寸中)是线下左点数量和线下右点数量的总和。我将把把整个点分成“左”和“右”的无限线称为“分界线”。分界线看起来像‘x=k’

如果每个“左点”和“右点”按y轴顺序排序,则可以使用二进制搜索“y值低于直线和分界线交点y值的点的数量”,快速找到特定点的数量(右下角的点)

因此,时间复杂度非常高

T(N)=2T(N/2)+O(对数N)


最后,时间复杂度是O(logn)

@DeepYellow,如果点按x顺序排序,那么将左N/2点和右N/2点分开需要O(1)顺序。。T(N)=2T(N/2)+O(logn)表示T(N)=O(N),而不是O(logn)。。我应该另找一条路。