Algorithm 联合的时间复杂性

Algorithm 联合的时间复杂性,algorithm,union,time-complexity,dijkstra,Algorithm,Union,Time Complexity,Dijkstra,我们有一个有向图G=V,E,其中E中的每一条边u,V都有一个相对值ru,V in R和0我认为解决方案应该基于经典的Dijkstra算法,正如您所建议的那样,其复杂性众所周知,但是在您的解决方案中,您错误地定义了最短路径问题 注意,如果A和B是独立的,那么它们的概率是pA*pB。因此,您应该找到一条边乘法最大的路径。而Dijkstra算法则寻找边和最小的路径 要解决此问题,应将边的权重定义为: R*u,v=-log Ru,v 通过引入对数,您可以将乘法问题转化为加法问题。我认为解决方案应该基于经

我们有一个有向图G=V,E,其中E中的每一条边u,V都有一个相对值ru,V in R和0我认为解决方案应该基于经典的Dijkstra算法,正如您所建议的那样,其复杂性众所周知,但是在您的解决方案中,您错误地定义了最短路径问题

注意,如果A和B是独立的,那么它们的概率是pA*pB。因此,您应该找到一条边乘法最大的路径。而Dijkstra算法则寻找边和最小的路径

要解决此问题,应将边的权重定义为:

R*u,v=-log Ru,v


通过引入对数,您可以将乘法问题转化为加法问题。

我认为解决方案应该基于经典的Dijkstra算法,正如您所建议的,该算法的复杂性众所周知,但是在您的解决方案中,您对最短路径问题的定义不正确

注意,如果A和B是独立的,那么它们的概率是pA*pB。因此,您应该找到一条边乘法最大的路径。而Dijkstra算法则寻找边和最小的路径

要解决此问题,应将边的权重定义为:

R*u,v=-log Ru,v

通过引入对数,可以将乘法问题转化为加法问题

因此,算法的时间复杂度等于时间 线路3-9+OE的复杂性。它的时间复杂性是多少 工会

不,这不是联合的复杂性,例如,如果使用哈希表,联合可以非常有效地完成。此外,由于您仅为工会使用S,因此它似乎是多余的

算法的复杂度也很大程度上取决于EXTRACT-MAXQ函数,通常它在Q的大小上是对数的,因此每次迭代的logV,以及RELAXu,v,r,它通常在Q的大小上也是对数的,因为您需要更新优先级队列中的条目

正如所料,这使我们看到了与原始Dijkstra算法相同的复杂性,即OE+VlogV或OElogV,这取决于优先级队列的实现

因此,算法的时间复杂度等于时间 线路3-9+OE的复杂性。它的时间复杂性是多少 工会

不,这不是联合的复杂性,例如,如果使用哈希表,联合可以非常有效地完成。此外,由于您仅为工会使用S,因此它似乎是多余的

算法的复杂度也很大程度上取决于EXTRACT-MAXQ函数,通常它在Q的大小上是对数的,因此每次迭代的logV,以及RELAXu,v,r,它通常在Q的大小上也是对数的,因为您需要更新优先级队列中的条目


正如所料,这使我们看到了与原始Dijkstra算法相同的复杂性,即OE+VlogV或OElogV,这取决于优先级队列的实现。

我更改了算法RELAX,以便最大化边的乘法。我还改变了距离d[v]的初始化。那是不是错了?我不能肯定地告诉你,我不太理解你的伪语言。不管怎样,我想你应该使用精确的Dijkstra算法,并具有适当的边权重。@evinda我想看一看Dijkstra用于寻找最长路径的反例,最长路径是NP难的。这可能是错误的。@G.Bach你能解释一下为什么算法不起作用吗?@evinda我想我错了,当所有权重都在0到1之间时,它应该是正确的。如果我们用-logru,v替换所有的重量,松弛操作基本上就是在标准Dijkstra中发生的。尽管如此,用Dijkstra实现最短路径会更容易,只需相应地替换所有权重即可。我更改了RELAX算法,使边的乘法最大化。我还改变了距离d[v]的初始化。那是不是错了?我不能肯定地告诉你,我不太理解你的伪语言。不管怎样,我想你应该使用精确的Dijkstra算法,并具有适当的边权重。@evinda我想看一看Dijkstra用于寻找最长路径的反例,最长路径是NP难的。这可能是错误的。@G.Bach你能解释一下为什么算法不起作用吗?@evinda我想我错了,当所有权重都在0到1之间时,它应该是正确的。如果我们用-logru,v替换所有的重量,松弛操作基本上就是在标准Dijkstra中发生的。尽管如此,将Dijkstra实现为最短路径更容易,只需相应地替换所有权重即可S@evinda这实际上取决于union算法的实现,它在这里似乎是多余的,但它可以在O1中完成,是的,通过使用位向量,例如,大小为| V |的。那么它是正确的吗?初始化的时间复杂度-
SOURCEG,s是O | V |。线路2的时间复杂度为O1。第3行的时间复杂度为O | V |。第5行的时间复杂度为Olog | V |。第6、7行的时间复杂度为O1。RELAX的时间复杂度为Olog | V |,因此第8行执行的总次数为O∑{V\in V}degv*log | V |=OElog | V |次。所以算法的时间复杂度是O | V |+O1+O | V |*log | V |+OElog | V |=O | V |+E |*log | V |如果是这样的话,我们如何得到时间复杂度是OE+V*logV?@evinda事实上,当假设olog V松弛时,它确实是OElogV,但是,可以用a来松弛,然后是O1+VlogV。关于更多细节,维基百科对Dijkstra算法的复杂性分析有很好的一节:算法的时间复杂性也是如此S@evinda这实际上取决于union算法的实现,它在这里似乎是多余的,但它可以在O1中完成,是的,通过使用位向量,例如,大小为| V |的。那么它是正确的吗?INITIALIZE-SINGLE-SOURCEG,s的时间复杂度为O | V |。线路2的时间复杂度为O1。第3行的时间复杂度为O | V |。第5行的时间复杂度为Olog | V |。第6、7行的时间复杂度为O1。RELAX的时间复杂度为Olog | V |,因此第8行执行的总次数为O∑{V\in V}degv*log | V |=OElog | V |次。所以算法的时间复杂度是O | V |+O1+O | V |*log | V |+OElog | V |=O | V |+E |*log | V |如果是这样的话,我们如何得到时间复杂度是OE+V*logV?@evinda事实上,当假设olog V松弛时,它确实是OElogV,但是,可以用a来松弛,然后是O1+VlogV。关于更多细节,维基百科对Dijkstra算法的复杂性分析有很好的部分:请注意,您遇到问题的操作无论如何都是无用的,因为您从未查询过s的任何内容。请注意,您遇到问题的操作无论如何都是无用的,因为您从未查询过s的任何内容。
DIJKSTRA(G,r,s,t)
1.  INITIALIZE-SINGLE-SOURCE(G,s)
2.  S=Ø
3.  Q=G.V
4.  while Q != Ø
5.         u<-EXTRACT-MAX(Q)
6.         if (u=t) return d[t]
7.         S<-S U {u}
8.         for each vertex v in  G.Adj[u]
9.             RELAX(u,v,r)


INITIAL-SINGLE-SOURCE(G,s)
1. for each vertex v  in  V.G
2.      d[v]=-inf
3.      pi[v]=NIL
4. d[s]=1



RELAX(u,v,r)
 1. if d[v]<d[u]*r(u,v)
 2   d[v]<-d[u]*r(u,v)
 3.   pi[v]<-u