首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联合时间复杂性

联合时间复杂性
EN

Stack Overflow用户
提问于 2015-04-26 11:15:20
回答 2查看 1.4K关注 0票数 1

我们有一个有向图G=( v,E),其中E中的每个边(u,v)在R中有一个相对值r(u,v),而0<=r(u,v) <= 1表示通信通道上从顶点u到顶点v的可靠性。

考虑为r(u,v)的概率,香奈儿从u到v不会失败的转移,概率是独立的。我想要写一个有效的算法,在两个给定的节点之间找到最可靠的路径。

我尝试了以下几点:

代码语言:javascript
复制
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

我想找出算法的复杂性。

初始化单源(G,s)的时间复杂度为O(x=0).第4行的时间复杂度是O(1)。第5行的时间复杂性是O({x}})。第7行的时间复杂度为O(log(Log))。第8行的时间复杂度是O(1)。哪个是命令S<-S {u}的时间复杂性?第10行执行总O(Σ_{v \in V} deg(v))=O(E)倍,RELAX的时间复杂度为O(1)。

因此,算法的时间复杂度等于线(3-9)+O(E)的时间复杂度。哪个是联盟的时间复杂性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-26 11:39:46

因此,算法的时间复杂度等于线(3-9)+O(E)的时间复杂度。哪个是联盟的时间复杂性?

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

算法的复杂性还在很大程度上取决于EXTRACT-MAX(Q)函数(通常是Q大小的对数,因此每次迭代都是logV )和RELAX(u,v,r) ( Q的大小通常也是对数的,因为您需要更新优先级队列中的条目)。

正如预期的那样,这将带来与原始Dijkstra算法相同的复杂性,即O(E+VlogV)O(ElogV),这取决于优先级队列的实现。

票数 2
EN

Stack Overflow用户

发布于 2015-04-26 11:27:43

我认为解决方案应该基于经典的Dijkstra算法(其复杂性是众所周知的),正如您建议的那样,但是在您的解决方案中,您错误地定义了“最短路径”问题。

注意,A和B的概率是p(A) * p(B) (如果它们是独立的)。因此,您应该找到一条路径,其边的multiplication最大化的。而Dijkstra算法寻找边的最小化的路径。

要克服这个问题,您应该将边缘的权重定义为:

R*(u,v) = -log ( R(u,v) )

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29876909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档