
바쁘다 바빠 정글...
실제로 여러 프로그램을 한번에 돌리는게 아니라, 프로세서가 빠르게 교차 실행하면서 마치 동시에 실행시키는 것 '처럼' 보이는 것
실제로 여러개를 돌리는 것은 병렬성!
def dfs(graph, start_node):
visit = list()
stack = list()
stack.append(start_node)
while stack:
node = stack.pop()
if node not in visit:
visit.append(node)
stack.extend(graph[node])
return visit
def dfs(graph, v, visited):
visited[v] = True
print(v ,end=' ')
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
| 항목 | 첫 번째 코드 | 두 번째 코드 |
|---|---|---|
| 💡 방식 | 반복문 + 스택 이용 (비재귀 DFS) | 재귀 함수 이용 |
| 🧠 호출 구조 | 명시적 stack으로 흐름 제어 | 함수 호출 스택을 사용 |
| 💻 구현 구조 | while stack: 반복문 | dfs() 함수 자기 자신을 호출 |
| 📝 방문 체크 | if node not in visit: → 리스트 기반 | visited[v] = True → 배열 기반 |
| 🔁 방문 순서 제어 | stack.extend(graph[node]) 순서에 따라 다름 | for i in graph[v]: 순회 순서에 따라 |
| 🧱 메모리 | 스택 직접 사용 → 메모리 안정적 | 재귀 깊이에 따라 최대 호출 제한 영향 받음 |
| 📌 종료 조건 | 스택이 빌 때까지 | 모든 노드 방문 시 종료 |
| 📎 사용 상황 | 재귀 깊이가 깊을 때 적합 (안정적) | 간결하고 직관적, 소규모 그래프에 적합 |
차이는 위와 같다. 아무래도 재귀로 풀다보면 RecursionError 가 발생할때가 있는데,
스택으로 구현할 경우 이런 에러가 발생하지 않는다는 점에서 스택으로 구현하는 연습도 많이 해봐야 겠다.
원래 CSAPP 같은 경우 여러번 읽었는데 문제를 푸느라 1회독 뿐이 못했다...
아침에 한번 읽어보자...ㅠ