ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithm] - 다익스트라
    Algorithm/Algorithm 2022. 8. 31. 00:51

    다익스트라


    방향, 무방향 그래프에서 하나의 시작점으로 부터 다른 Node까지의 최단 거리를 구하는 알고리즘
    • Edge에 음수인 가중치가 있다면 절대 사용 불가!
    • 유사 알고리즘으로 A* 알고리즘이 존재하지만, 길찾기와 같이 Node가 엄청 많을 때 유사값을 찾는 용도이다.
    • 거리가 확정되지 않은 Edge 중에서 가장 가까운 Edge를 선택한다는 그리디 알고리즘으로 부터 착안한다.
    • O(V^2+E) => 갱신 가능
    • 아래와 같은 그래프에서 1부터 시작한다면, 각 Node별로 최단 거리 값이 결과가 나타난다.

    Graph

    • 1에서는 갈 수 있는 Node가 2,3,4 총 3가지다.
    • 이중에서 가장 작은 Edge는 Node 3과 연결된 2로 갱신 시키고 Node에 대해 확정을 시켜준다.
    • 연결된 가장 작은 Edge는 Node 2와 연결된 3으로 갱신시키고 Node에 대해 확정 시켜준다.
    • 위와 같이 계속하여 반복하여 준다면, O(V^2+E) 을 통하여 구현 할 수 있다.

    # 다익스트라
    import sys
    graphs = [[1,2,3],[1,3,2],[1,4,5],[2,3,2],[2,5,8],[3,4,2],[4,5,6],[5,6,1]]
    
    #init
    start = 1
    n = 6
    table = [sys.maxsize]*(n+1)
    visited = [0]*(n+1)
    
    table[start]=0
    visited[start]=1
    visited[0]=1
    node = [[] for _ in range(n+1)]
    
    #graph
    for st,ed,value in graphs :
        node[st].append((ed,value))
    
    for i in range(n-1):
        # 최단 거리 Table 갱신
        for end,value in node[start]:
            table[end] = min( table[start]+value , table[end] )
    
        index = sorted( [ (index,table[index]) for index,visit in enumerate(visited) if not visit ] , key = lambda x:(x[1],x[0]) )[0][0]
        visited[index]=1
        start=index
        print(i,table,visited)

     

    개선 다익스트라


    여기서 조금만 더 생각해보면, 각 Level에서 최소 가중치인 Edge를 선택하여 구현하면 더 빠르게 구현이 가능하다.

    • 이 때 최소 가중치를 빠르게 찾아주는 자료구조는 Heapq => O(ElogE)
    • E.g) BOJ 1753번 - 최단 경로 ( 해설 )

    1. Heapq에 ( 0,시작점 ) 추가

    2. Heapq에서 거리가 가장 작은 원소를 선택, 최단 거리 Table에 있는 값과 다르면 넘어간다.

    3. 움직일 Node를 V라고 할 때, V와 이웃한 Node들에 대해 최단 거리 Table 값보다 V를 거쳐가는 것이 더 작은 값을 가질 경우 테이블을 갱신하고 Heapq에 추가한다.

    4. Heapq가 빌 때 까지 2,3번을 반복한다.

     

     

     

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

    [Algorithm] - 위상 정렬  (0) 2022.09.01
    [Algorithm] - HEAP(우선 순위 QUEUE)  (1) 2022.09.01
    [Algorithm] - Graph( Node / Edge/ BFS / DFS )  (0) 2022.08.30
    이분 탐색  (0) 2022.08.30
    코딩 테스트 문자열 처리 시 주의점  (0) 2022.06.22

    댓글

Designed by Tistory.