Grafi e problem solving
Definizioni: grafo
Grafi orientati e non
Grafo: proprietà
Esempi: incidenza e adiacenza
ADT Grafo: operazioni tipiche
Visita in profondità o in ampiezza Coda Pila
Grafo: implementazioni Grafi orientati
Matrice di adiacenza
Problema: ponti di Eulero
Lista di adiacenza
Strutture dati
Strutture dati
Complessità Qual è meglio usare ?
Qual è meglio usare ? Le liste di adiacenze sono preferibili quando il grafo è sparso, ossia quando il numero degli archi |E| è relativamente piccolo, rispetto al numero dei nodi |V|. Le matrici sono invece preferibili se il grafo è denso, ossia quando il numero degli archi |E| ≅ |V|2. Inoltre, la matrice di adiacenze mi permette subito di capire se due nodi del grafo sono collegati tra loro. Viceversa, in una lista di adiacenze la ricerca è più lunga
La matrice di adiacenza ha una complessità temporale di accesso ai dati più bassa rispetto alla lista di adiacenza. D'altra parte, la matrice di adiacenze occupa più spazio di memoria rispetto alla lista di adiacenze ( 21 contro 15 locazioni di memoria ).
… e per grafi orientati Nel caso dei grafi orientati la differenza tra i due metodi è ancora più ampia perché si deve memorizzare l'intera matrice, mentre la lista delle adiacenze si riduce. Le liste di adiacenze hanno la stessa complessità sia per i grafi orientati che per i grafi non orientati Quindi, se il tempo di ricerca non è un problema, è meglio lavorare con le liste di adiacenze su big data.
Grafo pesato Peso Un grafo pesato associa un'etichetta (peso) ad ogni suo arco. I pesi sono espressi generalmente tramite numeri reali, ma possono essere ristretti all'insieme dei razionali o degli interi. Alcuni algoritmi necessitano di maggiori restrizioni sui pesi. Ad esempio, l'algoritmo di Dijkstra funziona propriamente solo con pesi positivi. Talvolta il peso fra due vertici non connessi da un arco è indicato con il valore infinito.
Esempi di grafi orientati, pesati e non
Lettura grafo da file (1)
Lettura grafo da file (2)
Giochiamo con gli scacchi
Possibile download di codice in Java Dal’UML all’implemenazione Algoritmo per il massimo flusso su grafo Ad esempio le classi Edge e Node rappresentano gli archi e i nodi del grafo Semplice implementazione dell’algoritmo di Dijkstra in Java
Glossario Grafo Albero
Albero: terminologia
Albero binario
ADT Albero: operazioni minime
Albero: rappresentazione con liste collegate