BFS 구현에서 큐를 스택으로 변경하면 DFS를 얻습니까?


35

광범위한 첫 번째 검색을위한 표준 의사 코드는 다음과 같습니다.

{ seen(x) is false for all x at this point }
push(q, x0)
seen(x0) := true
while (!empty(q))
  x := pop(q)
  visit(x)
  for each y reachable from x by one edge
    if not seen(y)
      push(q, y)
      seen(y) := true

다음 pushpop큐 동작으로 간주된다. 그러나 스택 작업 인 경우 어떻게해야합니까? 결과 알고리즘은 깊이 우선 순서로 정점을 방문합니까?


"이것은 사소하다"라는 의견에 투표했다면 왜 사소한 지 설명해달라고 부탁합니다. 문제가 상당히 까다 롭습니다.


5
나는 학생들이 이것으로 어려움을 겪는 것을 보았으므로 그것이 너무 간단하다고 생각하지 않습니다. 그러나 대답에 "예"또는 "아니오"이외의 것은 무엇입니까? 원하는 세분성은 질문에서 명확하지 않습니다.
Raphael

2
"예"는 설득력있는 주장과 함께 올 것이다. "아니오"는 반례와 함께 올 것이다. 그러나 무슨 일이 일어나고 있는지 이해하면 예 / 아니오보다 더 나은 답변이 있습니다 ...
rgrig


3
의사 코드를 작성 pop하여 스택 또는 대기열 작업으로 간단히 변경함으로써 dfs 또는 bfs를 얻을 수 있습니다. 처음에는 이것이 사실 인 것처럼 보이지만 의사 코드를 작성하는 것도 쉽습니다. ics.uci.edu//~eppstein/161/960215.html 은 관련 참조입니다.
Joe

답변:


23

아니요, 이것은 DFS와 다릅니다.

그래프를 고려하십시오

여기에 이미지 설명을 입력하십시오

노드를 오른쪽에서 왼쪽으로 밀면 알고리즘이 순회를 제공합니다.

A,B,E,C,D

DFS는 그것을 기대할 것이지만

A,B,E,D,C

Θ(V+E)O(V)

나는 문제가 사소한 것이 아니라고 동의한다.


5
이는 인접 목록에 고정 된 특정 순서가 있다고 가정합니다. 수학에서는 최소한 하나를 세트로보고 그래프는 자식 반복 방법에 따라 여러 심도 순회를가집니다. (어린이들에게 해시를 사용한다고 상상해보십시오.) 그런 의미에서 ABECD는 여전히 깊이 우선 순위입니다. 질문자는이 설정에서도 반례가 있는지 궁금합니다. (실제로, 이것이 까다로워지기 시작하는 곳입니다.)
rgrig

3
DED

1
@Arybhata : 아, 죄송합니다. 왜 가장자리가 아래를 향하고 있다고 가정했는지 모르겠습니다. 그것들은 방향이 정해져 있지 않으므로 당신은 옳습니다 : 이것은 의견에서 말한 것에 대한 반례입니다. (이것은 이상합니다 : 핸들의 철자를 잘못
써서
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.