ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다익스트라 알고리즘(Dijkstra Algorithm)
    Computer Science/Algorithm 2021. 9. 25. 18:38

    다익스트라 알고리즘이란?

     - 그래프 상의 한 노드에서 다른 모든 노드까지의 최단 거리를 구할 때 유용하게 사용되는 알고리즘이다.

     - 노드와 노드 사이의 간선의 가중치가 0 이상의 정수일 때만 사용이 가능하다.


    다익스트라 알고리즘의 동작 과정

    1단계

     

    노드 1 2 3 4 5 6
    거리 0 2 5 1 INF INF

     

     - 출발 노드인 1을 기준으로 인접한 노드인 2, 3, 4 노드에 대한 최단 거리 테이블을 만들어 준다.
     - 인접하지 않은 노드인 경우 무한으로 표시한다.

     

    2단계

     

    노드 1 2 3 4 5 6
    거리 0 2 1+3=4 1 1+1=2 INF

     

     - 노드 1과 인접한 노드들 중 최단 거리가 가장 짧은 노드인 4번으로 진행한다.
     - 노드 4와 인접한 노드는 3, 5 노드이고, 이 노드까지의 최단 거리와 기존의 최단 거리 테이블의 값과 비교하여 더 짧은 거리로 갱신해준다.

     

    3단계

     

    노드 1 2 3 4 5 6
    거리 0 2 4 1 2 INF

     

     - 다음은 방문하지 않은 노드들 중 가장 짧은 노드인 2번 노드로 진행한다.
     - 노드 2와 인접한 노드는 3, 4 노드이고, 이 노드까지의 최단 거리와 기존의 최단 거리 테이블의 값과 비교하여 더 짧은 거리로 갱신해준다.
     - 기존의 최단 거리 테이블의 값이 더 적으므로 갱신할 필요가 없다.

     

    4단계

     

    노드 1 2 3 4 5 6
    거리 0 2 2+1=3 1 2 2+2=4

     

     - 다음은 방문하지 않은 노드들 중 가장 짧은 노드인 5번 노드를 선택하고, 최단 거리 테이블 갱신 과정을 반복한다.

     

    5단계

     - 다음으로는 3번 노드를 선택하고, 3번 노드의 인접 노드인 6번 노드의 거리가 기존의 최단 거리보다 크므로 갱신하지 않는다.

     

    6단계

     - 마지막으로, 6번 노드는 인접한 노드가 없기 때문에 알고리즘이 종료된다.


    구현 방법

    노드에 대한 정보
    static class Node implements Comparable<Node> {
    	int number;
    	int weight;
    
    	Node(int number, int weight) {
    		this.number = number;
    		this.weight = weight;
    	}
    
    	@Override
    	public int compareTo(Node o) {
    		return this.weight - o.weight;
    	}
    }

     - 노드에 대한 정보를 정의한 코드이다.
     - 각 노드는 번호와 가중치를 가지고 있으며, 우선순위 큐의 활용을 위해 가중치의 오름차순으로 compareTo() 메서드를 재정의하였다.

     

    다익스트라 알고리즘의 사전 준비
    static ArrayList<Node>[] arr;
    static int[] distance;
    static boolean[] visited;

     - arr는 각 노드들의 연결관계를 나타내는 변수이며, ArrayList의 자료구조로 선언하였다.
     - distance는 시작 노드에서 각 노드까지의 최단 거리를 저장하는 배열이다.
     - visited는 각 노드의 방문 여부를 저장하는 배열이다.

     

    우선순위 큐를 이용한 다익스트라 알고리즘의 구현
    static void dijkstra(int start) {
    	PriorityQueue<Node> queue = new PriorityQueue<>();
    
    	Arrays.fill(distance, Integer.MAX_VALUE);
    
    	distance[start] = 0;
    	queue.add(new Node(start, 0));
    
    	while (!queue.isEmpty()) {
    		Node current = queue.poll();
    
    		if (visited[current.number] == false)
    			visited[current.number] = true;
    		else
    			continue;
    
    		for (int i = 0; i < arr[current.number].size(); i++) {
    			Node next = arr[current.number].get(i);
    
    			if (distance[current.number] + next.weight < distance[next.number]) {
    				distance[next.number] = distance[current.number] + next.weight;
    
    				queue.add(new Node(next.number, distance[next.number]));
    			}
    		}
    	}
    }

     - 우선순위 큐를 선언한 후, distance[] 배열을 정수의 최대치로 초기화한다.
     - 그 후, 시작 노드의 최단거리를 0으로 초기화를 하고, 시작 노드를 우선순위 큐에 삽입한다.
     - 우선순위 큐에서 가장 낮은 가중치를 가진 노드를 꺼내어 방문 여부를 확인한다.
     - 방문하지 않은 노드라면, 해당 노드와 인접한 노드들의 가중치와 기존의 가중치를 비교하여 더 낮은 값이라면 새로운 값으로 갱신한다.
     - 위 과정을 우선순위 큐가 빈 상태일 때까지 반복한다.


     

    GitHub - qlsdud0604/algorithm-study: 자료구조 및 알고리즘 공부 기록 공간

    :books: 자료구조 및 알고리즘 공부 기록 공간. Contribute to qlsdud0604/algorithm-study development by creating an account on GitHub.

    github.com

     

    728x90

    'Computer Science > Algorithm' 카테고리의 다른 글

    위상 정렬(Topological Sorting)  (0) 2021.09.25
    크루스칼 알고리즘(Kruskal Algorithm)  (0) 2021.09.25
    BFS(너비 우선 탐색)  (0) 2021.09.25
    DFS(깊이 우선 탐색)  (0) 2021.09.25
    다양한 정렬 알고리즘  (0) 2021.09.25

    댓글

Designed by Tistory.