티스토리 뷰

반응형

다익스트라 알고리즘

네트워크에서 최단 경로를 찾는 알고리즘이며, 이 알고리즘은 엣지 가중치의 합이 최소가 되는 경로를 찾아줍니다. 즉, 그래프의 한 정점에서 다른 정점으로 가는 가장 짧은 경로를 찾는 문제를 해결하는데 사용됩니다.

 

1. 초기화: 시작 노드의 거리를 0으로, 나머지 모든 노드의 거리를 무한대로 설정합니다. 시작 노드를 현재 노드로 설정합니다.

2. 현재 노드에서 인접한 노드들의 거리를 계산합니다. 이 때, 기존에 설정한 거리보다 새로 계산한 거리가 짧으면 거리 정보를 업데이트합니다.

3. 모든 인접 노드에 대해 거리를 업데이트한 후에는 방문하지 않은 노드 중 거리가 가장 짧은 노드를 새로운 '현재 노드'로 설정합니다.

4. 모든 노드를 방문할 때까지 이 과정을 반복합니다.

 

다음과 같은 그래프를 가정하겠습니다.

  A -1- B -2- D
  |     |     |
  4     3     5
  |     |     |
  C -2- E -3- F

각 노드는 알파벳으로 표현하고, 엣지는 숫자로 가중치를 나타냈습니다.

다음은 Javascript로 구현한 다익스트라 알고리즘입니다.

const INFINITY = Number.MAX_SAFE_INTEGER;

const graph = {
  A: { B: 1, C: 4 },
  B: { A: 1, D: 2, E: 3 },
  C: { A: 4, E: 2 },
  D: { B: 2, F: 5 },
  E: { B: 3, C: 2, F: 3 },
  F: { D: 5, E: 3 },
};

function dijkstra(graph, start) {
  const distances = {};
  const visited = {};
  const predecessors = {};
  let unvisitedNodes = Object.keys(graph);

  for (let node of unvisitedNodes) {
    distances[node] = INFINITY;
  }
  distances[start] = 0;

  while (unvisitedNodes.length > 0) {
    unvisitedNodes.sort((a, b) => distances[a] - distances[b]);

    let closestNode = unvisitedNodes.shift();

    for (let neighbor in graph[closestNode]) {
      let possiblePath = distances[closestNode] + graph[closestNode][neighbor];
      if (possiblePath < distances[neighbor]) {
        distances[neighbor] = possiblePath;
        predecessors[neighbor] = closestNode;
      }
    }
    visited[closestNode] = true;
  }

  return { distances, predecessors };
}

console.log(dijkstra(graph, 'A'));

이 코드는 시작 노드 A에서 다른 노드까지의 최단 경로와 거리를 계산합니다. 마지막 줄에서 dijkstra(graph, 'A') 함수를 호출하여 그 결과를 출력하고 있습니다. 출력 결과는 각 노드까지의 최단 거리(distances)와 그 최단 경로를 이루는 노드들의 선행자(predecessors)를 담고 있습니다.

반응형

'알고리즘 > 기본개념' 카테고리의 다른 글

javascript - 투 포인터(Two Pointer)  (0) 2023.07.23
javascript - BFS(Breadth-First Search)  (0) 2023.07.05
javascript - DFS(Depth-First Search)  (0) 2023.06.26
javascript - 그래프(graph)  (0) 2023.06.25
javascript - 트리(Tree)  (0) 2023.06.24
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
링크
글 보관함