快速椭球交点算法

| 假设我有100万个任意形状,任意方向的N维椭球体,它们随机散布在N维空间中。给定一个椭球的子集,我想“迅速”确定第一集合中的椭球相交的所有椭球的集合。 为此必须有一个算法。它是什么?什么是“ O”复杂度?     
已邀请:
        如果允许N维数据,则O复杂度会遭受维数的诅咒。 (有关更多信息,请参见此Wikipedia文章)。我建议借鉴物理模拟,并将此问题分为“广泛阶段”和狭窄阶段: 宽相保守地发现了潜在的重叠椭圆对的大幅减少。 窄相位将一组可能重叠的椭圆对修整为实际上确实重叠的那对。 狭窄阶段是测试任意椭圆之间的相交的直接计算几何问题。对于广泛的阶段,您将需要使用空间结构,例如空间哈希,空间树(R树,Kd树,X树,UB树等)或即席结构给定您正在加载的数据的某些特殊属性(例如不平衡的树或哈希)。 当前流行的方法是Kd树。 Kd-tree有很多文档和已经编码的版本,可以轻松配置,因此,我建议您在线查看。 (Google是您的朋友)。使用大多数树结构的优点是,如果要查找的交集相对紧凑,则可以只在树中搜索一次并找到交点,而不必执行多棵树遍历。这将有助于缓存(从主内存或磁盘)访问模式。相同的算法可以处理不同的成员查询。但是,您正在做的工作可能会从紧凑的查询集属性中受益匪浅。 Kd树无法解决所有椭球的问题-例如,如果您的椭球尺寸为N,其主轴的轴是从(0,0,0,0,...)到(1,1 ,1、1,...),但次级轴较小或无关紧要(并且此后相交不多),仍然需要成为一个在所有N个维度上都覆盖[0,1]的节点。如果您的椭球落在[0,1] ^ n中,那么每个椭球都将测试与上述不方便的椭球的相交。但是,对于真实世界的数据(甚至大多数情况下,如果不是真的很难使Kd-tree变得缓慢,那么大多数情况下都是合成的),Kd-tree方法应该是一个胜利。 如果您希望Kd树在成千上万的椭球体上取得成功,那么使用强力搜索可能会更好。 (上述维度的诅咒。)但是... 如果您有一个优化的实现,一百万个条目并不算太坏,但是如果您要执行很多查询(数百万个),它将很慢(大约10秒或更糟) )。但是,我已经看到了一些令人惊奇的数字,它们来自经过优化的矢量化代码。 (即使使用这种策略来运送某些产品也是如此。)如果具有正确的缓存一致性,则暴力破解最多只需要毫秒。这意味着C / C ++中的ASM或矢量内在函数-不确定您使用的是哪种语言。 对于大多数数据,O的复杂度(不考虑维数的诅咒)应大约为查询的O(m log n)(一旦树被构建),其中m是查询集中的椭圆数,n是椭圆数在数据集中。构建数据本身不应该比O(n log n)差。用exp(d)乘以d,其中d是维-这就是这种事情的处理方式。     

要回复问题请先登录注册