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