2020. 11. 21. 19:47ㆍIT공부/자료구조&알고리즘 연습
최소 신장 트리의 이해
1. 프림 알고리즘 (Prim's algorithm)
- 대표적인 최소 신장 트리 알고리즘
- Kruskal’s algorithm (크루스칼 알고리즘), Prim's algorithm (프림 알고리즘)
- 프림 알고리즘
- 시작 정점을 선택한 후, 정점에 인접한 간선중 최소 간선으로 연결된 정점을 선택하고, 해당 정점에서 다시 최소 간선으로 연결된 정점을 선택하는 방식으로 최소 신장 트리를 확장해가는 방식
- Kruskal's algorithm 과 Prim's algorithm 비교
- 둘다, 탐욕 알고리즘을 기초로 하고 있음 (당장 눈 앞의 최소 비용을 선택해서, 결과적으로 최적의 솔루션을 찾음)
- Kruskal's algorithm은 가장 가중치가 작은 간선부터 선택하면서 MST를 구함
- Prim's algorithm은 특정 정점에서 시작, 해당 정점에 연결된 가장 가중치가 작은 간선을 선택, 간선으로 연결된 정점들에 연결된 간선 중에서 가장 가중치가 작은 간선을 택하는 방식으로 MST를 구함
2. 그림으로 이해하는 프림 알고리즘
1. 임의의 정점을 선택, '연결된 노드 집합'에 삽입
2. 선택된 정점에 연결된 간선들을 간선 리스트에 삽입
3. 간선 리스트에서 최소 가중치를 가지는 간선부터 추출해서,
- 해당 간선에 연결된 인접 정점이 '연결된 노드 집합'에 이미 들어 있다면, 스킵함(cycle 발생을 막기 위함)
- 해당 간선에 연결된 인접 정점이 '연결된 노드 집합'에 들어 있지 않으면, 해당 간선을 선택하고, 해당 간선 정보를 '최소 신장 트리'에 삽입
4. 추출한 간선은 간선 리스트에서 제거
5. 간선 리스트에 더 이상의 간선이 없을 때까지 3-4번을 반복
3. 프림 알고리즘 (Prim's algorithm) 코드 작성
참고: heapq 라이브러리 활용을 통해 우선순위 큐 사용하기
- heapq.heappush를 통해 데이터를 heap 형태로 넣을 수 있음 (0번 인덱스를 우선순위로 인지함)
import heapq
queue = []
graph_data = [[2, 'A'], [5, 'B'], [3, 'C']]
for edge in graph_data:
heapq.heappush(queue, edge)
for index in range(len(queue)):
print (heapq.heappop(queue))
print (queue)
[2 , ‘ A ‘ ]
[ 3, ‘ C ‘ ]
[ 5, ‘ B ‘ ]
[ ]
- heapq.heapify() 함수를 통해 리스트 데이터를 heap 형태로 한 번에 변환할 수 있음 (0번 인덱스를 우선순위로 인지함)
import heapq
graph_data = [[2, 'A'], [5, 'B'], [3, 'C']]
heapq.heapify(graph_data)
for index in range(len(graph_data)):
print (heapq.heappop(graph_data))
print (graph_data)
[2 , ‘ A ‘ ]
[ 3, ‘ C ‘ ]
[ 5, ‘ B ‘ ]
[ ]
참고: collections 라이브러리의 defaultdict 함수 활용하기
- defaultdict 함수를 사용해서, key에 대한 value를 지정하지 않았을 시, 빈 리스트로 초기화하기
from collections import defaultdict
list_dict = defaultdict(list)
print (list_dict['key1'])
[]



강의에 대해 정확하게 알고 싶다면
'IT공부 > 자료구조&알고리즘 연습' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] {코딩테스트인강} 100% 환급 챌린지 36회차 미션 (0) | 2020.11.23 |
---|---|
[패스트캠퍼스 수강 후기] {코딩테스트인강} 100% 환급 챌린지 35회차 미션 (0) | 2020.11.22 |
[패스트캠퍼스 수강 후기] {코딩테스트인강} 100% 환급 챌린지 33회차 미션 (0) | 2020.11.20 |
[패스트캠퍼스 수강 후기] {코딩테스트인강} 100% 환급 챌린지 32회차 미션 (0) | 2020.11.19 |
[패스트캠퍼스 수강 후기] {코딩테스트인강} 100% 환급 챌린지 31회차 미션 (0) | 2020.11.18 |