Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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_Complexity Theory_Computational Geometry - Fatal编程技术网

Algorithm 快速椭球体求交算法

Algorithm 快速椭球体求交算法,algorithm,geometry,complexity-theory,computational-geometry,Algorithm,Geometry,Complexity Theory,Computational Geometry,假设我有一百万个任意形状,任意方向的N维椭球,随机散布在N维空间中。给定一组椭球,我想“快速”确定第一组椭球相交的所有椭球的集合 这一定有一个算法。这是怎么一回事?什么是“O”复杂度?如果考虑到N维数据,“O”复杂度会受到维度诅咒的影响。(有关详细信息,请参阅)。我建议借鉴物理模拟,将该问题分为“广义阶段”和狭义阶段: 宽相位保守地发现了一组非常小的可能重叠的椭圆对 窄相位将可能重叠的椭圆对集修剪为实际重叠的椭圆对 窄相位是一个简单的计算几何问题,用于测试任意椭圆之间的交点。对于宽泛阶段,您

假设我有一百万个任意形状,任意方向的N维椭球,随机散布在N维空间中。给定一组椭球,我想“快速”确定第一组椭球相交的所有椭球的集合

这一定有一个算法。这是怎么一回事?什么是“O”复杂度?

如果考虑到N维数据,“O”复杂度会受到维度诅咒的影响。(有关详细信息,请参阅)。我建议借鉴物理模拟,将该问题分为“广义阶段”和狭义阶段:

  • 宽相位保守地发现了一组非常小的可能重叠的椭圆对
  • 窄相位将可能重叠的椭圆对集修剪为实际重叠的椭圆对
窄相位是一个简单的计算几何问题,用于测试任意椭圆之间的交点。对于宽泛阶段,您需要使用空间结构,例如空间散列、空间树(R树、Kd树、X树、UB树等),或者特定于正在加载的数据的某些特殊属性的特殊结构(例如不平衡树或散列)

目前流行的方法是Kd树。Kd树有很多文档和已经编码的版本,可以随时配置,所以我建议您在线查看。(谷歌是你的朋友。)使用大多数树结构的优点是,如果你正在寻找交叉点的集合相对紧凑,你只需在树中搜索一次就可以找到交叉点,而无需执行多次树遍历。这将有助于缓存(无论是从主内存还是从磁盘)访问模式。相同的算法可以处理不同成员的查询。不过,您所做的工作很可能会从紧凑查询集属性中受益匪浅

Kd树不能解决所有椭球体的问题——例如,如果有一个N维椭球体,其主轴从(0,0,0,…)到(1,1,1,…),但具有较小或不重要的次轴(从此不再相交),则仍需要是一个覆盖所有N维[0,1]的节点。如果您的椭球落在[0,1]^n中,则每个椭球都将测试与上述不方便的椭球的交点。然而,对于真实世界的数据(即使是最合成的数据,除非你真的努力让Kd树变慢),Kd树方法应该是一个胜利

如果您希望Kd tree在千维椭球上获得成功,那么您最好使用蛮力搜索。(前面提到的维度诅咒)但是

如果你有一个优化的实现,一百万个条目也不算太糟糕,但是如果你做了很多查询(几百万个),它会很慢(大约10秒或更糟)。然而,我已经看到一些惊人的数字来自优化良好的矢量化代码。(甚至有些产品也采用了这种策略。)有了正确的缓存一致性,暴力强制最多只需要几毫秒。这意味着C/C++中的ASM或向量内部函数——不确定您使用的是哪种语言


对于大多数数据,对于查询(一旦构建了树),O复杂性(不考虑维数灾难)应该是O(m log n),其中m是查询集中的椭圆数,n是数据集中的椭圆数。构建数据本身不应该比O(n logn)更糟糕。用Exp(d)乘以一切,其中d是维度——这就是这种事情的处理方式。

为什么?没有原因,这闻起来像是“为我做作业”。我们是否可以假设椭球体存储在某种类似于树的数据结构中,例如四叉树的N维等价物?如果不是,那么这几乎就是一个O(MN)问题,其中M是子集的大小,N是集合的大小。@spender-太好了!这意味着答案很容易找到。原因是我想用球族来约束任意概率分布。确定哪些球族重叠将允许我在解决广义似然问题时做出第一次尝试。-不,这不是家庭作业问题。@Oli,是的!让我们假设一下。我试图重新表述这个问题,这样我就可以使用kd树了,但我没有找到答案。具体来说,我要把一个3D球体描述为4D空间中的一个点:(x,y,z,半径)。但我立刻意识到,你不能使用普通的欧几里德距离度量。问题的核心是实际椭球的相交还是将一百万个物体分割成更合理子集的算法?太棒了!谢谢你的意见。所以我要传达的信息是,如果我能对椭球体的最大尺寸做一些假设,那么我可以使用Kd树快速地将空间挑选到一个更易于处理的尺寸,用于暴力计算几何问题。基本上是的。如果由于空间限制而确实需要,您可以从磁盘执行,因为树遍历比蛮力对带宽的依赖性小得多。但是一个经过良好优化的暴力解决方案(如果归结为我不知道这里的需求)仍然可以工作。事实上,我发布的游戏可以在每帧几毫秒的时间内强行解决类似的问题,但这是一个非常仔细的优化。如果你不想使用预滚Kd树实现,而是宁愿使用你自己的结构,如果椭球的大小相当一致,空间散列结构更容易实现,并且根据数据本身的不同,它可以具有一些优越的性能。Kd树通常对数据更不可知,但有更复杂的操作减慢了它们的速度。二者都对dimensi高度敏感