寻找最小瓶颈路径的线性时间算法

Posted

技术标签:

【中文标题】寻找最小瓶颈路径的线性时间算法【英文标题】:Linear-Time algorithm for finding a mininum-bottleneck path 【发布时间】:2019-05-03 22:33:56 【问题描述】:

我正在上斯坦福的在线算法课,其中一个问题如下:

将路径的瓶颈定义为其中一条路径的最大长度 边缘。两个顶点 s 和 t 之间的最小瓶颈路径是 瓶颈不大于任何其他 s-t 路径的路径。 现在假设图是无向的。给出一个线性时间 (O(m)) 计算两个给定路径之间的最小瓶颈路径的算法 顶点。

使用修改后的 Dijkstra 算法解决此问题,运行时间为 O(mlog(n)),不符合要求。 Wikipedia 声称有

存在一个线性时间算法,用于在 无向图,不使用最大生成树。这 该算法的主要思想是应用线性时间寻路 算法到图中的中值边权重,然后要么 删除所有较小的边或收缩所有较大的边 路径是否存在,并在结果中递归 更小的图表。

有几个问题。该算法主要是挥手,我不是在寻找最宽的路径,而是相反。

This 纸比***有更多的文字,但它也没有涉及血淋淋的细节,尤其是在收缩边缘时。

我已经写出了以下伪代码:

1: MBP(G, s, t)
2:  if |E| == 1
3:    return the only edge
4:  else
5:    x = median of all edge weights
6:    E' = E - (v, w) where weight(v, w) < x
7:    construct G'(V, E')
8:    exists = is there a path from s to t in G'

9:    if (exists == FALSE)
10:      compute all the connected components Cᵢ of G'
11:      reinsert the edges deleted into G'

12:      G* = G'
13:      for each Cᵢ
14:        G* = SHRINK(G*, Cᵢ)

15:  return MBP(G', s, t)

16: SHRINK(G, C)
17:  leader = leader vertex of C
18:  V* = V(G) - C ∪ leader

19:  E* = 
20:  for each edge (v, w) ∈ E(G)
21:    if v, w ∈ V*
22:      E* = E* ∪ (v, w, weight(v, w))
23:    else if v ∈ C, w ∈ V*
24:      E* = E* ∪ (leader, w, max(weight(v, w)))

25:  return G*(V*, E*)

有几件事我不明白:

    第 6 行:删除权重高于或低于中位数的边有什么关系? 第 20 行:有 3 种类型的边,即两个顶点都在连通分量之外的边,两个顶点都在连通分量中的边,以及一个顶点在连通分量中的边,一种在连通分量之外的边。第一种类型保留它的边缘权重,第二种类型成为自循环并且应该被删除(?)。第三种类型的边缘权重应该是多少?

【问题讨论】:

【参考方案1】:

在这里。在my blog上找到了详细的解决方案,但伪代码如下:

1: CRITICAL-EDGE(G, s, t)
2:   if |E(G)| == 1
3:     return the only edge
4:   else
5:     x = median of all edge weights
6:     X = E - (v, w) s.t. weight(v, w) > x
7:     G' = G(V, X)
8:     exists = is there a path from s to t in G'

9:     if (exists == FALSE)
10:      C = C₁, C₂, ..., Cₖ s.t. Cᵢ is a connected component of G
11:      G' = G(V, E - X)

12:      for i = 1 to |C|
13:        G' = SHRINK(G', C, i)
14:    else if X == E // no edges were deleted
15:      X = (v, w) s.t. weight(v, w) = x
16:      G' = G(V, X)

17:  return CRITICAL-EDGE(G', s, t)

18: SHRINK(G, C, i)
19:   leaderᵢ = leader vertex of C[i]
20:   V* = V(G) - C[i] ∪ leaderᵢ

21:   E* = 
22:   for each (v, w) ∈ E(G)
23:     if v ∈ C[i], w ∈ C[j]
24:       E* = E* ∪ (leaderᵢ, leaderⱼ, min(weight(u, w))) ∀ u ∈ C[i]
25:     else if v, w ∉ C[i]
          E * = E* ∪ (v, w, weight(v, w))

26:   return G*(V*, E*)

【讨论】:

以上是关于寻找最小瓶颈路径的线性时间算法的主要内容,如果未能解决你的问题,请参考以下文章

算法#03--具体解释最小二乘法原理和代码

5.线性回归算法

线性回归 - 使用啥算法来解决最小二乘法 - 逆或 LU 或......?

这可以用线性时间复杂度解决吗?

算法导论思考题 - 瓶颈生成树

各种回归算法