2.4 KiB
2.4 KiB
deck:: Logseq/coding tip
-
1. 개념(Concept)
- 최소 스패닝 트리(MST)를 구하는 알고리즘.
- “임의의 시작 정점에서 출발하여, 현재 트리에 연결된 간선 중 가장 싼 것을 추가하며 확장한다.” 라는 전략을 사용
- 이를 위해 {{cloze 우선순위 큐}}가 사용됨. id:: 69511108-8006-4c0a-9452-d248f8c58ca5
- 다익스트라(Dijkstra) 알고리즘과 비슷함.
-
2. 기본 구조 (Basic Structure)
-
- 임의의 정점(vertex)을 하나 선택해서 트리에 포함시킨다.
-
- 현재 트리에 포함된 정점들과 포함되지 않은 정점들을 연결하는 간선 중, 가중치가 가장 작은 간선을 찾는다.
-
- 해당 간선과 연결된 새로운 정점을 트리에 추가한다.
-
- 위의 과정을 반복하여 최종적으로 모든 정점이 트리에 포함될 때 까지 반복한다.
-
-
3. 코드(python)
- 입력이 V(정점의 갯수), 인접리스트(graph)와 시작노드(start_node)를 매개변수로 하여
id:: 695111c8-84a0-4220-a7f4-b9f654761cec
프림 알고리즘으로 최소 스패닝 트리를 구현하고,
이때 총 가중치를 반환하는 함수를 구현하면?
#card# graph: (노드: [(비용, 인접노드)]...) # ex) graph = [[],[(3,2),(4,5)],[(1,3)]...]-
import heapq # graph: 인접 리스트 (노드: [(비용, 인접노드), ...]) def prim(start_node, v, graph): visited = [False] * (v + 1) min_heap = [(0, start_node)] # (비용, 정점) total_cost = 0 count = 0 while min_heap: cost, node = heapq.heappop(min_heap) if visited[node]: continue visited[node] = True total_cost += cost count += 1 if count == v: # 모든 정점 방문 완료 break # 인접 정점 중 방문 안 한 곳을 큐에 넣기 for next_cost, next_node in graph[node]: if not visited[next_node]: heapq.heappush(min_heap, (next_cost, next_node)) return total_cost
-
- 입력이 V(정점의 갯수), 인접리스트(graph)와 시작노드(start_node)를 매개변수로 하여
id:: 695111c8-84a0-4220-a7f4-b9f654761cec
프림 알고리즘으로 최소 스패닝 트리를 구현하고,
이때 총 가중치를 반환하는 함수를 구현하면?
-
4. 시간복잡도
- 우선순위큐 연산이 주된 연산이므로 우선순위 큐 연산 속도에 영향을 많이 받음.
- 시간복잡도는 {{cloze $O(E\log V)$}} id:: 69511407-a9bc-40f2-b57c-f76060ea75f1