Ricevi DFS se cambi la coda in uno stack in un'implementazione BFS?


35

Ecco lo pseudocodice standard per la prima ricerca della larghezza:

{ 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

Qui pushe popsi presume che siano operazioni in coda. E se fossero operazioni in pila? L'algoritmo risultante visita i vertici nel primo ordine di profondità?


Se hai votato per il commento "questo è banale", ti chiederei di spiegare perché è banale. Trovo il problema abbastanza complicato.


5
Ho visto gli studenti lottare con questo, quindi non penso che sia strettamente troppo semplice. Tuttavia, cosa può contenere una risposta oltre a "Sì" o "No"? La granularità desiderata non è chiara dalla domanda.
Raffaello

2
"Sì" verrebbe con una discussione convincente; "no" verrebbe con un controesempio. Ma ci sono le risposte migliori di sì / no una volta capito cosa sta succedendo ...
rgrig


3
È possibile scrivere pseudo-codice in modo che semplicemente cambiando popin uno stack o un'operazione in coda, si ottengano dfs o bfs. È anche facile scrivere pseudo-codice per cui a prima vista sembra vero, ma non lo è. ics.uci.edu//~eppstein/161/960215.html è un riferimento pertinente.
Joe

Risposte:


23

No, questo non è lo stesso di un DFS.

Considera il grafico

inserisci qui la descrizione dell'immagine

Se si spingono i nodi nell'ordine da destra a sinistra, l'algoritmo fornisce una traversata:

A,B,E,C,D

mentre un DFS si aspetterebbe che lo fosse

A,B,E,D,C

Il problema si verifica perché lo contrassegni come visto al momento della spinta, piuttosto che al momento della visita. Come sottolineato nei commenti, se si contrassegna al momento della visita, i requisiti di spazio potrebbero salire a anziché .Θ(V+E)O(V)

Sono d'accordo, il problema non è banale.


5
Ciò presuppone che gli elenchi di adiacenza abbiano un ordine specifico fisso. Almeno in matematica, uno li vede come un insieme e un grafico ha più attraversamenti di ordine di profondità, a seconda di come ti capita di iterare i bambini. (Immagina di usare gli hash per i bambini.) In questo senso, ABECD è ancora un ordine di profondità. L'interrogante si chiede se esiste un contro-esempio anche in questa impostazione. (In effetti, questo è dove comincia a diventare difficile.)
rgrig

3
@rgrig: Bene, questo è uno dei possibili attraversamenti e questo porta a una sequenza che non è in DFS. Indipendentemente da come esegui l'iterazione, contrassegnando come visto, il DFS "sotto" apparirà errato, se non visiti primo. DED
Aryabhata,

1
@Arybhata: Oh, scusa, non so perché stavo assumendo che tu intendessi direzionare i bordi e puntare verso il basso. Sono indiretti, quindi hai ragione: questo è un controesempio anche per quello che stavo dicendo nel commento. (Questo è strano: ho dovuto scrivere male il tuo handle, quindi non viene rimosso da SE.)
rgrig
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.