Dijkstra의 알고리즘은 그래프 이론에서 그래프의 소스 노드에서 다른 모든 노드까지의 최단 경로를 찾는 데 사용되는 고전적인 경로 찾기 알고리즘입니다. 이 기사에서는 알고리즘과 정확성 증명을 살펴보고 JavaScript로 구현하는 방법을 제공합니다.
Dijkstra의 알고리즘은 음이 아닌 간선 가중치를 갖는 가중치 그래프에서 단일 소스 노드로부터 최단 경로를 찾도록 설계된 탐욕스러운 알고리즘입니다. 1956년 Edsger W. Dijkstra가 제안한 이 알고리즘은 컴퓨터 과학에서 가장 널리 사용되는 알고리즘 중 하나로 남아 있습니다.
우선순위 대기열을 사용하여 거리에 따라 노드를 저장합니다.
거리가 가장 짧은 노드를 반복적으로 추출하고 이웃 노드를 이완시킵니다.
어디 (들) 소스 노드이고, (v) 다른 노드를 나타냅니다.
작동 이유: 완화는 더 짧은 경로가 발견되면 거리를 점진적으로 업데이트하여 항상 노드까지의 최단 경로를 찾도록 보장합니다.
큐 작업:
강한 유도를 이용하여 Dijkstra 알고리즘의 정확성을 증명합니다.
강귀납법은 수학적 귀납법의 변형으로, 명제를 증명하기 위해 (P(n)) , 우리는 (P(1),P(2),…,P(k)) 증명하다 ( P(k 1)) . 이는 일반 유도와는 다릅니다. (P(k)) 증명하다 ( P(k 1)) . 다른 게시물에서 더 자세히 살펴보세요.
기본 사례:
소스 노드
(들)
로 초기화됩니다
거리(s)=0
, 맞습니다.
귀납적 가설:
지금까지 처리된 모든 노드의 최단 경로 거리가 정확하다고 가정합니다.
유도 단계:
다음 노드
(유)
우선순위 큐에서 제외됩니다. 부터
거리(u)
는 남은 최소 거리이며 모든 이전 노드의 거리가 정확합니다.
거리(u)
도 맞습니다.
전제 조건(우선순위 대기열):
// Simplified Queue using Sorting // Use Binary Heap (good) // or Binomial Heap (better) or Pairing Heap (best) class PriorityQueue { constructor() { this.queue = []; } enqueue(node, priority) { this.queue.push({ node, priority }); this.queue.sort((a, b) => a.priority - b.priority); } dequeue() { return this.queue.shift(); } isEmpty() { return this.queue.length === 0; } }
다음은 우선순위 대기열을 사용하는 Dijkstra 알고리즘의 JavaScript 구현입니다.
function dijkstra(graph, start) { const distances = {}; // hold the shortest distance from the start node to all other nodes const previous = {}; // Stores the previous node for each node in the shortest path (used to reconstruct the path later). const pq = new PriorityQueue(); // Used to efficiently retrieve the node with the smallest tentative distance. // Initialize distances and previous for (let node in graph) { distances[node] = Infinity; // Start with infinite distances previous[node] = null; // No previous nodes at the start } distances[start] = 0; // Distance to the start node is 0 pq.enqueue(start, 0); while (!pq.isEmpty()) { const { node } = pq.dequeue(); // Get the node with the smallest tentative distance for (let neighbor in graph[node]) { const distance = graph[node][neighbor]; // The edge weight const newDist = distances[node] + distance; // Relaxation Step if (newDist < distances[neighbor]) { distances[neighbor] = newDist; // Update the shortest distance to the neighbor previous[neighbor] = node; // Update the previous node pq.enqueue(neighbor, newDist); // Enqueue the neighbor with the updated distance } } } return { distances, previous }; } // Example usage const graph = { A: { B: 1, C: 4 }, B: { A: 1, C: 2, D: 5 }, C: { A: 4, B: 2, D: 1 }, D: { B: 5, C: 1 } }; const result = dijkstra(graph, 'A'); // start node 'A' console.log(result);
경로 재구성
// Simplified Queue using Sorting // Use Binary Heap (good) // or Binomial Heap (better) or Pairing Heap (best) class PriorityQueue { constructor() { this.queue = []; } enqueue(node, priority) { this.queue.push({ node, priority }); this.queue.sort((a, b) => a.priority - b.priority); } dequeue() { return this.queue.shift(); } isEmpty() { return this.queue.length === 0; } }
거리 초기화:
프로세스 A:
위 내용은 Dijkstras 알고리즘 이해: 이론에서 구현까지의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!