Johnson's algorithm | Toward MOON



25.3 Johnson's algorithm for sparse graphs

  Johnson's algorithm finds shortest paths between all pairs by using both Dijkstra's algorithm and the Bellman-Ford algorithm.

  Dijkstra's algorithm and the Bellman-Ford algorithm finds shortest paths from the single source vertex to others. Dijkstra's algorithm runs in O(n*lg n) to compute shortest paths while the Bellman-Ford runs in O(n*m), where n is the number of vertices and m is the number of edges. Thus, Dijkstra's algorithm is strictly faster than the Bellman-Ford for both sparse and dense graphs. However, Dijkstra's algorithm has one shortcoming, which is the constraint that the input graph must not have negative cost edges. On the other hand, the Bellman-Ford allows the input graph to have negative cost edges, but no negative cost cycles.

  To overcome the constraints of the two single source shortest path algorithms, Johnson's algorithm uses the technique of re-weighting. Johnson's algorithm follows the steps below.

  Given a weighted, directed graph G=(V,E) with weight function : E -> R. Weights might or might not be negative.
  1. Form G' by adding a new vertex s and a new edge (s,v) with weight 0 for each v in V.
  2. Run Bellman-Ford algorithm on G' with source vertex s
    (If B-F algorithm detects a negative cost cycle in G', halt and report this).
  3. For each v in G, let P[v] be the length of a shortest path from s to v in G'. For each edge e = (u,v) in G, define 'new weight' = 'old weight' + P[u] - P[v].
  4. For each vertex u of G:
      Run Dijkstra's algorithm in G with edge costs {new weights}, with source vertex u to compute the shortest path distance d'(u,v) for each v in G.
  5. For each pair (u,v) in G, return the shortest path distance d(u,v) = d'(u,v) - P[u] + P[v].

Read full article from Johnson's algorithm | Toward MOON


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts