LaboratoriodiProgrammazioneII CorsodiLaureainBioinformatica...
Transcript of LaboratoriodiProgrammazioneII CorsodiLaureainBioinformatica...
Grafi e GrafiDirettiAciclici
Grafi e Grafi Diretti AcicliciLaboratorio di Programmazione IICorso di Laurea in Bioinformatica
Dipartimento di Informatica - Università di Verona
Grafi e GrafiDirettiAciclici
Sommario
Grafi ed implementazione in JavaVisita di un grafoGrafi Diretti Aciclici
Grafi e GrafiDirettiAciclici
Grafi
Grafi e GrafiDirettiAciclici
Grafi
Concetti di baseStruttura dati per rappresentare relazioni binarie
reti di trasportoreti stradaligrafo webrelazioni tra classi nei linguaggi OO
Grafi e GrafiDirettiAciclici
Terminologia
DefinizioniG (V ,E ) V insieme di vertici, E insiemi di archiArco: < vi , vj > |vi , vj ∈ VCammino (di lunghezza k):< v1, v2, · · · , vk > |∀i = 1, · · · , k − 1 < vi , vi+1 >∈ ECircuito: cammino con v1 = vk
Ciclo: Circuito con vi 6= vj , 1 < i , j < k ,i 6= jGrafo pesato: valore reale wi ,j associato ad ogni arco< vi , vj >
Grafi e GrafiDirettiAciclici
Rappresentazioni
Rappresentare grafiListe di adiacenza:
ad ogni vertice e’ associata la lista dei vertici adiacentiMatrice di adiacenza:
matrice |V | × |V |aij = 1 se < vi , vj >∈ E , aij = 0 altrimenti
Grafi e GrafiDirettiAciclici
Esempio: lista adiacenze
Esempio: lista adiacenze
A
B
C
D
E
F
A
B
C D
B DC
DB EC F
D
D
C
A
B
D
E F
A
B
C D
B D
B C E F
D
D
A
B
E
F
Grafi e GrafiDirettiAciclici
Esempio: matrice adiacenza
Esempio: matrice adiacenza
C
A
B
D
E F
A B C D E FA 0 1 0 0 0 0B 1 0 1 1 0 0C 0 1 0 1 0 0D 0 1 1 0 1 1E 0 0 0 1 0 0F 0 0 0 1 0 0
Grafi e GrafiDirettiAciclici
Caratteristiche
Vantaggi e svantaggi delle reppresentazioni
Liste di adiacenza (Memoria O(|E|)):Vantaggi: posso scorrere i nodi adiacenti a v inO(grado(v))Svantaggi: inserimento e cancellazione O(grado(v))
Matrice di adiacenza: (Memoria O(|V |2))Vantaggi: inserimento e cancellazione O(1)Svantaggi: posso scorrere i nodi adiacenti a v in O(|V|)
Grafi e GrafiDirettiAciclici
Implementazione in Java
Implementazione in javaUtilizziamo una rappresentazione basata su liste diadiacenzaLa lista di nodi e’ realizzata con una HashMap
non voglio avere nodi replicatiinserimento e cancellazione dei nodi sono efficienti
La lista di nodi successori viene rappresentata come uninsieme di archi
Insieme: un solo arco tra ciascuna coppia di nodiArco: piu’ efficiente per algoritmi che operano sull’insiemedegli archi
Vedere classi Grafo.java e Arco.java
Grafi e GrafiDirettiAciclici
Visite
Grafi e GrafiDirettiAciclici
Vistare il grafo
Visitare il grafoObiettivo: visitare una sola volta tutti i nodi del grafoDifficolta’:
1 Cicli: marcare i nodi visitati2 nodi isolati: visita termina quando tutte le componenti del
grafo sono state visitate
Grafi e GrafiDirettiAciclici
Visita in profondita’
Visita in Profondita’: DFSTipicamente ricorsivoDato un nodo, visita uno qualsiasi dei nodi adiacenti nonancora visitatiSe tutti i nodi adiacenti sono stati visitati, ritornare alpredecessoreI nodi possono essere enumerati secondo l’ordine di visita
Grafi e GrafiDirettiAciclici
Esempio: DFS
Esempio DFS
C
A
B
D
E F
H
K1
2
3 4
5
6
7
8
Grafi e GrafiDirettiAciclici
DFS
Visita in Profondita’: DFSInizializzare tutti i nodi come non visitatiFino a che esiste un nodo v non visitato
eseguire DFS(v)
DFS(v): vista il nodo e lo marca come visitatoper ciascun nodo v adiacente non visitato
eseguire DFS(v)
Grafi e GrafiDirettiAciclici
DFS: discussione
Visita in Profondita’: discussioneMarcatura: varie opzioni:Mantenere una Map di nodi e interi
inizializzo la map con tutti i nodi e valore pari a zeroun nodo con valore maggiore di zero e’ visitato
Un insieme di nodi non visitatiinizializzo il vettore con tutti i nodiquando visito un nodo lo rimuovo dal vettore
Creare un oggetto nodo che contiene un campo visitato edaggiornarlo di conseguenza
Grafi e GrafiDirettiAciclici
Visitare in ampiezza
BFSTipicamente iterativo: usa una coda di appoggiometti in coda il nodo inizialeFino a che la coda non e’ vuota:
estrai il primo nodo e visitalometti in coda tutti i nodi adiacenti non visitati
quando la coda e’ vuota controllare se ci sono altri nodinon visitati se si metterli in coda e continuare.
Grafi e GrafiDirettiAciclici
Esempio: BFS
Esempio BFS
�������������������������������������������������������������������������������������������
�������������������������������������������������������������������������������������������
������������������������������������������������������������������������
������������������������������������������������������������������������
������������������������������������������������������������������������������������
������������������������������������������������������������������������������������
C
A
B
D
E F
H
K1
2
7
8
3
4
5 6
Grafi e GrafiDirettiAciclici
Esercizi
EserciziImplementare il metodo dfs(...) della classe Visite.javaImplementare il metodo visitaBFS() della classe Visite.java
Grafi e GrafiDirettiAciclici
Grafi Diretti Aciclici (DAG)
Grafi e GrafiDirettiAciclici
Grafi Diretti Aciclici (DAG)
Concetti di baseGrafo Diretto: archi sono coppie ordinate di nodi
< u, v > 6=< v , u >
Grafo diretto aciclico: grafo diretto senza ciclinon esiste nessun cammino < v1, v2, · · · , vk > tale chev1 = vkpossono esistere diversi cammini da v1 a vk
Grafi e GrafiDirettiAciclici
DAG: Esempio
Example (DAG)
CB
D
E F
CB
D
E F
Grafi e GrafiDirettiAciclici
Ordinamento parziale e DAG
Ordinamento parzialeDato un insieme A, ordinamento parziale: relazione diordine transitiva parziale sugli elementi di Aparziale: possono esistere coppie di elementi per cui non e’definito alcun ordineUn DAG rappresenta un ordinamento parziale:
Vertici: elementi di AArcho < u, v > se u < v secondo l’ordine parziale
Esempio: sviluppo di moduli per un progetto softwareCiclo nel grafo → il grafo non puo’ rappresentare un ordineparziale
Grafi e GrafiDirettiAciclici
Ordinamento Topologico di un DAG
Ordinamento TopologicoOrdinamento lineare dei veritci tale che:
per ogni arco < u, v > u precede v nell’ordinamento
ad ogni vertice u associamo un intero p(u) tale che seesiste l’arco < u, v > allor p(u) < p(v)di conseguenza se esiste un cammino da u a w allora p(u)< p(w): ogni nodo e’ seguito nell’ordine dai suoi successorie’ sempre possibile trovare un ordinamento topologico perun DAGl’ordinamento topologico non e’ univoco
Grafi e GrafiDirettiAciclici
Ordinamenti Topologici: Esempio
Example (ordinamenti topologici validi)
BD FE C
D B C FE
Grafi e GrafiDirettiAciclici
Ordinamenti Topologici: Esempio II
Example (ordinamento topologico non valido)
D F BE
C
Grafi e GrafiDirettiAciclici
Ordinamento Topologico e DFS
DFS di un DAGUna DFS di un DAG induce un ordinamento topologico
Eseguo una DFS registrando il tempo di inizio visista(startValues) e fine visita (finalValues) per ogni nodoad ogni esecuzione della DFS aggiorno il tempoOrdinamento topologico: ordine inverso di visita dei verticiUtilizzo il tempo di fine visita come p(u)Intuizione: ciascun nodo avra’ un ordine di fine visitamaggiore dei suoi successori.
Grafi e GrafiDirettiAciclici
Esempio: DFS per Ordinamenti Topologici
Example (esempio esecuzione di DFS per ordinamentotopologico)
CB
D
E F1/2
3/8
4/7 5/6
9/10
Grafi e GrafiDirettiAciclici
DFS per ordine topologico
Pseudocodice ordine topologico
Algorithm 1 OrdineTopologicoRequire: G grafo
for ogni vertice v di G doinizializza a zero startValues e endValues di v
end forfor ogni vertice v di G do
if startValues di v == 0 thendfs(G,v);
end ifend forcostruisci una lista res con i vertici in ordine inverso di fine visitareturn res
Grafi e GrafiDirettiAciclici
DFS per ordine topologico
Pseudocodice per DFS
Algorithm 2 dfsRequire: G grafo, v node
time++;startValues di v = time;for ogni vertice u adiacente a v do
if startValues di u == 0 thendfs(G,u);
elseif finalValues di u == 0 then
errore G non e’ un DAGend if
end ifend fortime++finalValues di v = time
Grafi e GrafiDirettiAciclici
Realizzazione DAG in java
DAG in javaClasse ArcoOrdinato.java
estende la classe Arco definendo un ordine tra i nodidell’arco
classe DAG.javaestende la classe Graforidefinisce il metodo add(Object from, Object to, ObjectValue)ridefinisce il metodo toString()implementa nuove funzionalita: ordineTopologico(...)
Grafi e GrafiDirettiAciclici
Esercizi: DAG
Esercizi sui DAG(valido per il progetto) realizzare il metodogetTopologicalOrder(...) della classe DAG.java
utilizzare il metodo pullMax(...) (implementato) perestrarre il nodo con endValues piu’ alta alla fine della visitautilizzare il metodo ricorsivo dfs(...) (da implementare) perrichiamare la visita in profondita’ sui nodile strutture startValues, endValues e la variabile time sonogia dichiarate come variabili di classe