strutture dati - ce.unipr.it · 1 strutture dati organizzazione sistematica dei dati e del loro...
TRANSCRIPT
1
Strutture dati
Organizzazione sistematica deidati e del loro accesso
Strutture datiTipi di dato astratti
(strutture dati dinamiche)q Strutture dati elementari
n Listen Stack (pile)n Code
q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)
q Grafi
Tipo di dato astratto
r Tipo di dato astratto o ADT (Abstract Data Type): insieme di oggetti e insieme di operazioni definite su di essorEs.: lista con operazioni di inserimento e
cancellazioner Attenzione: l’ADT specifica cosa fa ogni operazione,
non comer In Java:
o Rappresentazione con interfacciao Implementazione con classe
Strutture datiTipi di dato astratti
(strutture dati dinamiche)q Strutture dati elementari
n Listen Stack (pile)n Code
q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)
q Grafi
Tipo di dato Listan Insieme di elementi tra i quali è definito un
ordinamento totale.n Numerose variantin Ammette (almeno) le operazioni seguenti:
q cons(elem): inserisce elem in testa alla listaq cdr(): elimina l’ elemento in testa alla listaq car(): restituisce l’ elemento in testa alla lista senza
eliminarloq null(): verifica se la lista e’ vuota
n Nelle implementazioni (es. Java) sono spessopresenti altre operazioniq cons(elem, i), remove(i), get(i)
Listen si usa quando è necessario scandire un
insieme di oggetti in modo sequenzialen è vantaggiosa quando sono previste frequenti
operazioni di cancellazione o inserzionin lo svantaggio sta nel fatto che si può
accedere ad un elemento di posizione i solo dopo aver acceduto a tutti gli i-1 elementi precedenti
2
Implementazione delle liste
n Arrayq Si usa un array in memoria
n Strutture collegateq Ogni elemento contiene un riferimento al
successivo
Implementazione con array
r Occorre conoscere la dimensione max dellalista
r Può portare a spreco dimemoria
n Costo delle principalioperazioni:q cons: O(n) (caso
peggiore: elemento in prima posizione)
q cdr: O(n), (casopeggiore: primo elemento)
q car: O(1)
Inserimento in pos. 2
A0 A1 A2 AN-3AN-2AN-1 Elemento non usato
Implementazione con strutture collegate
n Efficienzaq cons, remove: O(i) (bisogna trovare la posizione
dell’elemento da inserire/rimuovere). O(1) per inserimenti/cancellazioni in prima posizione
q get: O(i) (posizione dell’elemento cercato)
A0 A1 Ai AN
Inserimento in pos. 1
Altri tipi di lista
n Lista doppia: consente una scansione in entrambe le direzioni
r Lista circolare: consente di rappresentare strutture in cui l’ordinamento è mod N
A0 A1 Ai AN
A0 A1 Ai AN
Strutture datiTipi di dato astratti
(strutture dati dinamiche)q Strutture dati elementarin Listen Stack (pile)n Code
q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)
q Grafi
Tipo astratto Pilan Lista nella quale inserimenti e cancellazioni avvengono solo
in testa (disciplina LIFO).
n Operazioni sempre presenti
q push(el): inserisce l'elemento specificato da el in cima alla
pila
q pop(): elimina l'elemento in cima alla pila
q top(): restituisce l'elemento in cima alla pila senza cancellarlo
dalla lista
q isEmpty(): verifica se la pila è vuota
n Altre operazioni
q clear(): elimina tutti gli elementi dalla pila
3
Implementazione del tipo Pila
r Realizzazione tramite Array
r Liste: realizzazione tramite lista concatenata
A0
A1
Ai top = i
A0 A1 Ai AN
top
Start
Strutture datiTipi di dato astratti
(strutture dati dinamiche)q Strutture dati elementari
n Listen Stack (pile)n Code
q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)
q Grafi
Tipo astratto codan Lista nella quale gli inserimenti avvengono in coda e le
cancellazioni (estrazioni) in testa (disciplina FIFO)n Operazioni sempre presenti
q isEmpty(): verifica se la coda è vuotaq enqueue(el): inserisce l'elemento specificato da el
alla fine della codaq dequeue(): elimina il primo elemento della codaq firstEl(): restituisce il primo elemento della coda
senza eliminarlo
n Altre operazioniq clear(): elimina tutti gli elementi dalla coda
Implementazione di code
A0 A1 A2 AN-3 AN-2 AN-1
testa coda
Elemento non usato
enqueue -> coda = coda + 1 (mod N)dequeue -> testa = testa + 1 (mod N)Se (coda == testa – 1 mod N) coda pienaSe (coda == testa) coda vuota (un solo elemento presente)
Con array
Con liste concatenate
Strutture datiTipi di dato astratti
(strutture dati dinamiche)q Strutture dati elementarin Listen Stack (pile)n Code
q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)
q Grafi
alberi
definizione, algoritmi di visita, alberi binari
4
Tipo di dato astratto albero
n insieme vuoto di nodi oppure costituito da una radice R e da 0 o più alberi (sottoalberi)
n la radice di ogni sottoalbero è collegata a R da un arco
T1 T2 Tn
R
es.: radice R con n sottoalberi
Terminologia
n genitore, figlio, fratelloq concetti intuitivi
n nodoq foglia se ha zero figliq interno se ha almeno un figlio
radice
foglia
nodo interno
Terminologia
n livello di un nodoq lunghezza (n.ro nodi)
percorso radice-nodo
n ramoq percorso radice-foglia
n altezza alberoq lunghezza (n.ro nodi) ramo
più lungoaltezza = 3
livello radice = 1
Esempi di alberi
n alberi genealogicin gerarchie di ereditarietà
q ad es., in Javan classificazioni di specie animalin organizzazione del territorio
q continente, nazione, regione, provincia eccn (alcuni) organigrammin file systemn domini Internet
Rappresentazione di alberi con liste collegate
R
A B
C
Elemento
Riferimento al primo figlio
Riferimento al prossimo fratello
Primo figliodi R
Fratello di A
livello di C = 3
Operazioni sugli alberi
n operazioni più importantiq element(v): restituisce l’elemento memorizzato nel
nodo vq root(): restituisce la radice dell’alberoq parent(v): restituisce il genitore del nodo vq children(v): restituisce i figli di vq isLeaf(v): restituisce true se v è una fogliaq isRoot(v): restituisce true se v è la radice
5
Operazioni sugli alberin Altre operazioni
q livello di un nodoq altezza dell’alberoq # nodiq # foglieq max # di figli di un nodo dell’alberoq isEmptyn true se l’albero ha zero nodi
Algoritmi su alberi
n visita (o attraversamento) di un alberoq in profondità (depth-first search, a scandaglio):
DFSn vengono visitati i rami, uno dopo l’altro
q in ampiezza (breadth-first search, a ventaglio): BFSn a livelli, partendo dalla radice
visite in profondità/preordinen in preordine (preorder, o ordine anticipato)
q dato un nodo vn visita vn visita i sotto-alberi aventi come radice i figli di v, da sinistra verso
destran in ordine simmetrico (inorder)
q dato un nodo v con k sotto-alberin visita il primo sotto-albero (radice v.firstChild)n visita vn visita gli altri k-1 sotto-alberi
n in postordine (postorder, o ordine posticipato)q dato un nodo vn visita i sotto-alberi aventi come radice i figli di v, da sinistra verso
destran visita v
Visite in profondità
7
1 3 6
2 4 5
2
1 4 6
3 5 7
1
2 3 5
4 6 7
preordine inordine postordine
visita in ampiezza (usa una coda)
1
2 3 4
5 6 7
BFS
Alberi binari
n un albero si dice binario se ogni nodo può avere al più 2 figliq la rappresentazione si semplifica
n strutture dati per alberi binariq vettori q rappresentazioni collegate
6
uso di vettorin ogni nodo v è memorizzato in posizione p(v)
q se v è la radice allora p(v)=1 (indice 0 in Java, C, C++)q se v è il figlio sinistro di u allora p(v)=2p(u)q se v è il figlio destro di u allora
p(v)=2p(u)+1
1
2
6 7
3
4
1234-67-
Alberi binari di ricerca (BST)
nBinary Search Tree
Dizionarin Tipo di dato astratto che supporta le seguenti
operazioni:q searchq insertq delete (remove)
n le liste possono essere usate come dizionariq le tre operazioni hanno costo lineare (sia nel worst case
sia in quello average)q in molti casi un costo lineare è giudicato inaccettabile
q strutture più efficienti?n alberi di ricerca bilanciatin tavole hash
Albero binario di ricercaalbero binario che soddisfa la seguente proprietà
Ø per ogni nodo, tutte le chiavi nel suo sottoalbero sinistro sono ≤ della chiave v associata al nodo e tutti le chiavi nel suo sottoalbero destro sono ≥ di v
n utilizzabile quando le chiavi appartengono a un universo totalmente ordinato
n Una visita simmetrica (inorder) dell’albero da’ le chiavi dell’albero in modo non descrescente
n ipotesi semplificativa di lavoro: chiavi strettamente minori nei sottoalberi sinistri e strettamente maggiori nei sotto alberi destri
albero binario di ricerca
49
91
57
8222
17
20
88
94
49
91
47
8222
17
20
88
94errato!ok
Costi delle operazioni nei BST: ricerca di un elemento
search(tree T, int x) { v = root(T)while (v != null) {
if (x == key(v)) return v; else if (x < key(v)) v = left child (v);
else v = right child (v); }return null;
}
ricorda la ricerca binaria!
7
costo della ricerca in un BSTBST di n nodin caso peggiore
q O(n)n caso medio
q dipende dalla distribuzionen caso migliore
q O(1) (poco interessante)n nel caso di distribuzione uniforme delle chiavi il
valore atteso dell'altezza dell'albero è O(log n)
Ø istanze problematiche: alberi molto profondi e sbilanciati...
49
52
56
67
77
83
54
75
21
Costi delle operazioni nei BST
n costo dell'inserimento in un BSTq ogni inserimento introduce una nuova fogliaq il costo è (proporzionale a) la lunghezza del ramo
radice-fogliaq nel caso peggiore O(n )
Ø istanze problematiche nei BST : alberi molto profondi e sbilanciati...
Alberi bilanciati
nil costo delle varie operazioni su BST è O(h),dove h = altezza dell’alberonpuò essere O(n) worst case!!!nse l’albero fosse bilanciato…nma poi dobbiamo mantenerlo tale quando inseriamo o cancelliamo elementi!
Introduzione al bilanciamento
n nozione intuitiva di bilanciamentoq tutti i rami di un albero hanno
approssimativamente la stessa lunghezzaq ciascun nodo interno ha “molti” figli
n caso ideale per un albero k-arioq ciascun nodo ha 0 o k figliq la lunghezza di due rami qualsiasi differisce di al
più una unità
Bilanciamento perfetto
n un albero binario perfettamente bilanciato di n nodi ha altezza
3421 63
6 18 28 32
16 30
37 52
43 72 1lg2 +n
se ogni nodo ha 0 o 2 figlile foglie sono circa il 50% dei nodi (interni +foglie)
bilanciamento perfetto
n Il caso binario e’ facilmente generalizzabile ad alberi di parità k
q
n costo di ricerca/inserimento/eliminazione O(log n)n ripetuti inserimenti/eliminazioni possono distruggere
il bilanciamento
q degrado delle prestazioni
knknnkn 1)1( 1)1( fif
+−=⇒+−=
8
bilanciamento in altezza
n un albero è bilanciato in altezza se le altezze dei sottoalberi sinistro e destro di ogni nododifferiscono di al più un’unità
n gli alberi bilanciati in altezza sono detti alberi AVLq da Adel’son-Vel’skii & Landis, primi proponenti
n Alberi di fibonacciq alberi AVL col minimo numero di nodi (fissata
l’altezza)
Fattore di bilanciamento
n un albero AVL è quindi un albero binario di ricerca in cui ad ogni nodo v viene associato un valore detto fattore di bilanciamento che corrisponde alla differenza tra la profondita’del sottoalbero sinistro e quello del sottoalbero destro di v
n Il fattore di bilanciamento puo’ assumere solo I valori -1,0, 1
fattore di bilanciamento
3421 63
6 18 28
16 30
37 52
43 72
3 29 57
7832
0
-1
+1
fattore di bilanciamento (FDB):altezza sottoalbero dx –altezza sottoalbero sx
in un albero bilanciato in altezza |FDB| ≤ 1, per ogni nodo
28
Bilanciamento
n Mantenere la proprieta’ di bilanciamentodurante inseriementi e cancellazionigarantisce che l’operazione di ricerca abbiasempre costo logaritmico e quindi sia moltoefficiente
inserimento in AVL
1. inserire nuovo nodo come in un BST il nuovo nodo diviene una foglia
2. ricalcolare i fattori di bilanciamento che sono mutati in seguito all’inserimento
solo nel ramo interessato all’inserimento (gli altri fattori non possono mutare), dal basso verso l’alto
3. se nel ramo appare un fattore di bilanciamento pari a ±2 occorre ribilanciare
tramite “rotazioni”
Rotazioni
n L’idea alla base delle rotazioni e’ quella diportare l’elemento centrale alla radicedell’albero e di far discendere l’elemento checausa lo sbilanciamento
9
rotazione
verso sinistra o verso destra
a
b
T1 T2
T3
a
b
T1
T2 T3
verso destra
verso sinistra
la proprietà di ricerca è mantenuta
rotazioni negli AVL
casi possibiliq DD: inserimento nel sottoalbero destro di un figlio
destro (del nodo che si sbilancia)q SD: inserimento nel sottoalbero sinistro di un figlio
destro (del nodo che si sbilancia)q DS: inserimento nel sottoalbero destro di un figlio
sinistro (del nodo che si sbilancia)q SS: inserimento nel sottoalbero sinistro di un figlio
sinistro (del nodo che si sbilancia)
rotazione semplice (caso DD)
n gli antenati di P non sono interessati all’inserimento perché in seguito alla rotazione recuperano il loro fattore di bilanciamento precedente
Costo delle operazioni in AVL
n Si dimostra che le rotazioni che si devonoeseguire in seguito ad inseriemnti e/ocancellazioni non alterano il costo di questeoperazioni che e’ sempre uguale ad O(logn) come per la ricerca di un elemento.
Heap e code di priorita’
Coda con prioritàn Una coda con priorità è una struttura dati
dinamica che permette di gestire una collezione di dati con chiave numerica.
n Una coda con priorità offre le operazioni diq inserimento: di un elemento nell’insiemeq massimo: restituisce l’elemento con chiave più
grandeq cancellazione-massimo: restituisce l’elemento
con chiave più grande e lo rimuove dalla collezione
10
Applicazioni della Coda con Prioritàn Le Code con priorità sono strutture dati molto
comuni in informatica.n Es:
q Gestione di processi: ad ogni processo viene associata una priorità. Una coda con priorità permette di conoscere in ogni istante il processo con priorità maggiore. In qualsiasi momento i processi possono essere eliminati dalla coda o nuovi processi con priorità arbitraria possono essere inseriti nella coda.
n Per implementare una coda con priorità utilizzeremo una struttura dati chiamata heap
heap
n heap = catastan condizione di heap
1. albero binario perfettamente bilanciato2. ogni nodo contiene una chiave maggiore o eguale di
quelle presenti negli eventuali figli
n non memorizza un ordinamento totale q le visite in ampiezza e in pre- in- post-ordine non
forniscono un ordinamento delle chiavi
Heapn Si implementa l’albero tramite un vettore
q Uno heap A ha un attributo heap-size[A] che specifica il numero di elementi contenuto nello heap
q nessun elemento in A[1,length[A]] dopo heap-size[A] è un elemento valido dello heap
q La radice dell’albero è A[1]q L’indice del padre di un nodo di posizione i è i/2q L’indice del figlio sinistro di un nodo i è 2 iq L’indice del figlio destro di un nodo i è 2 i +1q Implemenatzione particolarmente efficiente
n Tempo di ricerca/ordinamenyto in struttura di heap = O(logn)
n Liste collegate
maggio 2002
rappresentazione tramite arrayn ogni nodo v è memorizzato in posizione
p(v)q se v è la radice allora p(v)=0 q se v è il figlio sinistro di u allora p(v)=2p(u)+1q se v è il figlio destro di u allora
p(v)=2p(u)+2
67 68
89
431
66 65
21 5
66 67
4 64
6566671432154
66686789
64
4567891011
3210
12
Coda con priorità con heapn Risulta semplice implementare le varie operazioni di
una coda con priorità utilizzando uno heapq Extract Max: basta restituire la radice dello heapq Heap Extract Max: dopo la restituzione dell’elemento
massimo, posiziona l’ultimo elemento dello heap nella radice ed ripristina la proprietà di ordinamento parziale
q Heap Insert: la procedura inserisce il nuovo elemento come elemento successivo all’ultimo e lo fa salire fino alla posizione giusta facendo “scendere” tutti padri
B-alberi
dizionari in memoria secondaria
11
B-Alberin I B-Alberi sono una generalizzazione degli
alberi binari di ricercan la principale differenza è che nei B-Alberi
ogni nodo dell’albero può contenere n>2 chiavi
n i B-Alberi sono utilizzati per garantire l’efficienza delle operazioni su insiemi dinamici (ricerca, inserzione e cancellazione) di dati memorizzati su supporti secondari (dischi)
B-Alberin In ogni istante è possibile mantenere in memoria
primaria solo un numero limitato di pagine della memoria secondaria
n le operazioni eseguite sui B-Alberi garantiscono di poter essere eseguite conservando solo un numero costante di pagine in memoria principale (tante più pagine tanto più efficienti saranno le varie operazioni)
n in genere un nodo di un B-Albero e’ tanto grande quanto una pagina di memoria secondaria
Visualizzazione
M
D H Q T X
B C F G J K L N P R S V W Y Z
Esempio n=3127 496
14 83 221 352
128 145 189 222 245 320
521 690
353 354 487
n Notare che le foglie sono ordinate per chiave, da sinistraa destra
B-albero: esempio
Ki Pi Ki+1K1 P1 Kn-1 Pn. . . . . .
K i P i K i+1K 1 P 1 K n-1 P n. . . . . .
n Ogni nodo e' un sequence di coppie [puntatore, chiave]n K1 < K2 < … < Kn-2 < Kn- 1
n P1 punta a un nodo contenente chiavi < K1
n Pi punta a un nodo contenente chiavi in intervallo [Ki-1, Ki)n Pn punta a un nodo contenente chiavi > Kn-1
n Dunque, K ´1 < K ´2 < … < K ´n-2 < K ´n- 1
Inserzionen Per inserire la chiave v, si cerca la foglia dove v
dovrebbe trovarsi: se c’e’ spazio, si inseriscen Se no, si spezza la foglia in due, e si modifica il padre
per prevedere i puntatori alle due foglie
19 --
12 14 17X
15 19
12 14
X15 17
Per inserire la chiave 15• si spezza la foglia• nel padre, [0, 19)diventa [0, 15) e [15, 19)• se il padre e’ pieno, bisognaspezzarlo (in modo simile)• l’albero resta automaticamentebilanciato
12
Ricercan E’ un operazione simile alla ricerca sugli
alberi binari di ricercan Con la differenza è che non ci sono solo due
vie possibili ad ogni nodo
Grafi
Grafi
n Grafo diretto o orientatoq Insieme N di elementi detti nodi e insieme di archi.
Un arco e’ una coppia ordinata (v,e) di nodi.
n Grafo non oreintatoq Insieme N di elementi detti nodi e insieme di archi.
Un arco e’ una coppia non ordinata (v,e) di nodi.
Grafin I grafi sono strutture dati molto diffuse in informatican Vengono utilizzati per rappresentare reti e
organizzazioni dati complesse e articolaten Per elaborare i grafi in genere è necessario visitarne
in modo ordinato i verticin Vedremo a questo proposito due modi fondamentali
di visita: per ampiezza e per profonditàn Il tempo di esecuzione di un algoritmo su un grafo
G=(V,E) viene dato in funzione del numero di vertici V e del numero di archi E
Grafi
n Se due nodi V1 e V2 sono collegati da un arco si dice che V1 e’ adiacente a V2
n Cammino di un grafo: la sequenza di nodi V1, V2,.. Vn tali che le coppie (V1,V2) ,(V2,V3),.. (Vn-1, Vn) sono adiacenti
n Lunghezza di un cammino: numeor di archipercorsi (o nuemro di nodi -1)
Rappresentazione di un grafon Vi sono due modi per rappresentare un grafo:
q collezione di liste di adiacenzaq matrice di adiacenza
n si preferisce la rappresentazione tramite liste di adiacenza quando il grafo è sparso, cioè con E molto minore di V2
n si preferisce la rappresentazione tramite matrice di adiacenza quando, al contrario, il grafo è denso o quando occorre alta efficienza nel rilevare se vi è un arco fra due vertici dati
13
Liste di adiacenzan Si rappresenta un grafo G=(V,E) con un
vettore Adj di liste, una lista per ogni vertice del grafo
n per ogni vertice u, Adj[u] contiene tutti i vertici v adiacenti a u, ovvero quei vertici v tali per cui esiste un arco (u,v)∈E
n in particolare questo insieme di vertici è memorizzato come una lista
n l’ordine dei vertici nella lista è arbitrario
Rappresentazioni di grafi. Un grafo (a) rappresentato con una lista di adiacenze (b-c),
Matrici di adiacenza
n Per la rappresentazione con matrici di adiacenza si assume che i vertici siano numerati in sequenza da 1 a V
n Si rappresenta un grafo G=(V,E) con una matrice A=(ai j) di dimensione VxV tale che:aij=1 se (i,j) ∈ Eaij=0 altrimenti Rappresentazioni di grafi. Un grafo (a) rappresentato come una matrice
di adiacenze (d)
Grafi pesati
n In alcuni problemi si vuole poter associare una informazione (chiamata peso) ad ogni arco
n un grafo con archi con peso si dice grafo pesato
n si dice che esiste una funzione peso che associa ad un arco un valore
w : E → R
n ovvero un arco (u,v) ha peso w(u,v)
Visita di un Grafo
n Obiettivo: visitare una sola volta tutti i nodi del grafo.
q Es.: visitare un porzione del grafo del Webn Difficoltà: q Presenza di cicliq Presenza di nodi isolati
14
Visita in profondità - DFS
n La visita procede da tutti gli archi uscenti da un nodo.
n Se tutti i nodi adiacenti sono stati visitati allora si torna al nodo “predecessore”.
n Una volta tornati al nodo di partenza si prosegue da un nodo qualsiasi non visitato.
n I nodi vengono rinumerati secondo l’ordine di visita.
Implementazione della DFS
n I nodi sono inizialmente marcati con 0, i=0.n Assumi la visita sia arrivata ad un nodo v.n La visita prosegue da un nodo u adiacente a v se
marcato 0.n Se nessun nodo adiacente marcato 0 è disponibile
torna al nodo da cui si è raggiunto v oppure termina se v è il nodo iniziale.
n Ogni volta che un nodo mai visitato è raggiunto, questo viene marcato con i++
Visita in profondità - DFSn visita_profondità(G)q 1. Passo base
se G = Ø f=> esci;q 2. Passo di induzione
visita il nodo G se non è stato visitatoper ogni nodo adiacente G->adj
visita_profondità(G->adj);
n Osservazione: la visita in profondità è strettamente legata alla politica di gestione di uno stack (come tutti gli algoritmiricorsivi);
Implementazione della DFS
n L’implementazione iterativa usa una pila per memorizzare gli archi uscenti da un nodo visitato.
n Ad ogni passo si estrae l’arco (v,u) sulla cima della pila.
n La visita prosegue dal nodo adiacente u se marcato 0.
Esempio di applicazione dell’algoritmo depthFirstSearchad un grafo L’algoritmo depthFirstSearch applicato ad un grafo orientato
15
Visita in profondità (C)
void visita_profondita(struct nodo_grafo*nodo){if (nodo == NULL) return;if (nodo->flag == 0){printf ("%s\n", nodo->info);nodo->flag = 1;adj = nodo->l_adj;while(adj != NULL){visita_profondita(adj->p_adj);adj = adj->next;}}return;}
Visita in ampiezza - BFS
n uso di una coda per memorizzare tutti gli archi incidenti nel nodo visitato
n I nodi vengono marcati.n La visita quindi procede dall’arco (v,u) in
testa alla coda.
Visita in ampiezza - BFSn visita_ampiezza(G)
per ogni nodo non visitato:q si inserisce il nodo in una coda;q si estrae dalla coda un nodo e si visita;q si inseriscono in coda tutti gli elementi adiacenti al
nodo corrente.
n Osservazione: la visita in ampiezza è strettamente legata alla politica di gestione di una coda;
Un esempio di applicazione dell’algoritmo breadthFirstSearchad un grafo
Applicazione dell’algoritmo breadthFirstSearch ad un grafo orientato
Visita in ampiezza (C)void visita_ampiezza(struct nodo_grafo*nodo){struct punt_adj *adj;static struct p_coda *first_el;coda_ins(nodo);while(first_el != NULL) //finché ci sono elementi nella coda{nodo = coda_extr(); //Estrazione dalla coda di un nodoprintf("nodo->info %c\n", nodo->info); //Visita del nodonodo->flag = 1;adj = nodo->l_adj;while(adj != NULL) //Inserimento in coda dei nodi adiacenti{if (adj->nodo_adj->flag == 0)coda_ins(adj->p_adj);adj = adj->next;} } }