250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 선형회귀
- Join
- 내일배움일지
- 아티클스터디
- 이중for문
- 다중공선성
- map
- 태블로
- 데이터시각화
- 시각화
- SQL
- python
- Set
- 프로그래머스
- Max
- 통계학
- 리스트
- Leetcode
- 데이터전처리
- DATE_SUB
- 가설검정
- AB테스트
- Til
- 내배캠_학습기록
- ★
- 한줄for문
- f-string
- SQLD
- 반복문
- 내일배움캠프
Archives
- Today
- Total
노력에는 지름길이 없으니까요
(미완) 그래프 알고리즘 종류 본문
728x90
1) 그래프 탐색 알고리즘 (Graph Search Algorithms)
그래프에서 특정 정점을 찾는 알고리즘
그래프의 각 정점을 순회하면서 방문해야 하므로, 그래프 순회 알고리즘(Graph Traversal Algorithms)으로 부르기도 한다.
- 너비 우선 탐색 (BFS)
- 깊이 우선 탐색 (DFS)
2) 최단 경로 알고리즘
최소 가중치 합을 가지는 경로를 찾는 알고리즘
네트워크 설계, 교통 시스템 최적화, 지리적 경로 탐색 등 다양한 분야에서 경로 최적화 문제를 해결하는 데 활용
- 다익스트라 알고리즘
- 벨만-포드 알고리즘
- 플로이드 알고리즘
알아보고 싶던 것은 그래프 탐색 알고리즘이므로 BFS와 DFS를 중점적으로 조사할 생각이다.
알고리즘의 시간 복잡도는 그래프의 구조에 따라 달라질 수 있으나, 일반적으로 O(V+E)로 표현된다.
1) 너비 우선 탐색 (BFS) - Breath-First Search
가까운 인접 정점을 모두 방문한 후, 그다음 가까운 정점을 방문하는 방식의 그래프 탐색 알고리즘
- 큐
- 최단 경로를 찾는데 유용
- 넓은 범위를 탐색할 때 메모리 소비가 크다
- 네트워크 라우팅, 소셜 네트워킹의 최단 경로 찾기
2) 깊이 우선 탐색 (DFS) - Depth-First Search
최대한 깊이 갈 수 있는 정점까지 가보고, 더 이상 진행 못하는 경우 다시 돌아와서 갈림길에 있는 미방문 정점부터 탐색을 시작하는 방식
- 스택, 재귀 호출 방식
- 메모리 소비가 적고 복잡한 경로나 사이클을 찾는데 유리
- 최단 경로를 보장하지 않음
- 퍼즐, 미로 찾기, 트리 구조 분석
g = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
1) 재귀함수를 이용
# DFS 함수를 정의합니다.
def dfs(graph, start, visited=None): #visited 기본값 None
if visited is None: #visited가 없을 경우 선언
visited = set()
visited.add(start)
print(start, end=' ')
for next_node in graph[start]:
if next_node not in visited:
dfs(graph, next_node, visited)
2) 스택을 이용
def dfs(graph, start):
visited = set() # 방문한 노드를 저장할 set
stack = [start] # 시작 노드를 스택에 추가
while stack:
node = stack.pop() # 스택에서 가장 최근에 추가된 노드를 가져옴
if node not in visited:
visited.add(node) # 방문한 노드를 저장
print(node, end=' ')
for next_node in graph[node]:
if next_node not in visited:
stack.append(next_node) # 다음에 방문할 노드를 스택에 추가
재귀쪽은 A-B로 향했는데 스택쪽은 A-C로 향했다. 효율면에서 보면 스택쪽이 한붓그리기처럼 다음 노드로 갈 때 불필요하게 간선을 거쳐가지 않은 듯 보인다...
의문점
1. 재귀와 스택 중 더 효율적인 쪽이 무엇인지
2. 재귀와 스택의 답이 다른데, (물론 방향이 다른 것뿐 둘다 틀린 답은 아닌 듯 하다.) 이 경우 어느 쪽을 사용하더라도 '코딩 테스트' 관점에서는 문제가 없는지
참고한 자료
728x90
반응형
'Python' 카테고리의 다른 글
(미완) 코딩테스트 강의 요약 (2) | 2024.07.22 |
---|---|
(미완) 데이터 분석가 취업 특강 요약 (2) | 2024.07.22 |
(미완) 데이터전처리, 시각화 - 데이터시각화 (0) | 2024.07.19 |
그래프 (Graph)의 정의, 장단점, 구현법 (1) | 2024.07.18 |
dictionary(사전형) 정리 (0) | 2024.07.15 |