친애하는 독자,이 문서에서 나는 깊이 첫 번째 검색의 개념을 통해 당신을 안내합니다. 이것은 많은 경쟁 코딩 시험에서 공통적 인 문제 인 그래프 개념입니다. 파이썬을 사용하여 순회를 만드는 것을 살펴 보겠습니다.
목차
깊이 첫 번째 검색은 무엇입니까?
깊이 우선 검색은 스택 데이터 구조를 사용하여 그래프와 트리를 탐색하는 알고리즘입니다. 깊이 우선 검색의 개념은”깊이”라는 단어에서 비롯됩니다. 트리는 분기 깊이까지 순회 한 다음 나머지 노드로 다시 순회합니다.
각 반복에 대해 방문한 노드가 포함 된 빈”스택”을 고려하십시오. 여기에 우리의 작업은 다음과 같습니다:
- 루트 노드에서 시작하여 스택에 밀어 넣습니다.
- 트리의 인접한 노드를 확인하고 하나의 노드를 선택합니다.
- 선택한 노드의 전체 분기를 트래버스하고 모든 노드를 스택으로 푸시합니다.
- 분기(더 이상 인접한 노드가 없음)의 끝에 도달하면,즉 잎 노드,단일 단계로 뒤로 이동하고 인접한 노드를 찾습니다.
- 인접 노드가있는 경우 엔-1 번째 노드,해당 분기를 트래버스하고 노드를 스택으로 푸시합니다.
깊이 첫 번째 검색 개념
아래 예제 그래프를 살펴 보겠습니다:
는 루트 노드입니다. 그래서 이후 방문,우리는 스택에 이것을 밀어.
Stack : A
그래서 우리는 비로 가서 스택에 밀어 넣습니다.
Stack : A B
이제,우리는 우리의 끝에 왔습니다 에이-비 분기 그리고 우리는로 이동 엔-1 노드 이는 에이. 지금 당신은 통과해야 에스-씨-디 지점,깊이까지 즉,개까지 디 과 마크 에스,씨,디 방문한.
Stack: A B S C D
이후 디 다른 인접 노드가 없으므로 다시 이동 씨 그리고 인접한 분기를 횡단하십시오.
Stack : A B S C D E H G
에 도달 디,하나의 인접한 노드 만 있습니다. 또한 스택에 밀어 넣습니다.
Stack : A B S C D E H G F
이 스택 자체는 다음과 같습니다.
파이썬 코딩 깊이 첫 번째 검색 알고리즘
당신이 알고 있어야하므로,인접 목록 및 인접 행렬 인 그래프를 나타내는 많은 방법이 있습니다.
다음 예제에서는 그래프의 각 노드에 대한 인접성 목록을 정의했습니다.
graph1 = { 'A' : , 'B' : , 'C' : , 'D' : , 'E' : , 'F' : , 'G' : , 'H' : , 'S' : }
참고: 이 인접 목록은 사용자로부터 입력 할 수 있으며 하드 코딩 할 필요가 없습니다.
이제 그래프(인접 목록),노드 및 방문한 노드 목록의 3 가지 매개 변수를 입력으로 사용하는 함수를 정의합니다.
현재 노드가 방문되지 않은 경우,즉 방문 목록에 존재하지 않는 경우,방문한 것으로 표시하고 방문한 목록에 추가합니다.
다음 노드로 이동한 다음 이 노드를 재귀적으로 디프에이션 함수로 전달합니다. 이 방법으로 각 노드는 깊이까지 이동하여 출력합니다.
def dfs(graph, node, visited): if node not in visited: visited.append(node) for k in graph: dfs(graph,k, visited) return visitedvisited = dfs(graph1,'A', )print(visited)
완전한 코드 및 출력
graph1 = { 'A' : , 'B' : , 'C' : , 'D' : , 'E' : , 'F' : , 'G' : , 'H' : , 'S' : }def dfs(graph, node, visited): if node not in visited: visited.append(node) for k in graph: dfs(graph,k, visited) return visitedvisited = dfs(graph1,'A', )print(visited)
위 코드의 출력은 다음과 같습니다:
결론
이 자습서를 따라 코드 및 예제를 이해할 수 있기를 바랍니다. 더 나은 통과를 이해하기 위해 당신 옆에 펜과 종이를 사용하여 그것을 밖으로 시도 마십시오.