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_Minimum Spanning Tree - Fatal编程技术网

Algorithm 度量空间中的有效最小生成树

Algorithm 度量空间中的有效最小生成树,algorithm,minimum-spanning-tree,Algorithm,Minimum Spanning Tree,我在某些度量空间(例如配备)中有大量点(n>10000个)。我想用最小生成树连接它们,使用度量作为边上的权重 是否有一种算法在不到O(n2)的时间内运行 如果没有,是否有一种算法在少于O(n2)的平均时间内运行(可能使用随机化) 如果没有,是否有一种算法可以在不到O(n2)的时间内运行,并且能够很好地近似最小生成树 如果不是,有没有这样的算法不存在的原因 提前谢谢你 编辑以下海报: 寻找最小生成树的经典算法在这里不起作用。他们在运行时有一个E因子,但在我的例子中e= n2,因为我实际上考虑了

我在某些度量空间(例如配备)中有大量点(n>10000个)。我想用最小生成树连接它们,使用度量作为边上的权重

  • 是否有一种算法在不到O(n2)的时间内运行
  • 如果没有,是否有一种算法在少于O(n2)的平均时间内运行(可能使用随机化)
  • 如果没有,是否有一种算法可以在不到O(n2)的时间内运行,并且能够很好地近似最小生成树
  • 如果不是,有没有这样的算法不存在的原因
提前谢谢你

编辑以下海报:
寻找最小生成树的经典算法在这里不起作用。他们在运行时有一个E因子,但在我的例子中e= n2,因为我实际上考虑了完整的图。我也没有足够的内存来存储所有>49995000条可能的边。

显然,根据这一点:没有确定的o(n^2)(注意:smallOh,我想这可能就是你所说的小于o(n^2)的算法。该文还给出了度量最小权生成树的一种亚线性随机算法

再看看这篇文章:它给出了一个优化算法。论文还声称,优化算法的复杂性尚不清楚

第一篇论文中的参考文献应该是有帮助的,而那篇论文可能是与你的问题最相关的


希望这能有所帮助。

3-4年前,当我研究一个非常类似的问题时,我在所研究的文献中找不到理想的解决方案

我认为诀窍是找到“可能好”边的“小”子集,然后你可以在上面运行普通的Kruskal。一般来说,对于一些较小的k,在将每个顶点连接到其k近邻的边集合中可能会发现许多MST边。这些边可能不跨图形,但如果它们不跨图形,则可以将每个组件折叠到单个顶点(随机选择)并重复该过程。(为了获得更高的精度,不要选择单个代表作为新的“超级顶点”,而是选择少量代表,在下一轮中检查两个超级顶点之间的所有r^2距离,选择最小值。)

在有限维欧几里德空间中,对象可以表示为向量的情况下,k-最近邻算法得到了很好的研究,因此,如果您能找到一种方法将对象映射到该位置(例如,使用),那么您可能会在这方面有好运。特别是,映射到2D允许您计算Voronoi图,并且MST边始终位于相邻面之间。但据我所知,这种方法并不总能产生高质量的结果


否则,你可能会发现聚类方法很有用:这是我发现的为数不多的明确处理欧氏空间中不一定是有限维向量的对象的论文之一,它考虑到了计算昂贵的距离函数的可能性。

你至少读过这个吗?@Nikolai:当然读过。还有很多纸。你不需要“存储”你的10^8边。您需要一个位向量来标记访问的边,但该位向量只使用12 MB左右,就内存而言,这似乎是可以承受的。@Sven:a)10000个顶点是一个下限。b) Kruskal需要存储和分类。谢谢,但是这些文件不是免费提供的。你在这里写的也听起来有点矛盾。这里的“线性时间”是指边的数量还是顶点的数量?@ybungalo:顶点中的线性时间。对不起,我帮不了你拿那些文件。如果你有书名,你应该可以在一些像样的图书馆里找到。第一篇论文是免费的。不幸的是,正如引言第4段所述,它的边数是线性的。嗯,如果不知道重量来自公制,它就不能做得更好,因为它必须读取所有边。不需要库。我不知道其他领域,但基本上所有的CS论文都可以免费找到。进入scholar.google.com并键入论文标题。在正确的结果上会有一个小链接“查看所有xx版本”。点击那个。这将带你到结果的标题,其中几乎总是包含pdf或ps链接。你可以这样找到所有这三份文件。@白痴:不,我的逻辑是正确的。它是随机的,以给出预期的线性运行时间,但它确实找到了最佳解决方案,而不是近似值(考虑使用随机轴的快速排序)。为了找到最佳的解决方案,你总是需要考虑所有的边缘。顺便说一句,这也是上一篇文章没有帮助的原因,它也适用于一般图形。然而,第一个说,即使是欧几里德空间也没有已知的算法。。。而这篇论文只有2年的历史(这总结了我的想法——除非你能以某种方式使用距离度量来排除大量的边,否则你无法避免O(n^2)运行时间。@Nathan:如果你向下映射,你可以避免k近邻查询的n^2距离计算,因为你建立了某种索引(在不到O(n^2)的时间内)@j_random:讽刺的是,我想用它来建造苗条的树木P@Nathan@j_random:对于一般MST来说,不可能比O(n^2)做得更好,但对于度量MST,这可能是可能的。关键是,三角形不等式允许您推断某些边的权重边界,因此您根本不需要处理它们。问题是如何做到这一点。就像您提到的Voronoi。它使用了在欧几里德空间中工作的知识,从而提高了性能。这是真的在任何有限维(不仅仅是2D)中,您可以在线性时间内构建它并将其用于MST。