Logo dell'Università di Catania: Siciliae Studium Generale 1434 Logo DMI, Fondamenti di informatica
matite e gomma
Loghi istituzionali: Siciliae Studium Generale 1434, Università di Catania, Facoltà di Scienze Matematiche, Fisiche, Naturali, Insegnamento di Fondamenti di Informatica

Principi di progettazione di algoritmi

Lezione 3 di Fondamenti di informatica

Docente: Giuseppe Scollo

Università di Catania
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Laurea in Informatica, I livello, AA 2009-10

Logo di Conformità WCAG-1 di Livello Tripla A, W3C-WAI Web Content Accessibility Guidelines 1.0 Validazione XHTML 1.0 Validazione CSS 3

Indice

  1. Principi di progettazione di algoritmi
  2. correttezza, semplicità, efficienza
  3. efficienza o semplicità?
  4. il problema della connettività
  5. prima variazione sul tema
  6. altre variazioni sul tema
  7. progetto di soluzioni: operazioni astratte
  8. algoritmo quick-find
  9. strutture dati astratte: sequenze, alberi
  10. algoritmo quick-union
  11. algoritmo quick-union pesata
  12. prospettiva metodologica

correttezza, semplicità, efficienza

principali criteri di qualità degli algoritmi

il primo esercizio della lezione precedente suggerisce un promettente metodo di sviluppo di algoritmi per la soluzione di problemi di una certa complessità:

a ben vedere, la realizzazione di ciascuna delle operazioni da considerare nella fase del raffinamento costituisce a sua volta un problema al quale si cerca un soluzione algoritmica... si può dunque reiterare il metodo a ciascuno dei problemi della seconda fase, abbassando gradualmente il livello di astrazione in successivi passi di raffinamento, finché non rimane alcuna operazione che non sia effettivamente eseguibile

efficienza o semplicità?

il problema della connettività

prima variazione sul tema

un algoritmo per il problema proposto può servire, fra l'altro, a risolverne un po' diverso:

  • input: una sequenza di coppie
  • si vuole un algoritmo che, per ogni coppia cn, decida se i suoi elementi sono connessi da un cammino nel grafo (non orientato) costruito dalle coppie precedenti {cm | m<n}:
    • se lo sono, si passa alla coppia successiva
    • altrimenti si produce in output cn
      (e si passa alla coppia successiva)
esempio
 in       out   
1-3 1-3
2-4 2-4
3-0 3-0
1-0
4-2
0-2 0-2
2-1

altre variazioni sul tema

altre varianti del problema proposto:

  • più complessa: se la coppia p-q è connessa, produrre in output uno dei (o tutti i) modi in cui è connessa
    • esempio: 4o, 5o, 7o input del precedente   
esempio
 in       out           
1-0 (1-3-0)
4-2 (2-4)
2-1 (1-3-0-2)

progetto di soluzioni: operazioni astratte

algoritmo quick-find

un algoritmo semplice (non troppo: non richiede memorizzazione di tutte le coppie in input)

si abbiano N nodi:   quale struttura dati concettuale di supporto all'algoritmo, introduciamo una sequenza di variabili idi (i=1,...,N) che soddisfi l'invariante:

se cn = p-q è la n-sima coppia in input, allora idp = idq sse Cp = Cq nel grafo costruito dalle coppie precedenti {cm | m<n}

strutture dati astratte: sequenze, alberi

cosa è esattamente una sequenza?

una sequenza è una funzione, definita su un dominio (totalmente ordinato) di indici

le sequenze sono strutture dati frequenti negli algoritmi; lo sono anche gli alberi:

cosa è esattamente un albero?

sebbene il grafo di un albero sia generalmente non orientato, la designazione di un vertice radice induce naturalmente un ordinamento parziale dei vertici, grazie all'assenza di cicli, dunque un orientamento degli archi

  • m<n se m precede n nel cammino dalla radice a n

terminologia: padre, figli, foglie, sottoalbero, ...

rappresentazione grafica di un albero

algoritmo quick-union

  • alberi nella sequenza id nell'esecuzione di quick-find: ne sono radici i punti fissi della funzione id, cioè gli n tali che idn = n

input: 3-4, 4-1, 5-2, 0-2

alberi iniziali input 3 input 4 alberi dopo input 3-4 input 4 input 1 alberi dopo input 4-1 input 5 input 2 alberi dopo input 5-2 input 0 input 2 alberi dopo input 0-2 alberi finali
  • possiamo modificarli per una più efficiente esecuzione di union
  • nuovo invariante: ( idωp : radice dell'albero a cui appartiene p )

Cp = Cq nel grafo costruito dalle coppie precedenti p-q sse idωp = idωq

  • inizializzazione: come in quick-find
  • implementazione di find(p)
  • si complica: i ← idωp
  • implementazione di union(Cp,Cq)
  • immediata: idi ← idj

input: 3-4, 4-1, 5-2, 3-5

alberi iniziali input 3 input 4 alberi dopo input 3-4 input 4 input 1 alberi dopo input 4-1 input 5 input 2 alberi dopo input 5-2 input 3 input 5 alberi dopo input 3-5 alberi finali

efficienza dell'algoritmo quick-union : non sempre buona, può dover eseguire più di MN/2 istruzioni (per N nodi e M coppie in input), se M>N

algoritmo quick-union pesata

  • inizializzazione: come in quick-union, ma estesa alla sequenza ausiliaria sz
  • implementazione di find(p) : invariata
  • implementazione di union(Cp,Cq) : si complica un po' per tener conto di, e aggiornare, sz

input: 3-4, 4-1, 5-2, 3-5

alberi iniziali input 3 input 4 alberi dopo input 3-4 input 4 input 1 alberi dopo input 4-1 input 5 input 2 alberi dopo input 5-2 input 3 input 5 alberi dopo input 3-5 alberi finali

efficienza di quick-union pesata : molto migliore della precedente, per la riduzione della lunghezza dei cammini, proporzionale non più a N bensì a lg N, anche nel caso peggiore

prospettiva metodologica

che "lezione di metodo" trarre dallo studio condotto sul problema della connettività?

punti salienti dello schema di studio degli algoritmi union-find: