我有一个算法问题,其中有一个简单的解决方案,但它看起来很浪费。我想知道是否有更有效的方法来做同样的事情。从多个顶点的最大距离内提取子图的高效算法
这里的问题:
- 输入:一个大的图形
G
具有非负边缘权重(解释为长度),顶点v
的列表,和距离d
相同的长度v
的列表。 - 输出:子图的
G
S
由所有那些在从v[i]
一些i
至多d[i]
的距离的顶点的。
显而易见的解决方案是使用Dijkstra算法从每个v[i]
开始,修改,以便它击中的d[i]
的距离,然后取每个搜索遍历子图的工会后捞出。但是,在我的使用案例中,经常会发生来自v[i]
的搜索树重叠的情况。这意味着Dijkstra方法会在我进行联合之前多次浪费地遍历重叠中的顶点。
在有只有一个v
顶点的情况下,Dijkstra算法的方式在运行O(|S|log|S|)
,以|S|
是顶点的数目(图表中的数据是稀疏的,所以我忽略边缘项)。当v
有多个顶点时,是否可以达到相同的渐近运行时间?
我的第一个想法是将每个v[i]
中的搜索合并到同一个优先级队列中,但上面提到的“保释”条件使这种方法变得复杂。有时顶点会在距离一个v[i]
较短的距离内到达,但如果第二个顶点有更大的d[j]
分配给它,您仍然希望从另一个v[j]
搜索它。
谢谢!
如果d包含无限且v包含G中的每个顶点,则总输出将为O(| S | * | S |)。你不能指望算法的工作少于这个。 –