algorithm - 联合的时间复杂度

标签 algorithm union time-complexity dijkstra

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

将 r(u, v) 视为从 u 到 v 的信道传输不会失败的概率,并且概率是独立的。 我想编写一个高效的算法来找到两个给定节点之间最可靠的路径。

我尝试了以下方法:

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

我想找出算法的复杂性。

INITIALIZE-SINGLE-SOURCE(G,s)的时间复杂度为O(|V|)。 第 4 行的时间复杂度为 O(1)。 第5行的时间复杂度是O(|V|)。 第 7 行的时间复杂度为 O(log(|V|))。 第8行的时间复杂度是O(1)。 命令 S<-S U {u} 的时间复杂度是多少? 第10行一共执行了O(Σ_{v\in V} deg(v))=O(E)次,RELAX的时间复杂度为O(1)。

所以算法的时间复杂度等于第(3-9)行的时间复杂度+O(E)。 联合的时间复杂度是多少?

最佳答案

So the time complexity of the algorithm is equal to the time complexity of the lines (3-9)+O(E). Which is the time complexity of the union?

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

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

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

关于algorithm - 联合的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29876909/

相关文章:

c# - 使用 linq 检查是否不存在子句

SQL Union All 太慢

php - 如何知道 UNION mysql 查询中数据的来源

linked-list - 为什么拆分 Rust 的 std::collections::LinkedList O(n)?

java - 将二维数组的索引旋转 90 度

algorithm - 使用 do While 循环反转 LinkedList

algorithm - 如何计算算法的运行时间?

algorithm - 当时间复杂度为 O(n!) 和 O(2^n) 时?

javascript - HTML DOM 查找的时间复杂度是多少

algorithm - 欧拉项目 #18 方法