그래프 검색 : 너비 우선 및 깊이 우선


78

그래프를 검색 할 때는 폭 우선깊이 우선의 두 가지 쉬운 알고리즘이 있습니다 (보통 모든 인접 그래프 노드를 대기열 (폭 우선) 또는 스택 (깊이 우선)에 추가하여 수행).

자, 서로의 장점이 있습니까?

내가 생각할 수있는 것 :

  • 데이터가 그래프 내부에서 상당히 아래로 내려갈 것으로 예상되는 경우 그래프 의 더 깊은 부분으로 매우 빠르게 내려 가면서 깊이 우선을 먼저 찾을 수 있습니다.
  • 반대로, 그래프에서 데이터가 꽤 많이 올라올 것으로 예상되면 너비 우선 은 결과를 더 일찍 제공 할 수 있습니다.

내가 놓친 것이 있습니까? 아니면 개인적으로 선호하는 부분이 있습니까?

답변:


43

나는 인용하고 싶습니다 스택 오버플로의 응답을 하여 hstoerr 문제를 잘 다루고 있습니다 :

이는 검색 트리의 구조와 솔루션의 수와 위치에 따라 크게 다릅니다 .
솔루션이 트리의 루트에서 멀지 않다는 것을 알고 있으면 너비 우선 검색 (BFS)이 더 좋습니다. 트리가 매우 깊고 솔루션이 드문 경우 DFS (Depth First Search)가 영원히 뿌리를 내리지 만 BFS가 더 빠를 수 있습니다. 트리가 매우 넓은 경우 BFS에 너무 많은 메모리가 필요할 수 있으므로 완전히 비현실적 일 수 있습니다. 솔루션이 빈번하지만 트리의 깊은 곳에있는 경우 BFS는 실용적이지 않을 수 있습니다. 검색 트리가 매우 깊으면 어쨌든 (예를 들어 반복 심화) 깊이 우선 검색 (DFS)에 대한 검색 깊이를 제한해야합니다.

그러나 이것들은 단지 경험 법칙입니다. 아마도 실험을해야 할 것입니다.

Rafał Dowgird 는 또한 다음과 같이 말합니다.

일부 알고리즘은 작동하는 DFS (또는 BFS)의 특정 속성에 따라 다릅니다. 예를 들어, 2 개의 연결된 구성 요소를 찾기위한 Hopcroft 및 Tarjan 알고리즘은 DFS에서 이미 방문한 각 노드가 루트에서 현재 탐색 된 노드까지의 경로에 있다는 사실을 이용합니다.


5
이 답변에 27 개의
찬성 투표

37

멀티 코어 세계에서 중요한 한 가지 점 : BFS는 훨씬 쉽게 병렬화 할 수 있습니다. 이것은 직관적으로 합리적이며 (각 자녀에 대해 스레드를 보내며) 그렇게 입증 될 수 있습니다. 따라서 병렬 처리를 사용할 수있는 시나리오가있는 경우 BFS를 사용하는 것이 좋습니다.


8
주어진 설정에서 DFS가 유리한 경우 충분한 스레드를 생성하고 DFS를 계속할 때까지 BFS를 적용 할 수 있습니다. 보다 구체적으로, DFS를 수행 할 수 있으며, 내려갈 때마다 스레드가 충분하지 않으면 다음 형제를 위해 스레드를 생성합니다.
Raphael

이 답변에는 20 개의 공감대가 없습니다. 문제는 두 가지 알고리즘의 일반적인 용도에 관한 것이지 특정 용도에 관한 것이 아닙니다.
nbro

31

(커뮤니티 위키로 만들었습니다. 자유롭게 편집하십시오.)

만약

  • b 는 분기 인자입니다
  • d 는 해가있는 깊이
  • d hh 는 나무의 높이입니다 (따라서 )dh

그때

  • DFS는 시간과 공간이 필요합니다O ( h )O(bh)O(h)
  • BFS는 시간과 공간이 필요합니다O ( b d )O(bd)O(bd)
  • IDDFS는 시간과 공간이 필요합니다O ( d )O(bd)O(d)

선택해야 할 이유

  • DFS
    • 어쨌든 전체 나무를 봐야한다
    • 당신은 의 답의 수준 을 알고 있습니다d
    • 답이 가장 근사치인지 상관하지 않습니다.
  • BFS
    • 대답은 뿌리에 가깝다
    • 루트에 가장 가까운 답을 원합니다
    • 여러 개의 코어 / 프로세서가 있습니다
  • IDDFS
    • BFS를 원하고 메모리가 충분하지 않지만 다소 느립니다.

IDDFS = 반복 심화 깊이 우선 검색


1
이것은 훌륭한 답변입니다. 그래도 질문에 그래프에 대해 묻는 동안이 답변은 나무를 나타냅니다. 나무는 물론 그래프이며, 단어를 대체 할 수 있지만 h"나무의 높이"는 어떻습니까? 이것이 "그래프 높이"로 직접 변환됩니까?
user2023370

IDDFS를 사용하는 또 다른 이유는 사용 방법에 따라 각 반복 후에 가능한 답변을 얻을 수 있기 때문입니다 (예 : 최대 또는 최소를 검색하는 경우). 즉, 답변이 "충분히 좋은"경우 알고리즘을 일찍 종료하거나 사용자 입력 (예 : IDDFS를 사용하여 최적의 솔루션을 찾지 만 조각을 이동하는 플레이어에 의해 중단 된 체스 엔진)에서 종료 할 수 있습니다.
jedd.ahyoung

추가해야 할 또 다른 사항은 DFS가 스택을 사용하는 반면 BFS는 대기열을 사용한다는 것입니다.
Karthik Balaguru

17

올바른 프로그램을 얻기 위해 하나를 선택해야하는 경우 (이미 언급 한 최단 경로를 제외하고) 한 시나리오는 무한한 그래프입니다.

예를 들어 각 노드에 한정된 수의 자식이 있지만 트리의 높이가 무한한 트리를 고려하면 DFS는 원하는 노드를 찾지 못할 수 있습니다. 모든 노드의 첫 번째 자식을 계속 방문합니다. 당신이 찾고있는 것이 부모의 첫 아이가 아니라면 결코 거기에 도달하지 않을 것입니다. 그러나 BFS는 유한 한 시간 안에 그것을 찾을 수 있습니다.

마찬가지로 각 노드에 무한한 수의 자식이 있지만 트리의 높이가 한정된 트리를 고려하면 BFS가 종료되지 않을 수 있습니다. 루트 노드의 자식 만 방문하고 찾고있는 노드가 다른 노드의 자식이면 도달하지 않습니다. 이 경우 DFS는 유한 시간 내에이를 찾을 수 있습니다.


7
무한 그래프에 대해서는 반 결정 알고리즘만을 생성한다는 점에 주목할 필요가있다. 한정된 시간 내에 요소가 트리에 없는 것으로 결정할 수는 없습니다 (분명히). 실제 응용에 관해서는 (개념적으로) 무한 데이터 구조 정의 할 수 있습니다 (3.4 항 참조)!
라파엘

15

너비 우선 및 깊이 우선은 확실히 동일한 최악의 동작을 갖습니다 (원하는 노드는 마지막 노드입니다). 그래프에 대한 정보가없는 경우에도 평균 사례에 대해서도 마찬가지입니다.

너비 우선 검색의 장점 중 하나는 관심이 있거나 없을 수있는 가장 짧은 경로 (가장자리가 거의 없음)를 찾는 것입니다.

평균 노드 순위 (이웃 수)가 노드 수에 비해 높은 경우 (즉, 그래프가 밀도가 높은 경우), 너비 우선 순위에는 큰 대기열이 있고 깊이 우선 순위에는 작은 스택이 있습니다. 희소 그래프에서는 상황이 반대로됩니다. 따라서 메모리가 제한 요인 인 경우 사용중인 그래프의 모양에 따라 검색 전략을 선택해야 할 수 있습니다.


bfs 단위의 대기열 길이와 dfs 단위의 스택 높이는 구현에 따라 크게 다릅니다. dfs의 경우 항상 스택에서 전체 이웃을 확장하면 특히 그래프가 조밀 할 때 많이 커집니다. dfs가 재귀에서 반환 될 때 계속할 위치를 알려주는 참조 만 푸시하면 많은 공간이 절약됩니다.
uli

3

위의 모든 내용은 정확하지만 BFS와 DFS는 트리를 통과하는 데 사용하는 순서에 따라 자체 트리를 만듭니다. 그 나무들 각각에는 어떤 종류의 문제에 유용 할 수있는 자체 속성이 있습니다.

예를 들어, BFS 트리에없는 원래 그래프의 모든 모서리는 교차 모서리입니다. BFS 트리의 두 분기 사이에있는 모서리. DFS 트리에없는 원래 그래프의 모든 모서리는 뒤쪽 모서리입니다. DFS 트리의 분기에서 두 정점을 연결하는 모서리. 이러한 특성은 특수 착색 등과 같은 문제에 유용 할 수 있습니다.


1

DFS와 BFS 트리에는 모두 그래프에 대한 유용한 정보를 제공 할 수있는 고유 한 속성이 있습니다. 예를 들어 단일 DFS를 사용하면 다음을 수행 할 수 있습니다.

  • 브리지 및 관절 점 찾기 (무 방향 그래프의 경우)
  • 사이클 감지
  • 강력하게 연결된 구성 요소 찾기 (Tarjan 알고리즘)

BFS를 사용하면 그래프에서 소스 노드와 다른 노드 사이의 최단 경로를 찾을 수 있습니다.

CLRS의 Graph Algorithms 장은 DFS 및 BFS의 이러한 속성을 매우 훌륭하게 요약합니다.


-2

코드를 바꾸는 것만으로 하나의 알고리즘 또는 다른 알고리즘을 얻을 수있는 방식으로 두 가지를 작성하는 것이 흥미로울 것이라고 생각합니다. .

저는 개인적으로 풍경을 범람하는 것으로 BFS를 해석하는 것을 좋아합니다. 저고도 지역은 먼저 침수 될 것이고, 그런 다음에 만 고고도 구역이 뒤따를 것입니다. 지리 책에서 볼 수 있듯이 가로 고도를 등각 선으로 생각하면 BFS가 물리학에서와 마찬가지로 동일한 등선 아래의 모든 영역을 동시에 채울 수 있습니다. 따라서 고도를 거리 또는 스케일 비용으로 해석하면 알고리즘에 대한 직관적 인 아이디어를 얻을 수 있습니다.

이를 염두에두고 폭이 넓은 첫 번째 검색에 대한 아이디어를 쉽게 적용하여 최소 스패닝 트리를 쉽게 찾고, 최단 경로 및 기타 여러 최소화 알고리즘을 찾을 수 있습니다.

나는 DFS에 대한 직관적 인 해석을 아직 보지 못했지만 (미로에 대한 표준 만 있지만 BFS만큼 강력하지 않고 범람하지는 않습니다), BFS는 위에서 설명한 것처럼 물리적 현상과 더 나은 상관 관계가있는 것처럼 보입니다. DFS는 합리적인 시스템 (즉, 체스 게임을하거나 미로로 나가는 것을 결정하는 사람이나 컴퓨터)의 선택 딜레마와 더 관련이 있습니다.

따라서 저에게 자연 현상이 실제 전파 모델 (이동)과 가장 일치하는 것의 차이점이 있습니다.


2
사이트에 오신 것을 환영합니다! 그러나 이것이 어떻게 질문에 대답하는지는 알 수 없습니다. BFS와 DFS에 대한 일반적인 느낌과 직관 인 것 같지만 질문은 느낌과 직관에 관한 것이 아니라 장점과 단점에 대한 것입니다. 당신의 대답은 전혀 그것을 다루지 않는 것 같습니다.
David Richerby

대부분의 질문에 링크 된 부분은, 등등 최소 스패닝 트리, 최단 경로를 찾기 위해, 어떤 자연 현상이 BFS로가 재생 될 것을 말 알고리즘을 적응에 관한 것입니다 동안 DFS에 의한 의사 결정 트리
user5193682

1
문제는 BFS 및 DFS와 관련이 있는지 묻지 않습니다. 스패닝 트리 나 최단 경로를 찾거나 "자연 현상을 재현하는"방법에 대해서는 묻지 않습니다.
David Richerby

장점을 요구합니다. 물리적 현상을 모델링 할 수 있지만 다른 현상을 모델링 할 수없는 경우이 현상을 모델링해야하는 경우 이점이 있습니다. 나는 단어 '장점'을 해석 할 때 내가 아니라고하면서, 알고리즘 교과서의 표준 개념을 고집 생각
user5193682
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.