我有一个代码可以使最小生成树包含多组点(每组约25000个数据集包含40-10000个点),这显然需要一段时间。我正在使用scipy.sparse.csgraph中的MST算法。
我被告知MST是Delaunay三角测量的一个子集,因此有人建议我先找到DT并从中找到MST来加速我的代码。
有谁知道这会有多大的不同?此外,如果这样做更快,为什么它首先不是算法的一部分?如果更快地计算DT然后计算MST,那么为什么scipy.sparse.csgraph.minimum_spanning_tree会做其他事情呢?
请注意:我不是计算机专家,有些人可能会说我应该使用不同的语言,但Python是唯一一个我知道这样做的人,请在答案中使用简单的语言,请不要行话!
答案 0 :(得分:1)
注意:这假设我们在2-d
工作我怀疑你现在正在做的是提供到MST库的所有点到点距离。这些距离的N ^ 2顺序是这样的,并且Kruskal算法在这样的输入上的渐近运行时间是N ^ 2 * log N.
Delaunay三角剖分的大多数算法都需要N log N时间。一旦计算出三角测量,则仅需要考虑三角测量中的边缘(因为MST始终是三角测量的子集)。有这样的O(N)边,所以scipy.sparse.csgraph中Kruskal算法的运行时应该是N log N.这样就可以得到N log N的渐近时间复杂度。
scipy.sparse.csgraph没有包含Delaunay三角剖分的原因是该算法适用于任意输入,而不仅仅是欧几里德输入。
我不太确定这对你的实践有多大帮助,但这就像渐近的那样。