상세 컨텐츠

본문 제목

[Python] 최단 경로 알고리즘(2)- 다익스트라 (최소힙,최대힙)

Python/이코테

by Gopythor 2022. 7. 12. 03:59

본문

728x90
반응형

다익스트라 알고리즘: 간단한 구현 방법 성능 분석

  • 총 O(V)번에 걸쳐서 최단 거리가 가장 짧은 노드를 매번 선형 탐색해야 합니다.
  • 따라서 전체 시간 복잡도는 O(V²)입니다.
  • 일반적으로 코딩 테스트의 최단 경로 문제에서 전체 노드의 개수가 5,000개 이하라면 이 코드로 문제를 해결할 수 있습니다.
    • 하지만 노드의 개수가 10,000개 넘어가는 문제라면 어떻게 해야 할까요?

우선순위 큐

  • 우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조입니다.
  • 예를 들어 여러 개의 물건 데이터를 자료구조에 넣었다가 가치가 높은 물건 데이터부터 꺼내서
    확인해야 하는 경우에 우선순위 큐 이용할 수 있습니다.
  • Python, C++, Java를 포함한 대부분의 프로그래밍 언어에서 표준 라이브러리 형태로 지원합니다.
자료규조 추출되는 데이터
스택(Stack) 가장 나중에 삽입된 데이터
큐(Queue) 가장 먼저 삽입된 데이터
우선순위 큐(Priority Queue) 가장 우선순위가 높은 데이터

힙(Heap)

  • 우선순위 큐(Priority Queue)를 구현하기 위해 사용하는 자료구조 중 하나입니다.
  • 최소 힙(Min Heap)최대 힙(Max Heap)이 있습니다.
  • 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 사용됩니다.
우선순위 큐 구현 방식 삽입 시간 삭제 시간
리스트 O(1) O(N)
힙(Heap) O(logN) O(logN)

힙 라이브러리 사용 예제: 최소 힙

import heapq

# 오름차순 힙 정렬(Heap Sort)
def heapsort(iterable):
    h = []
    result = []
    #모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, value)
    #힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
        result.append(heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 7, 8, 2, 4, 6, 8, 0])
print(result)

힙 라이브러리 사용 예제: 최대 힙

import heapq

#내립차순 힙 정렬(Heap Sort)
def heapsort(iterable):
    h = []
    result = []
    #모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, -value)
    #힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
        result.append(-heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)

다익스트라 알고리즘: 개선된 구현 방법

  • 단계마다 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택하기 위해 힙(Heap) 자료구조를 이용합니다.
  • 다익스트라 알고리즘이 동작하는 기본 원리는 동일합니다.
    • 현재 가장 가까운 노드를 저장해 놓기 위해서 힙 자료구조를 추가적으로 이용한다는 점이 다릅니다.
    • 현재의 최단 거리가 가장 짧은 노드를 선택해야 하므로 최소 힙을 사용합니다.
728x90
반응형

관련글 더보기

댓글 영역