BFS
BFS
Cos’è
La classica visita in ampiezza (o per livello).
- SI parte da un vertice
- Scopri i vicini
- Prosegui la visita nei vertici scoperti
GOES WIDE ⇒ VA A LIVELLI
Possibili utilizzi
Permette di trovare:
- se un path esiste tra due nodi
- cammini minimi
- componenti connesse
- alberi di visita
Concetti fondamentali
Utilizza una CODA → FIFO Funziona in O(|V| + |E|) e in spazio O(|V|)
Funzionamento
La logica è:
- aggiungo alla coda il nodo iniziale
- mentre la coda non è vuota, prendo il primo nodo dalla coda
- se l’array dei nodi visitati non contiene il nodo preso poco fa, allora lo aggiungiamo alla lista dei nodi visitati
- per ogni nodo collegato al nodo di prima, se il nodo collegato non è già nella vista dei visitati mettilo in coda ⇒ torna al punto 2
- alla fine, nell’array dei visitati, avrò la mia visita in ampiezza
Implementazione
'''
Implement a BFS
'''
def BFS(seen, queue):
while(len(queue) != 0):
node_to_analyze = queue[-1]
queue.remove(node_to_analyze)
if node_to_analyze not in seen:
seen.append(node_to_analyze)
if node_to_analyze.left != None and node_to_analyze.left not in seen:
queue.insert(0, node_to_analyze.left)
if node_to_analyze.right != None and node_to_analyze.right not in seen:
queue.insert(0, node_to_analyze.right)
'''
MAIN
'''
class Node:
def __init__(self, key):
self.value = key
self.left = None
self.right = None
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
print("visita per livello:")
seen = []
queue = []
queue.append(root)
BFS(seen, queue)
for s in seen:
print(s.value)