그래프 검색과 트리 검색의 차이점은 무엇입니까?


답변:


178

기존 답변으로 볼 때이 개념에 대해 많은 혼란이있는 것 같습니다.

문제는 항상 그래프

트리 검색과 그래프 검색의 차이는 문제 그래프가 트리인지 일반 그래프인지에 근거하지 않습니다. 항상 일반적인 그래프를 다루고 있다고 가정합니다. 차이점은 그래프를 검색하는 데 사용되는 순회 패턴 ( 그래프 모양 또는 나무 모양 일 수 있음)에 있습니다.

나무 모양의 문제를 처리하는 경우 두 알고리즘 변형 모두 동일한 결과로 이어집니다. 따라서 더 간단한 트리 검색 변형을 선택할 수 있습니다.

그래프와 트리 검색의 차이점

기본 그래프 검색 알고리즘은 다음과 같습니다. 시작 노드 start, 방향 간선 successorsgoal루프 조건에 사용되는 사양. open현재 고려중인 메모리에있는 노드를 공개 목록 . 다음 의사 코드는 모든 측면에서 정확하지 않습니다 (2).

나무 검색

open <- []
next <- start

while next is not goal {
    add all successors of next to open
    next <- select one node from open
    remove next from open
}

return next

구현 방법에 따라 select from open깊이 우선 검색 (DFS) (최신 요소 선택), 폭 우선 검색 (BFS) (가장 오래된 요소 선택) 또는 균일 비용 검색 (가장 낮은 경로 비용으로 요소 선택)과 같은 다양한 검색 알고리즘 변형을 얻을 수 있습니다. ), 가장 낮은 비용과 경험적 가치를 가진 노드를 선택하여 인기있는 A-star 검색 등 .

위에서 언급 한 알고리즘을 실제로 트리 검색 이라고 합니다 . 시작 상태에서 루팅되는 경로가 여러 개있는 경우 기본 문제 그래프의 상태를 여러 번 방문합니다. 상태가 방향성 루프에 있으면 무한한 횟수로 상태를 방문하는 것도 가능합니다. 그러나 각 방문은 검색 알고리즘에 의해 생성 된 트리 의 다른 노드 에 해당합니다. 이 명백한 비 효율성은 나중에 설명하는 것처럼 때때로 원합니다.

그래프 검색

우리가 보았 듯이 트리 검색은 상태를 여러 번 방문 할 수 있습니다. 따라서이 상태 이후에 발견 된 "하위 트리"를 여러 번 탐색 할 것입니다. 비용이 많이들 수 있습니다. 그래프 검색은 닫힌 목록 에서 방문한 모든 상태를 추적하여이 문제를 해결 합니다 . 새로 찾은 후속 작업 next이 이미 알려진 경우 공개 목록에 삽입되지 않습니다.

open <- []
closed <- []
next <- start

while next is not goal {
    add next to closed
    add all successors of next to open, which are not in closed 
    remove next from open
    next <- select from open
}

return next

비교

그래프 검색은 모든 방문 상태를 추적하기 때문에 더 많은 메모리가 필요합니다. 이것은 더 작은 공개 목록으로 보상 될 수 있으며, 검색 효율성이 향상됩니다.

최적의 솔루션

일부 구현 방법은 select최적의 솔루션을 반환하도록 보장 할 수 있습니다. 즉, 최단 경로 또는 최소 비용 의 경로 (가장자리에 비용이 추가 된 그래프의 경우). 이것은 기본적으로 비용이 증가하는 순서로 노드가 확장 될 때마다 또는 비용이 0이 아닌 양의 상수 일 때 유지됩니다. 이러한 종류의 선택을 구현하는 일반적인 알고리즘은 균일 비용 검색 또는 단계 비용이 동일한 경우 BFS 또는 IDDFS 입니다. IDDFS는 BFS의 공격적인 메모리 소비를 방지하며 일반적으로 단계 크기가 일정 할 때 정보가없는 검색 (무차별 대입)에 권장됩니다.

ㅏ*

또한 (매우 인기있는) A * 트리 검색 알고리즘은 허용 가능한 휴리스틱 과 함께 사용할 때 최적의 솔루션을 제공합니다 . 그러나 A * 그래프 검색 알고리즘은 일관된 (또는 "단조") 휴리스틱 (허용 성보다 더 강력한 조건 ) 과 함께 사용할 때만이 보장을합니다 .

(2) 의사 코드의 결함

단순화를 위해 제시된 코드는 다음을 수행하지 않습니다.

  • 실패한 검색 처리, 즉 솔루션을 찾을 수있는 경우에만 작동합니다.

1
좋은 답변! 나무 모양의 문제가 의미하는 바에 대해 자세히 설명해 주 시겠습니까? 또한 완전한 순회가 아닌 목표에 도달하기 위해 알고리즘이 이동 한 경로를 저장하는 방법을 제안합니까?
Brian

1
@Brian 나무 모양의 문제는 검색중인 그래프가 나무라는 것을 의미합니다. 두 번째 질문은 문제에 따라 다릅니다. 한 가지 가능성은 가능한 경우 확장 된 각 노드와 함께 노드 경로를 저장하는 것입니다.
ziggystar 2013 년

5
노드가 아닌 트리 검색으로 '단일 상태'를 여러 번 방문 할 수 있다고 말하는 것이 더 형식적입니다. 검색 트리의 모든 노드는 상태 공간 그래프를 따라 단일 경로에 해당하고 트리 검색으로 최대 한 번 방문합니다. (이 반복 깊이 한계가 증가함에 따라 트리를 통과 검색을 심화에 대한 사실이 아니라 모든 반복에 해당하는 경우에 모든 노드가 한 번만 방문 긴하지만)
네이더 Ghanbari

1
@NaderhadjiGhanbari 여부 state또는 node의 꼭지점에 더 적합하다 기초 순회 그래프 달리 문맥에 따라, 문제 그래프. 그러나 state문제 그래프 정점과 node순회 그래프에 사용하면 답의 명확성을 확실히 향상시킬 수 있습니다. 곧 다시 써보도록하겠습니다. 감사합니다.
ziggystar 2013

요약 : 그래프 검색은 닫힌 데이터 구조를 사용하지만 트리 검색은 사용하지 않습니다.
shinzou

7

트리는 그래프의 특별한 경우이므로 일반 그래프에서 작동하는 모든 것이 트리에서 작동합니다. 트리는 각 노드 쌍 사이에 정확히 하나의 경로가있는 그래프입니다. 이것은 이전 답변에서 알 수 있듯이 어떤 순환도 포함하지 않지만 순환이없는 방향성 그래프 (DAG, 방향성 비순환 그래프)는 반드시 트리가 아니라는 것을 의미합니다.

그러나 그래프에 몇 가지 제한 사항이 있다는 것을 알고있는 경우 (예 : 트리 또는 DAG) 일반적으로 제한되지 않은 그래프보다 더 효율적인 검색 알고리즘을 찾을 수 있습니다. 예를 들어, A * 또는 휴리스틱이 아닌 "Dijkstra의 알고리즘"을 트리 (어쨌든 선택할 경로가 하나 뿐이며 DFS 또는 BFS에서 찾을 수 있음)에서 사용하는 것은 의미가 없습니다. DAG (토폴로지 정렬에서 얻은 순서대로 정점을 고려하여 최적의 경로를 찾을 수 있음)

방향성이 대 지시에 관해서는 무향 그래프는 관한 하나의 엣지 (링크 전환)이 있으면 규칙 "다음 즉 케이스의 특별한 경우이다 U브이 에서 에지도 존재 V .

업데이트 : 그래프 자체의 구조가 아닌 검색순회 패턴에 관심이 있다면 이것은 답이 아닙니다. 예를 들어 @ziggystar의 답변을 참조하십시오.


흠, 질문의 맥락은 나에게 완전히 명확하지 않지만 답변을 본 후 다시 살펴보면 @ziggystar, A * 및 AI에 대한 언급이 당신이 옳을 수 있음을 나타내는 느낌이 들며 내 대답은 맥락에서. 나는 "나무 찾기"를 "나무 찾기"로 해석했다. "나무 모양의 순회 패턴을 사용하여 일반 그래프를 검색"하지 않는 것이 귀하의 답변이 의미하는 바입니다.
njlarsson 2013 년

@njlarsson 내 대답에 당신의 표현을 포함했습니다. 명확하게하기에 좋습니다.
ziggystar 2013 년

답변에 이에 대한 메모를 추가했습니다. Rayhanur Rahman이 추구 한 바에 대한 맥락이 아닐지라도 Google 등을 통해 여기에 오는 많은 사람들에게 내 대답이 올바른 것이라고 생각합니다.
njlarsson

나는 많은 학생들이 검색 알고리즘을 공부하는 데 어려움을 겪는 것을 보았고 당신의 대답은 그들을 오도합니다.
Nader Ghanbari 2013

1
답은 검색 알고리즘에 관한 것이지만 포스터가 요청한 것이 아니라는 것은 사실입니다. 답변의 "업데이트"를 참조하십시오. 2014 년 3 월에 질문을 잘못 이해했음을 깨달았습니다. 답변을 삭제하지 않는 이유는 검색을 통해 여기에 온 사람에게 여전히 유용 할 수 있기 때문입니다.
njlarsson

3

그래프와 트리의 유일한 차이점은 순환 입니다. 그래프에는주기가 포함될 수 있지만 트리에는 포함될 수 없습니다. 따라서 트리에서 검색 알고리즘을 구현할 때는주기의 존재를 고려할 필요가 없지만 임의의 그래프로 작업 할 때는이를 고려해야합니다. 주기를 처리하지 않으면 알고리즘이 결국 무한 루프 또는 끝없는 재귀에 빠질 수 있습니다.

생각해야 할 또 다른 요점은 다루고있는 그래프의 방향 속성입니다. 대부분의 경우 각 가장자리에서 부모-자식 관계를 나타내는 트리를 다룹니다. DAG (방향성 비순환 그래프)도 유사한 특성을 보여줍니다. 그러나 양방향 그래프는 다릅니다. 양방향 그래프의 각 간선은 두 개의 이웃을 나타냅니다. 따라서 알고리즘 접근 방식은이 두 가지 유형의 그래프에 대해 약간 달라야합니다.


3
여기에 추가하기 위해 실제로 트리가있는 경우 A *에서 중복 감지를 수행 할 필요가 없습니다. 그래도 최종 경로를 추출하는 방법이 필요하므로 닫힌 목록이있을 수 있습니다.
Nathan S.

일반적으로 나무는 두 정점 사이에 최대 하나의 경로가있는 유 방향 그래프입니다. 즉, 그래프와 트리에는 방향 지정과 경로 고유성 이라는 두 가지 차이점이 있습니다. DAG에서 작동하는 알고리즘은주기를 확인할 필요가 없으며 트리에서 작동하는 알고리즘은 중복을 확인할 필요가 없습니다.
thiton

1
용어는 다양하지만 나무가 항상 지시되는 것은 아닙니다. A의 뿌리 하나 개의 노드가 루트로 지정된 경우 트리, 즉,이 묵시적 방향이지만, 나무 뿌리가 없습니다. 또한 일반 그래프는 방향성 또는 무 방향성 일 수 있습니다. 또한 두 정점 사이 에 최대 하나의 경로 만 요구하는 경우 forests 도 포함 합니다 . 트리는 일반적으로 연결된 그래프로 정의됩니다. 즉, 정확히 하나의 경로 가 있어야합니다 .
njlarsson

이 답변은 그래프 이론에서 나무와 그래프의 차이에 더 많이 있지만 실제로 다른 유형의 검색 알고리즘에서는 그렇지 않습니다.
mlibby

1

그래프 대 나무

  • 그래프에는주기가 있습니다.
  • 나무에는 순환이 없습니다. "예를 들어 머리에있는 나무를 상상해보십시오. 가지가 뿌리에 직접 연결되어 있지 않지만 가지가 위쪽으로 다른 가지와 연결되어 있습니다."

하지만 AI Graph-search vs Tree-search의 경우

그래프 검색에는 알고리즘이 새 노드를 탐색하고 방문한 것으로 표시 할 때마다 "사용 된 알고리즘에 관계없이"알고리즘이 일반적으로 현재 노드에서 도달 할 수있는 다른 모든 노드를 탐색하는 좋은 속성이 있습니다.

예를 들어 3 개의 정점 AB와 C가있는 다음 그래프를 고려하고 다음 모서리를 고려하십시오.

AB, BC, CA, C에서 A 로의 순환이 있습니다.

그리고 DFS가 A에서 시작하면 A는 새로운 상태 B를 생성하고 B는 새로운 상태 C를 생성하지만 C가 탐색되면 알고리즘은 새로운 상태 A를 생성하려고 시도하지만 A는 이미 방문되었으므로 무시됩니다. 멋있는!

하지만 나무는 어떻습니까? well trees 알고리즘은 방문한 노드를 방문한 것으로 표시하지 않지만 나무에는 순환이 없습니다. 어떻게 무한 루프에 빠질까요?

3 개의 정점이있는이 나무를 고려하고 다음 가장자리를 고려하십시오.

A-B-C는 A에 뿌리를두고 아래쪽을 향합니다. 그리고 DFS 알고리즘을 사용하고 있다고 가정 해 봅시다.

A는 새로운 상태 B를 생성하고, B는 두 개의 상태 A와 C를 생성합니다. 트리에는 "탐색 된 경우 방문한 노드 표시"가 없기 때문에 DFS 알고리즘이 A를 다시 탐색하여 새로운 상태 B를 생성하므로 우리는 무한 루프에 들어갑니다.

하지만 뭔가 알아 차리 셨나요? 우리는 방향이 지정되지 않은 가장자리에 대해 작업하고 있습니다. 즉 AB와 BA가 연결되어 있습니다. 물론 이것은주기가 아닙니다. 왜냐하면주기는 꼭지점이 3 이상이어야하고 첫 번째 노드와 마지막 노드를 제외한 모든 꼭지점이 구별된다는 것을 의미하기 때문입니다.

ST A-> B-> A-> B-> A 순환 특성> = 3을 위반하므로 순환이 아닙니다. 그러나 실제로 A-> B-> C-> A는 순환> = 3 개의 개별 노드입니다. 첫 번째 노드와 마지막 노드가 동일합니다.

다시 한 번 트리 가장자리 A-> B-> C-> B-> A를 고려하십시오. 물론 순환이 아닙니다. 두 개의 B가 있기 때문에 모든 노드가 구별되지는 않습니다.

마지막으로 동일한 노드를 두 번 탐색하지 않도록 트리 검색 알고리즘을 구현할 수 있습니다. 그러나 그것은 결과를 가져옵니다.


이 대답은 문제가 트리 또는 그래프 인 상황과 검색 알고리즘 자체가 검색 중에 트리 또는 그래프를 사용하는지 여부를 혼합하는 것처럼 보이기 때문에 혼란 스럽습니다.
mlibby

1

간단히 말해서, 트리에는주기가없고 그래프가 할 수있는 위치가 포함됩니다. 따라서 검색을 할 때 무한 루프에 들어 가지 않도록 그래프의 순환을 피해야합니다.

또 다른 측면은 트리가 일반적으로 일종의 토폴로지 정렬 또는 이진 검색 트리와 같은 속성을 가지므로 그래프에 비해 검색이 매우 빠르고 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.