알고리즘

HEAP #힙 자료구조 #heapq #Dijkstra #다익스트라 알고리즘

iemxl 2024. 5. 10. 12:15

이란?

: 무엇인가를 차곡차곡 쌓아올린 더미

: 항상 이진트리 형태

: 부모의 값은 항상 자식의 값보다 크거나(최대 힙) 작아야(최소 힙) 함

 

  • 최대 힙 : 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰 힙
  • 최소 힙 : 부모 노드의 키 값이 자식 노드의 키 값보다 항상 작은 힙

 

# 파이썬에서 heap 사용하기 

# 최소 힙 구현과 heapq 모듈 사용

import heapq  #heapq 

heap = []                     #list로 초기화

heapq.heappush(heap, item)    #item을 heap에 추가 >> heap에 push하면 자동으로 최소힙의 형태로 정렬

heapq.heappop(heap)           #heap에서 가장 작은 원소를 pop

heapq.heapify(lst)            #리스트 lst를 heap으로 변환

 

* 힙은 최소값을 빨리 찾기 위함이지 정렬이 아님을 주의

 

 

# 최대 힙 구현

heap = [1, 2, 3, 4]

max_heap = []

for i in heap:
	heapq.heappush(max_heap, (-i, i))       #거꾸로 push
                                               #[(-4, 4), (-3, 3), (-2, 2), (-1, 1)]

heapq.heappop(max_heap)                        #최댓값이 반환됨    >> 4

 

 

 

 

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

: 그래프 꼭짓점 간의 최단 경로를 찾는 알고리즘

: 가장 짧은 경로를 찾는 알고리즘  =  최단 경로 트리

 

import heapq
import sys

n, m = map(int, input().split())    #n: 노드 개수,   m: 간선
k = int(input())                    #시작 노드
INF = sys.maxsize                   #1e8

graph = [[] for _ in range(n+1)]

distance = [INF] * (n+1)            #간선 가중치 초기화

for _ in range(m):
	u, v, w = map(int, input().split())     #u:출발노드, v:도착노드, w:간선 가중치
    graph[u].append((v, w))                 #graph에 도착과 가중치 입력
    
def dijkstra(start):
	q = []
    heapq.heappush(q, (0, start))    #최소 힙, 우선순위를 지키며 정렬 됨
    distance[start] = 0              #거리 값
    
    while q:
    	dist, now = heapq.heappop(q)   #우선 순위가 가장 낮은 값이 나옴 (= 가장 작은 거리)
        
        if distance[now] < dist:       #현재 노드까지의 거리보다 작으면 continue
        	continue
            
        for i in graph[now]:
        	if (dist + i[1]) < distance[i[0]]:     #기존 보다 값이 작으면
            	distance[i[0]] = dist + i[1]       #현재 거리에 가중치 더해줌
                heapq.heappush(q, (dist + i[1], i[0]))   #q의 거리 값 갱신
                
dijkstra(k)

'알고리즘' 카테고리의 다른 글

정렬  (0) 2024.05.09
DFS/BFS  (0) 2023.08.03
구현  (0) 2023.07.05
그리디 알고리즘  (0) 2023.06.28