2012-07-28 12 views
21

मैं तीनों का अध्ययन कर रहा हूं और मैं नीचे से उनके संदर्भ बता रहा हूं। क्या कोई मुझे बता सकता है कि क्या मैंने उन्हें पर्याप्त रूप से पर्याप्त समझा है या नहीं? धन्यवाद।क्या मैं फ़्लॉइड-वारशॉल, डिजस्ट्रा और बेलमैन-फोर्ड एल्गोरिदम के बीच अंतर के बारे में सही हूं?

  1. डिज्कस्ट्रा एल्गोरिथ्म केवल प्रयोग किया जाता है आप एक ही स्रोत है और आप एक से दूसरे नोड से छोटी से छोटी पथ पता करना चाहते हैं, लेकिन this

  2. फ्लोयड-Warshall एल्गोरिथ्म प्रयोग किया जाता है जब तरह के मामलों में विफल रहता है सभी नोड्स में से कोई भी स्रोत हो सकता है, इसलिए आप किसी भी स्रोत नोड से किसी भी गंतव्य नोड तक पहुंचने के लिए सबसे छोटी दूरी चाहते हैं। यह केवल विफल रहता है जब वहाँ नकारात्मक चक्र

(यह सबसे महत्वपूर्ण है कर रहे हैं। मेरा मतलब है, यह एक मैं कम से कम यकीन है कि के बारे में :)

3.Bellman-फोर्ड है कर रहा हूँ है जब केवल एक स्रोत होता है, तो डिज्क्रस्ट्रा की तरह प्रयोग किया जाता है। यह नकारात्मक वजन को नियंत्रित कर सकता है और इसका काम फ़्लॉइड-वॉर्शल के समान स्रोत के समान है, है ना?

आप देखने के लिए की जरूरत है, इसी एल्गोरिदम हैं (सौजन्य विकिपीडिया):

Bellman- फोर्ड:

procedure BellmanFord(list vertices, list edges, vertex source) 
    // This implementation takes in a graph, represented as lists of vertices 
    // and edges, and modifies the vertices so that their distance and 
    // predecessor attributes store the shortest paths. 

    // Step 1: initialize graph 
    for each vertex v in vertices: 
     if v is source then v.distance := 0 
     else v.distance := infinity 
     v.predecessor := null 

    // Step 2: relax edges repeatedly 
    for i from 1 to size(vertices)-1: 
     for each edge uv in edges: // uv is the edge from u to v 
      u := uv.source 
      v := uv.destination 
      if u.distance + uv.weight < v.distance: 
       v.distance := u.distance + uv.weight 
       v.predecessor := u 

    // Step 3: check for negative-weight cycles 
    for each edge uv in edges: 
     u := uv.source 
     v := uv.destination 
     if u.distance + uv.weight < v.distance: 
      error "Graph contains a negative-weight cycle" 

डिज्कस्ट्रा:

1 function Dijkstra(Graph, source): 
2  for each vertex v in Graph:        // Initializations 
3   dist[v] := infinity ;         // Unknown distance function from 
4                 // source to v 
5   previous[v] := undefined ;        // Previous node in optimal path 
6                 // from source 
7  
8  dist[source] := 0 ;          // Distance from source to source 
9  Q := the set of all nodes in Graph ;      // All nodes in the graph are 
10                 // unoptimized - thus are in Q 
11  while Q is not empty:          // The main loop 
12   u := vertex in Q with smallest distance in dist[] ; // Start node in first case 
13   if dist[u] = infinity: 
14    break ;           // all remaining vertices are 
15                 // inaccessible from source 
16   
17   remove u from Q ; 
18   for each neighbor v of u:        // where v has not yet been 
19                     removed from Q. 
20    alt := dist[u] + dist_between(u, v) ; 
21    if alt < dist[v]:         // Relax (u,v,a) 
22     dist[v] := alt ; 
23     previous[v] := u ; 
24     decrease-key v in Q;       // Reorder v in the Queue 
25  return dist; 

फ्लोयड-Warshall:

1 /* Assume a function edgeCost(i,j) which returns the cost of the edge from i to j 
2 (infinity if there is none). 
3 Also assume that n is the number of vertices and edgeCost(i,i) = 0 
4 */ 
5 
6 int path[][]; 
7 /* A 2-dimensional matrix. At each step in the algorithm, path[i][j] is the shortest path 
8 from i to j using intermediate vertices (1..k−1). Each path[i][j] is initialized to 
9 edgeCost(i,j). 
10 */ 
11 
12 procedure FloydWarshall() 
13 for k := 1 to n 
14  for i := 1 to n 
15   for j := 1 to n 
16    path[i][j] = min (path[i][j], path[i][k]+path[k][j]); 
+0

हो सकता है कि जिस तरह से एल्गोरिदम एक पाठ्यपुस्तक में लिखे गए हैं यह डिज्कस्ट्रा की एकमात्र एकल स्रोत के लिए प्रयोग किया जाता है की तरह लग रहे हैं, लेकिन इन एल्गोरिदम कर सकते हैं बनाता है लगभग कोई संशोधन के साथ एकाधिक स्रोत और एकाधिक गंतव्य के लिए उपयोग किया जाना चाहिए। डिजस्ट्रा के लिए आप अपने स्रोत वर्टेक्स को दूरी = 0 के साथ प्राथमिकता कतार में दबाकर शुरू करते हैं, यदि आप कई स्रोत चाहते हैं तो बस अपने सभी स्रोतों को दूरी = 0 के साथ दबाएं। वैकल्पिक रूप से आप अपने सभी स्रोत शीर्षकों में शून्य-वज़न किनारों के साथ एक एकल वर्टेक्स जोड़ सकते हैं, फिर उस वर्टेक्स को अपने वास्तविक स्रोत के रूप में उपयोग करें। –

+2

सटीक डुप्लिकेट: http://programmers.stackexchange.com/questions/158613/am-i-right-about-the-differences-between-floyd-warshall-dijkstras-and-bellman –

उत्तर

19

आप पहले दो प्रश्नों के बारे में सही हैं, और फ़्लॉइड-वारशॉल के लक्ष्य के बारे में (सभी जोड़ों के बीच सबसे कम पथ ढूंढना), लेकिन बेलमैन-फोर्ड और फ़्लॉइड-वारशॉल के बीच संबंधों के बारे में नहीं: दोनों एल्गोरिदम खोजने के लिए गतिशील प्रोग्रामिंग का उपयोग करते हैं सबसे छोटा रास्ता, लेकिन एफडब्ल्यू प्रत्येक प्रारंभिक नोड से हर दूसरे नोड तक बीएफ चलाने के समान नहीं है।

बीएफ में, सवाल यह है कि: अधिकांश के चरणों में स्रोत से लक्ष्य तक सबसे छोटा रास्ता क्या है, और चलने का समय ओ (ई वी) है। अगर हम इसे एक-दूसरे नोड पर चलाते थे, तो चलने का समय ओ (ई वी^2) होगा।

एफडब्लू में, सवाल यह है: सभी नोड्स i, j, k के लिए i से j के माध्यम से सबसे छोटा रास्ता क्या है। इससे ओ (वी^3) चलने का समय होता है - प्रत्येक प्रारंभिक नोड के लिए बीएफ से बेहतर (घने ग्राफ के लिए | वी | के कारक द्वारा)।

नकारात्मक चक्र/वजन के बारे में एक और नोट: डिजस्ट्रा सही परिणाम देने में असफल हो सकता है। बीएफ और एफडब्ल्यू असफल नहीं होंगे - वे सही ढंग से बताएंगे कि न्यूनतम वजन पथ नहीं है, क्योंकि नकारात्मक वजन असंबद्ध है।

+1

बीएफ के लिए निर्दिष्ट चलने का समय और एफडब्ल्यू सही हैं लेकिन उनका विवरण उलट दिया गया है। एफडब्ल्यू के प्रत्येक चरण में 1 से के बीच के सभी शिखर को "माध्यम" नोड के रूप में माना जाता है। जबकि बीएफ में, के किनारों से मुझे प्राप्त करने के लिए आवश्यक किनारों की संख्या का प्रतिनिधित्व करता है, न कि दूसरी तरफ। –

8

एकल स्रोत कम से कम पथ:

डिज्कस्ट्रा एल्गोरिथ्म - कोई नकारात्मक अनुमति वजन - हे (ई + Vlg (वी))

बेल्लमान फोर्ड एल्गोरिथ्म - नकारात्मक वजन अनुमति दी है।लेकिन अगर एक नकारात्मक चक्र मौजूद है बेल्लमान फोर्ड -ve चक्र की पहचान करेगा - ओ (VE)

निर्देशित अचक्रीय ग्राफ़ - हे (वी + ई)

सभी जोड़े कम से कम - नाम यह DAG के लिए ही काम करता है पता चलता है के रूप में पथ:

डिज्कस्ट्रा एल्गोरिथ्म - कोई नकारात्मक अनुमति वजन - हे (+ ve वी^2lg (वी))

बेल्लमान फोर्ड एल्गोरिथ्म - ओ (वी^2E)

मैट्रिक्स श्रृंखला गुणा विधि -complexity ही बेलमैन फोर्ड एल्गोरिदम

के रूप में

फ्लोयड Warshall एल्गोरिथ्म -uses गतिशील प्रोग्रामिंग विधि - जटिलता हे है (वी^3)

संबंधित मुद्दे