0126168
Visit Today : 307
This Month : 6591
Your IP Address: 35.173.48.224

dfs 예제

다음은 DFS를 재귀적으로 또는 비재귀로 구현하는 의사 코드 및 파이썬 코드의 예입니다. 이 알고리즘은 일반적으로 스택을 사용하여 방문한 노드를 추적합니다. 예를 들어 노드 c에서 연결할 수 있는 노드를 선택할 수 있으므로 노드 d를 방문하는 다음 노드로 선택할 수 있습니다. 스택의 맨 위에 추가하고 „방문”으로 표시하고 부모 포인터를 설정합니다. 그리고 왜 좋은가? 글쎄, 하나에 대한, 나는 옵션의 큰 팬이고 선택할 수있는 그들 중 많은 데. 그러나 실제로, 이 모든 것은 우리가 전에 보았던 것들과 유사하게 보일 수 있는 다양한 유형의 문제와 이를 해결하기에 가장 적합한 다양한 솔루션으로 인해 발생합니다. 이것은 확실히 가장 간단한 문제의 경우: 예를 들어 정렬을. 이 시리즈의 초반에 배웠듯이 일련의 숫자를 정렬하고 순서대로 배치하는 것과 같이 기본적인 작업을 수행하는 방법은 매우 다양합니다. 사실, 옵션의 복합성은 종종 „기본”이어야하는 작업을 훨씬 더 복잡하게 만드는 것입니다. 이 두 알고리즘에 대해 기억해야 할 중요한 점은 어느 알고리즘도 반드시 다른 알고리즘보다 낫지 않다는 것입니다. 예를 들어 깊이 우선 검색은 경로가 두 노드 사이에 있는지 여부를 결정하는 데 매우 적합하며 전체 그래프를 통과하기 위해 초기화하거나 인스턴스화할 필요가 없으므로 많은 메모리가 필요하지 는 않습니다.

그러나 DFS는 두 노드 간의 가장 짧은 경로를 찾는 데 도움이 되지 않습니다. 실제로, 우리는 실수로 가장 긴 경로를 찾는 끝낼 수 있습니다! 이에 비해 BFS는 두 노드 간의 최단 경로를 찾는 데 좋지만, 이를 검색할 때 전체 그래프를 레벨별로 저장해야 하는 경우가 많으며, 이는 공간과 메모리에 많은 비용이 들 수 있습니다. 예를 들어 노드 A에서 시작하여 아래 방향 그래프를 검색할 때 순회 시퀀스는 A B B B A A 또는 A C C A B A(A에서 B 또는 C를 처음 방문하는 것을 선택하는 것은 알고리즘에 달려 있음)입니다. 노드에 대한 역추적 의 형태로 반복 방문하여 아직 방문하지 않은 이웃이 있는지 확인합니다(없음이 없는 것으로 확인되더라도). 따라서 가능한 예약 주문은 A B C 및 A C D B이며, 가능한 후주문은 D B C A 및 D C B A이며, 가능한 역 후주문은 A B B D 및 A B C D입니다. DFS의 재귀 적 측면을 노드를 „방문”하기 위해 이미 실행 중인 다른 함수 호출 내의 노드를 „방문”하는 함수 호출로 생각할 수 있습니다. 예를 들어, 노드 a를 방문하기 시작할 때, 우리는 노드 c. 깊이 우선 검색과 같은 자식 중 하나를 방문하기 시작할 때 노드 a를 방문하는 과정에 있으며, 적어도 몇 가지 다른 방법으로 설명및 구현될 수 있습니다. DFS 알고리즘을 처음 학습할 때 압도적으로 느껴질 수 있습니다. 그러나 작동 방식에 익숙해지면 DFS작동 방식의 다양한 구현과 특이성을 아는 것이 좋습니다. 이 알고리즘에 대한 심층적인 이해를 얻으려면 시작하는 데 도움이 되는 몇 가지 좋은 예제와 구현을 소개합니다.

DFS의 이 두 가지 변형은 서로 반대 순서로 각 정점의 이웃을 방문합니다: 재귀 변화에 의해 방문한 v의 첫 번째 이웃은 인접 한 가장자리 목록에서 첫 번째 인접 한 이웃이며 반복 적 변형에서 첫 번째 방문한 이웃은 인접 한 가장자리 목록에서 마지막 하나.