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

Elementi di analisi degli algoritmi

Lezione 4 di Fondamenti di informatica

Docenti: Marina Madonia & Giuseppe Scollo

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

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

Indice

  1. Elementi di analisi degli algoritmi
  2. motivazioni per l'analisi degli algoritmi
  3. prestazioni della ricerca sequenziale
  4. velocità di crescita delle funzioni
  5. algoritmo di ricerca binaria
  6. prestazioni della ricerca binaria
  7. proprietà della funzione logaritmo
  8. un algoritmo di ordinamento
  9. analisi dell'algoritmo di ordinamento
  10. limitazione asintotica di funzioni
  11. approssimazione asintotica di funzioni
  12. complessità di algoritmi e di problemi
  13. esercizi

motivazioni per l'analisi degli algoritmi

prestazioni della ricerca sequenziale

consideriamo l'algoritmo di ricerca di un nome in un elenco visto in una lezione precedente

riguardo alla dipendenza dal valore dell'input, dobbiamo considerare due casi

se l'elenco ha N nomi, è facile vedere che la ricerca sequenziale esamina mediamente :

la ricerca sequenziale esamina sempre N elementi nel caso peggiore, in qualsiasi esito

velocità di crescita delle funzioni

assunto: dipendenza delle prestazioni dell'algoritmo da un parametro primario N

(uno solo, per semplicità e senza perdita di generalità)

il tempo di esecuzione ("costo" più significativo degli algoritmi nella maggior parte dei casi) tipicamente cresce come una delle seguenti funzioni di N, e la rispettiva crescita si dice:

algoritmo di ricerca binaria

nell'esempio precedente, non c'è alternativa alla ricerca sequenziale se l'elenco non è ordinato

se l'elenco dei nomi è ordinato (in un qualsiasi ordinamento totale), la prestazione media della ricerca sequenziale può migliorare nel caso di esito negativo, arrestando l'esecuzione del ciclo quando l'elemento confrontato con il nome dato è maggiore di questo (se l'ordine è ascendente)

se l'elenco è ordinato, si può fare (molto) meglio!

l'idea dell'algoritmo di ricerca binaria è la seguente:

prestazioni della ricerca binaria

la ricerca binaria, ad ogni passo con esito negativo dimezza la dimensione dello spazio di ricerca nel passo successivo

il guadagno di efficienza rispetto alla ricerca sequenziale è esponenziale!

come nel caso dell'algoritmo di quick-union pesata, il guadagno di efficienza è dovuto all'operare lungo un cammino, in questo caso da radice a foglia, di un albero bilanciato, di altezza logaritmica rispetto al numero dei nodi

a mo' di esempio, l'albero in figura rappresenta le opzioni disponibili alla ricerca binaria di un numero nell'elenco ordinato dei numeri da 1 a 15, ed il cammino in rilievo mostra le scelte fatte per la ricerca di 3

albero di ricerca binaria dei numeri da 1 a 15

albero di ricerca binaria dei numeri da 1 a 15 ricerca di 3: primo confronto ricerca di 3: secondo confronto ricerca di 3: terzo confronto ricerca di 3: quarto e ultimo confronto

proprietà della funzione logaritmo

definizione: funzione inversa dell'esponenziale

ovvero, logb x è l'esponente da dare a b per ottenere x :

dalla definizione discendono le proprietà:

notazione per basi speciali:

un'applicazione delle approssimazioni intere del logaritmo binario:

un algoritmo di ordinamento

le prestazioni della ricerca binaria sono rese possibili dall'ipotesi che lo spazio di ricerca sia ordinato

un semplice algoritmo di ordinamento può usare come primitiva una vecchia conoscenza: una funzione di ricerca del massimo in un insieme, per la quale già disponiamo di un algoritmo

nel nostro caso occorre però un algoritmo un po' diverso, perché vogliamo ordinare una sequenza data, non necessariamente di numeri, e ci serve una funzione che ci dia la posizione (ad es., della prima occorrenza) del massimo elemento trovato nella sequenza

tali adattamenti sono proposti come esercizi, assieme ad altri raffinamenti del seguente algoritmo di ordinamento, in cui A = A1 ... AN è la sequenza data, e adoperiamo il termine procedura, invece di funzione, per indicare un algoritmo che può modificare i dati che riceve in ingresso

analisi dell'algoritmo di ordinamento

possiamo ora rispondere al quesito posto all'inizio della pagina precedente, con riferimento all'algoritmo appena visto, ragionando come segue:

sorgono spontanee due domande:

  1. il costo dell'ordinamento non vanifica il guadagno di efficienza dato dalla ricerca binaria?
  2. non esistono algoritmi di ordinamento (decisamente) più efficienti?

rispondiamo nell'ordine:

  1. no, se la ricerca va eseguita molte volte sulla sequenza data: l'ordinamento è in tal caso un "investimento", il cui costo viene ammortizzato sulle numerose esecuzioni della ricerca
  2. sì, sono noti algoritmi di ordinamento di costo proporzionale a   N lg N

limitazione asintotica di funzioni

che vuol dire esattamente che una funzione è un'approssimazione asintotica di un'altra?

la notazione O grande designa una limitazione asintotica della velocità di crescita:

def. :  g(N) è O(f(N)) se esistono costanti c e N0 tali che g(N) < cf(N) per ogni N>N0

utilità della notazione O grande:

discendono direttamente dalla definizione molte proprietà della notazione O grande che permettono spesso di manipolarne le espressioni "come se la O non ci fosse", ad esempio:

approssimazione asintotica di funzioni

la limitazione asintotica espressa dalla notazione O grande non è sufficiente a caratterizzare la velocità di crescita

la notazione    (letta "all'incirca") designa l'approssimazione asintotica di una funzione con un'altra:

def. :   f(N)  g(N) se  f(N) = g(N)+h(N)  e  h(N)/g(N) → 0 per N →

per caratterizzare solo la velocità di crescita l'approssimazione asintotica chiede troppo... basta invece il seguente concetto

la notazione    (letta "proporzionale a") designa la proporzionalità asintotica di una funzione ad un'altra:

def. :   f(N)  g(N) se esiste una costante c tale che   f(N)  cg(N)

complessità di algoritmi e di problemi

finora si sono considerate stime e analisi delle prestazioni di algoritmi per un dato problema, o classe di problemi, e per essi risulta utile distinguere fra

per complessità computazionale di un problema si intende:

il costo computazionale nel caso peggiore di un algoritmo per un dato problema costituisce un limite superiore alla complessità computazionale del problema:

è anche utile determinare limiti inferiori alla complessità computazionale di problemi, analizzandone caratteristiche inerenti, ma questo compito è di solito più difficile

esercizi

  1. assumendo che il file in ingresso sia un elenco di nomi in ordine alfabetico, modificare la descrizione dell'algoritmo di ricerca sequenziale visto in una lezione precedente, in modo che la ricerca termini con esito negativo quando il valore dell'elemento letto è maggiore del nome cercato
  2. si considerino le funzioni N1/2, lg N, N3/2, N lg N : disporle in ordine ascendente di velocità di crescita
  3. dimostrare che lg N + 1 = lg(N+1)   per ogni intero positivo N > 0
  4. l'algoritmo di ordinamento visto a lezione usa due primitive:
    1. la funzione posizione_massimo(A, n), che restituisce la posizione (indice) nella sequenza A del massimo fra i suoi primi n elementi
    2. la procedura scambia(A, i, j), che scambia di posto gli elementi alle posizioni i, j nella sequenza A
    descrivere in pseudocodice algoritmi per tali astrazioni