Sei sulla pagina 1di 64

Progettazione e Attributi di un

Algoritmo
INFORMATICA
Corsi di Educazione, Ed. Comunità, Comunicazione e Psicologia
– a.a. 2010/2011
Originariamente redatte dal prof. Roberto Pirrone
rivedute dal prof. Orazio Gambino

DICGIM ing. Orazio Gambino


Rappresentazione di un algoritmo
• Linguaggio naturale

• Pseudocodice

• Diagrammi di flusso

• Linguaggio di programmazione formale

DICGIM ing. Orazio Gambino


Operazioni di ingresso e uscita

• Operazioni sequenziali
– Elaborazione, Ingresso, Uscita
• Operazioni di ingresso
– Acquisisci il valore per “variabile”
• Operazioni di uscita
– Stampa il valore per “variabile”, descrizione della variabile

DICGIM ing. Orazio Gambino


Progettazione di un algoritmo

• Determinare il maggiore di un elenco di numeri


– Dato un valore n>1 e un elenco contenente esattamente n
valori unici detti A1, A2, …, An, trovare e stampare il valore
maggiore nell’elenco e la posizione nell’elenco in cui è stato
trovato.

• Dati: n=5
– Valori: 19,41,12,63,21

1 2 3 4 5

19 41 12 63 21

DICGIM ing. Orazio Gambino


Procedimento manuale

19
41
12
63
21

DICGIM ing. Orazio Gambino


Procedimento manuale

41
12
63 19
21

DICGIM ing. Orazio Gambino


Procedimento manuale

12
63 41
21

19

DICGIM ing. Orazio Gambino


Procedimento manuale

12

21 63

DICGIM ing. Orazio Gambino


Acquisizione dei dati e stampa del
risultato
• Acquisisci un valore per n, il numero di dati
in elenco
• Acquisisci i valori per A1, A2, …, An, l’elenco
in cui cercare
1 2 3 4 5

19 41 12 63 21
 Stampa i valori di maggiore attuale e locazione

63

DICGIM ing. Orazio Gambino


Costruzione dell’algoritmo

• Organizzare i dati in una pila

1 2 3 4 5

19 41 12 63 21

DICGIM ing. Orazio Gambino


Costruzione dell’algoritmo
• Il primo elemento è il maggiore attuale.
• Lo salviamo in una posizione a parte

1 2 3 4 5

19 41 12 63 21

DICGIM ing. Orazio Gambino


Costruzione dell’algoritmo
• Confronta il prossimo
elemento con il maggiore 1 2 3 4 5

attuale 19 41 12 63 21

– Se l’elemento considerato è
maggiore del maggiore attuale
allora esso diventa il nuovo
maggiore attuale
altrimenti esso viene scartato

DICGIM ing. Orazio Gambino


Costruzione dell’algoritmo
• Ripeti finché ci sono dati in elenco
– Confronta il prossimo elemento con il maggiore
attuale
– Se l’elemento considerato è maggiore del maggiore
attuale
– allora diventa il nuovo maggiore attuale
Contatore di iterazione i
altrimenti viene scartato
1 2 3 4 5

19 41 12 63 21

DICGIM ing. Orazio Gambino


Algoritmo Trova il Maggiore
•Acquisisci un valore per n, il numero di dati in elenco
•Acquisisci i valori per A1, A2, …, An, l’elenco in cui cercare
•Poni il valore di maggiore attuale ad A1
•Poni il valore di locazione ad 1
•Poni il valore di i a 2
•Ripeti fino a che i > n
– Se Ai > maggiore attuale allora
Poni il valore di maggiore attuale ad Ai
Poni il valore di locazione ad i
– Aggiungi 1 al valore di i
•Fine ciclo
•Stampa i valori di maggiore attuale e locazione
•Stop

DICGIM ing. Orazio Gambino


Attributi
• Correttezza
– Un algoritmo non deve soltanto produrre un
risultato, ma deve produrre un risultato corretto.
– Un algoritmo cessa di essere utile se non produce
il risultato corretto.
– Deve fornire risultati corretti per tutti i possibili
valori d’ingresso, non solamente i più comuni.
– Testare l’algoritmo con dati e risultati noti.

DICGIM ing. Orazio Gambino


Attributi
– Approssimazione del risultato. Esempio: per il calcolo della
circonferenza devo usare 3.14 o 3.1415927?
Usando 3.14 ottengo i seguenti risultati:
Se il raggio è 1 metro: circonferenza = 6.28 metri.
Se il raggio è 1000 metri: circonferenza = 6280 metri.
Usando 3.1415927 ottengo questi altri:
Se il raggio è 1 metro: circonferenza = 6.2831854 metri.
Se il raggio è 1000 metri: circonferenza= 6283.1854 metri.
Nel primo caso abbiamo trascurato 3 mm e frazioni del
millimetro. Sono trascurabili? Dipende….
Ma nel secondo consideriamo inutili ben 3 metri e 18
centimetri.
Sono ancora trascurabili? Dipende….
DICGIM ing. Orazio Gambino
Attributi
• Facilità di comprensione
– Necessità di adattare un algoritmo per una
varietà di scenari possibili.
– Importante per garantire la manutenibilità dei
programmi
• per correggere bug da una versione all’altra
• chiarezza del codice
– Nomi autoesplicativi per variabili e funzioni.
– Indentazione per identificare le sezioni del codice.
– Commenti alle righe di codice.
– Documentazione sull’algoritmo in forma di pseudocodice,
diagrammi di flusso ed altre tecniche di rappresentazione.

DICGIM ing. Orazio Gambino


Attributi
• Eleganza
• Problema somma dei primi 100 numeri:
1+2+3+4+…+98+99+100=5050
Prima soluzione. Scrivo un algoritmo che calcola effettivamente le somme tra
numeri consecutivi:
1. Imposta il valore somma a 0
2. Imposta il valore contatore a 1
3. Finchè contatore è <= 100 esegui gli step 4. e 5.
4. Somma contatore a somma
5. Somma 1 al valore di contatore
6. Stampa il valore di somma
7. Stop.

DICGIM ing. Orazio Gambino


Attributi
Seconda soluzione. Invento una formula che risolva
il problema in un passo solamente: Algoritmo di
Gauss.

Gauss: i numeri da 1…100 sono raggruppabili in 50


coppie la cui somma è sempre 101, ovvero
(1+100), (2+99), (3+98),…,(50+51)
per cui (100+1)*100/2=5050

Valido per la somma dei primi n numeri con n pari


s=(n+1)*n/2

DICGIM ing. Orazio Gambino


Attributi
• Il primo approccio fa parte di quegli algoritmi
appartenenti alla categoria dei metodi di forza
bruta (brute force).
• Appartengono a tale categoria tutti quei
metodi che si basano sulla ricerca esaustiva
della soluzione. Esempi:
• Provare tutte le possibili combinazioni della serratura
cifrata della cassaforte.
• Provare tutti i possibili percorsi dal punto di partenza al
punto di arrivo in un labirinto.

DICGIM ing. Orazio Gambino


Attributi
• Il secondo metodo è elegante rispetto al
metodo brute force in quanto offre una
soluzione a partire dal ragionamento.
• Esso non è classificato nella terminologia
informatica, anche se in letteratura un
algoritmo di questo tipo è detto one-shot o
one-step, ad indicare che la soluzione è
raggiunta in un solo passo.

DICGIM ing. Orazio Gambino


Attributi
• Metodi brute force. Procedimento per tentativi, quindi si
parla più che altro di Euristica, non di algoritmo.
– Pregi:
• Possono trovare più soluzioni, anche se non tutte
necessariamente ottime.
• Maggiore facilità di comprensione rispetto a metodi eleganti.
• Risolvono problemi di cui non si trova un approccio elegante
(ultima spiaggia!).
– Difetti:
• Spesso sono algoritmi ciclici e quindi richiedono tempo di
calcolo e risorse computazionali adeguate.
• Il tempo richiesto potrebbe essere così elevato da diventare
inutile.

DICGIM ing. Orazio Gambino


Attributi
• Efficienza
– Tempo di calcolo e spazio in memoria sono
quantità limitate
– L’efficienza di una algoritmo misura la sua capacità
di utilizzare bene le risorse del calcolatore sui cui
gira, in termini di tempo di calcolo e memoria
utilizzata
• Efficienza nell’uso dello spazio
– Quantità di informazioni da memorizzare per
svolgere il compito in aggiunta ai dati di ingresso
– Tanto più inefficiente quanto più memoria
aggiuntiva è richiesta
DICGIM ing. Orazio Gambino
Attributi

• Efficienza nell’uso del tempo di calcolo


– Benchmarking: fissare i parametri della misura,
ovvero l’insieme dei dati di ingresso, la macchina
specifica, il particolare profilo di uso
dell’algoritmo
– Indicazione della quantità di lavoro richiesta dalla
natura dell’algoritmo
– Tale quantità di lavoro dipende dal numero di passi
richiesti per eseguire il compito
– Il confronto tra due algoritmi va operato sulla base
del numero di passi e non del tempo di esecuzione
su una particolare macchina.
DICGIM ing. Orazio Gambino
Attributi
• Metodi “eleganti” o one-shot
– Pregi
• Solitamente forniscono una sola soluzione, ma è quella
ottima… o l’unica!
– Difetti
• Potrebbe non esistere, e quindi si deve far ricorso al
metodo brute force.
• Spesso in antitesi con facilità di comprensione.

DICGIM ing. Orazio Gambino


Misura dell’efficienza di un algoritmo
Ricerca Sequenziale

1. Acquisisci i valori di NOME, N1, …, Nn, T1, …, Tn


2. Poni il valore di i a 1 ed il valore di Trovato a NO
3. Ripeti fino a che Trovato = SI ovvero i > n
1. Se NOME = Ni
1. Stampa il numero di telefono Ti
2. Poni il valore di Trovato a SI
2. Altrimenti aggiungi 1 al valore di i
4. Se Trovato = NO allora stampa il messaggio “Mi dispiace: numero non
in elenco”
5. Fermati

DICGIM ing. Orazio Gambino


Misura dell’efficienza di un algoritmo
Ricerca Sequenziale

1. Acquisisci i valori di NOME, N1, …, Nn, T1, …, Tn


2. Poni il valore di i a 1 ed il valore di Trovato a NO
3. Ripeti fino a che Trovato = SI ovvero i > n
1. Se NOME = Ni
1. Stampa il numero di telefono Ti
2. Poni il valore di Trovato a SI
2. Altrimenti aggiungi 1 al valore di i
4. Se Trovato = NO allora stampa il messaggio “Mi dispiace: numero non
in elenco”
5. Fermati

OPERAZIONI MARGINALI

DICGIM ing. Orazio Gambino


Misura dell’efficienza di un algoritmo
Ricerca Sequenziale

1. Acquisisci i valori di NOME, N1, …, Nn, T1, …, Tn


2. Poni il valore di i a 1 ed il valore di Trovato a NO
3. Ripeti fino a che Trovato = SI ovvero i > n
3.1 Se NOME = Ni
3.1.1 Stampa il numero di telefono Ti
3.1.2 Poni il valore di Trovato a SI
3.2 Altrimenti aggiungi 1 al valore di i
4. Se Trovato = NO allora stampa il messaggio “Mi dispiace: numero non
in elenco”
5. Fermati

DICGIM ing. Orazio Gambino


Misura dell’efficienza di un
algoritmo
• CASO MIGLIORE
il dato da cercare è proprio il primo, quindi l’algoritmo effettua un solo
confronto.
Numero confronti caso migliore : 1 confronto.
• CASO PEGGIORE
il dato da cercare è l’ultimo, quindi l’algoritmo effettua n confronti.
Numero confronti caso peggiore : n confronti.
• CASO MEDIO

numeroConfrontiCasoPeggiore + numeroConfrontiCasoMigliore n + 1
casoMedio = =
2 2

se n >>1 allora casoMedio=n/2

ing. Orazio Gambino


Misura dell’efficienza di un
algoritmo
• Efficienza rispetto al tempo
Il numero dei confronti per il caso peggiore ed il caso medio dipendono
da n, il numero dei nomi presente nell’elenco.

Per n piuttosto piccolo, l’algoritmo può andare bene.

Per n grande, l’algoritmo non è piu’ adatto per fare una ricerca.
Esempio per un elenco di 20 milioni di persone e 100mila confronti/sec:

20 000 000 1
confronti ⋅ sec /confronto = 100 sec
2 e 40 sec. Se si tiene
cioè 1 minuto 100 000
conto del fatto che bisogna aggiornare
l’indice, è necessario un tempo ancora maggiore.

ing. Orazio Gambino


Ordine di grandezza n - Θ(n)
Θ( )
Il caso peggiore della ricerca lineare vale n per
un elenco di n nomi.
Il lavoro sussidiario per l’aggiornamento di una
variabile è rappresentato da c.
Il lavoro totale vale cn .
Il grafico a sinistra mostra l’andamento del
lavoro nel caso c=2.
Si dice che l’ordine di grandezza è lineare con n
in quanto, all’aumentare di n, il Lavoro
aumenta in maniera proporzio-nale secondo
un coefficiente costante c .
Di conseguenza le coordinate si dispongono
lungo una linea.
L’ordine di grandezza dipende da n e si indica
con Θ(n).
DICGIM ing. Orazio Gambino
Ordine di grandezza n - Θ(n)
Θ( )
In questo diagramma sono
raccolti 3 grafici di altret-
tanti algoritmi il cui ordine
di grandezza è lineare.
1°algoritmo: c=1/2
2° algoritmo: c=1
3°algoritmo: c=2
Il coefficiente c determina
solo la velocità di crescita
del lavoro. La prestazione
peggiore è per c=2.

Gli algoritmi verranno classificati secondo l’ordine di grandezza della loro


efficienza rispetto al tempo. La ricerca sequenziale è un algoritmo Θ (n)
sia per il caso peggiore che per il caso medio.
ing. Orazio Gambino
Ordine di grandezza n 2 - Θ(n
Θ( )2

Esempio di algoritmo con ordine di


grandezza n2 o Θ(n
Θ( 2)
Per ogni riga da 1 a 4 ripeti
per ogni colonna da 1 a 4 ripeti
Stampa il valore in tabella

In una riga ho un elenco di n valori (in questo caso n=4).


Bisogna ripetere per altrettante volte (di nuovo n=4) la stampa
dei valori.
Quindi sono necessari n⋅n = n 2
passi
ing. Orazio Gambino
Ordine di grandezza n2 - Θ(n
Θ( 2)
Un algoritmo il cui Lavoro cresce
con il quadrato di n si dice che
ha un ordine di grandezza
quadratico e si indica con
Θ(n
Θ( 2).
Il grafico del Lavoro di un
algoritmo con Θ(n
Θ( 2) non è una
linea, bensì una curva.
Il diagramma mostra
contemporaneamente i grafici
di algoritmi Θ(cn
Θ( 2) per diversi
valori di c.
Il valore di c influisce sulla ripidità
della curva ma non sulla sua
forma (non puo’ diventare una
linea).
DICGIM ing. Orazio Gambino
Ordine di grandezza n2 - Θ(n
Θ( 2)
Il diagramma mostra contemporanea-
mente i grafici di un algoritmo Θ(n)
Θ( ) e Θ(n
Θ( 2).
Per valori di n<1 il Lavoro dell’ algo-ritmo
Θ(n
Θ( 2) è inferiore a quello di Θ(n)
Θ( ).
Per valori di n>1 si evince che il Lavoro di un
algoritmo Θ(n
Θ( 2) cresce più veloce-mente di
un algoritmo Θ(n)
Θ( ).
E’ indifferente l’utilizzo dell’uno o dello altro
algoritmo nel caso n=1, in quanto le
prestazioni sono le stesse. Infatti nel punto
d’intersezione la differenza tra i due grafici
si annulla. Considerando n<1 per ottenere
un quantità positiva si ha:

n − n 2 = 0 ⇒ n(1 − n) = 0 ⇒ n = 0; n = 1
DICGIM ing. Orazio Gambino
Ordine di grandezza n2 - Θ(n
Θ( 2)
La figura mostra che il ruolo della costante c è
ininfluente per alti valori di n.Nonostante si sia
favorito l’ordine di grandezza quadratico con
c=0.25 mentre quello lineare è stato
penalizzato con c=10, il Lavoro dell’algoritmo
con ordine di grandezza quadratico supererà
quello lineare per n maggiore dell’ascissa del
punto di interse-zione. Per n tale che
10n>0.25n2 si ha: c
c1n − c2 n 2 = 0 ⇒ n(c1 − c2 n) = 0 ⇒ n = 0; n = 1
c2
Per il caso in esame (c1=10;c2=0.25):
c1 10
n= = = 40
c 2 0.25
Si verifica che per n=40 il Lavoro di Θ(n2) e
Θ(n) sono uguali:
0.25 ⋅ 40 2 = 400 10 ⋅ 40 = 400
DICGIM ing. Orazio Gambino
Considerazioni sugli ordini di
grandezza
• Ha senso confrontare il Lavoro di due algoritmi che risolvono lo stesso
problema.
• Per “n grande”, i fattori costanti non incidono in maniera signifi-cativa
sull’ordine di grandezza.
• Tra due algoritmi si sceglie sempre quello con ordine di gran-dezza
inferiore perché compie meno Lavoro.
• Si considera sempre “n grande” perché è questa la condizione più
critica di funziona-mento, dove sono necessarie grosse ri-sorse
computazionali.
• Si è detto “n grande“. Ma quanto grande? Sicuramente per valo-ri
maggiori dell’ascissa del punto d’intersezione tra i grafici del Lavoro
dei due algoritmi. I fattori costanti, dovuti al lavoro sussidiario,
incidono fortemente per valori inferiori ad esso.
• E’ pericoloso, però, scegliere l’algoritmo per “n piccolo” perché non si
potrebbe essere certi sulla dimensione (n) dei dati d’ingresso.

DICGIM ing. Orazio Gambino


Considerazioni
• Spesso non esiste “l’algoritmo migliore” che risolve un
problema.
• Potrebbero esserci diversi algoritmi che risolvono lo stesso
problema e l’uno è migliore dell’altro solo in certe
condizioni e viceversa.
• Cioè, l’efficienza di certi algoritmi potrebbe dipendere
dalla “configurazione” dei dati d’ingresso.
• Per esempio, se l’algoritmo fosse applicato ad un elenco di
cognomi/nomi ordinato alfabeticamente, si potrebbe
cercare solo a partire da una posizione in poi, migliorando
la prestazione dell’algoritmo di ricerca sequenziale, anche
se esso è sempre un algoritmo di ordine n. In effetti è
quello che noi facciamo con la rubrica telefonica.

DICGIM ing. Orazio Gambino


Considerazioni
• Il cognome/nome è la “chiave di ricerca” per l’algoritmo, ma la
ricerca avviene progressivamente con le lettere del cognome.
• Ci sono algoritmi di ricerca che vengono usati esclusivamente
sotto l’ipotesi che l’elenco sia ordinato.
• Per questo motivo sono stati sviluppati algoritmi di
ordinamento sempre più sofisticati ed efficienti nel senso del
tempo.
• Alcuni di essi verrano esaminati successivamente.

DICGIM ing. Orazio Gambino


Ricerca Binaria
• Necessita di un elenco ordinato
• Si cerca partendo dalla metà esatta
dell’elenco
• Si cerca di volta in volta nelle metà restanti
in cui la probabilità di trovare il nominativo
è più alta in funzione della lettera del
cognome, spostando i limiti di inizio e fine
ricerca finchè la metà esatta coincide con
l’informazione cercata.

DICGIM ing. Orazio Gambino


Ricerca Binaria
Esempio. Ricerca con successo:

cerco CORA

Anna Bobo Cora Dino Gino Nino Susy


1 2 3 4 5 6 7

inizio=1
fine=7
m=4

DICGIM ing. Orazio Gambino


Ricerca Binaria

CORA < DINO

Anna Bobo Cora


1 2 3

inizio=1
fine=m-1=3 (m=4 dalla slide precedente)
m=2 ( nuovo valore di m)

DICGIM ing. Orazio Gambino


Ricerca Binaria

CORA > BOBO

Cora
3

inizio=m+1=3 (m=2 dalla slide precedente)


fine=3
m=3

DICGIM ing. Orazio Gambino


Ricerca Binaria

CORA = CORA

Trovato = SI

FINE

DICGIM ing. Orazio Gambino


Ricerca Binaria
Ricerca con esito negativo:

cerco Maria

Anna Bruno Cora Dino Giuseppe Nicola Sandra


1 2 3 4 5 6 7

inizio=1
fine=7
m=4

DICGIM ing. Orazio Gambino


Ricerca Binaria

Maria > Dino

Giuseppe Nicola Sandra


5 6 7

inizio=m+1=5 (m=4 dal passo precedente)


fine=7
m=6

DICGIM ing. Orazio Gambino


Ricerca Binaria

Maria < Nicola

Giuseppe Nicola Sandra


5 6 7

inizio=5
fine=m-1=5 (m=6 dal passo precedente)
m=5

DICGIM ing. Orazio Gambino


Ricerca Binaria

Maria > Giuseppe

Giuseppe
5

inizio=m+1=6 (m=5 dal passo precedente)


fine=5
m=5

DICGIM ing. Orazio Gambino


Ricerca Binaria

inizio > fine (6>5)

Si è arrivato ad un assurdo e quindi non è più


soddisfatta la condizione di continuità del
ciclo.
L’algoritmo si interrompe visualizzando il
messaggio in cui si informa che l’elemento
cercato non è contenuto nell’elenco.
DICGIM ing. Orazio Gambino
Ricerca Binaria
Si è lavorato con un elenco di numero dispari
di elementi.
In questo modo i due sottoelenchi
contengono lo stesso numero di elementi.

1 2 3 5 6 7

Come ci si deve comportare se il numero di elementi è


pari?

DICGIM ing. Orazio Gambino


Ricerca Binaria
Nulla di grave. Si lavorerà con sottoelenchi
sbilanciati (m=8/2=4):

1 2 3 5 6 7 8
I nomi delle posizioni centrali possono essere
organizzati in forma di struttura dati ad albero in
funzione delle decisioni prese fino a quando non
si arriva ad un nome che coincide con la chiave di
ricerca.

DICGIM ing. Orazio Gambino


Ricerca Binaria

Dino

Bobo Nino

Anna Cora Gino Susy

DICGIM ing. Orazio Gambino


Ricerca Binaria

1. Acquisisci i valori di NOME, N1, …, Nn, T1, …, Tn


2. Poni il valore di inizio a 1 ed il valore di Trovato a NO
3. Poni il valore di fine ad n
4. Ripeti fino a che Trovato = SI oppure fine < inizio
1. Poni il valore di m alla metà tra inizio e fine
2. Se NOME = Nm
1. Stampa il numero di telefono Ti
2. Poni il valore di Trovato a SI
3. Altrimenti se NOME < Nm poni fine = m – 1
1. Altrimenti poni inizio = m + 1
5. Se Trovato = NO allora stampa il messaggio “Mi dispiace:
numero non in elenco”
6. Fermati

DICGIM ing. Orazio Gambino


Ricerca binaria
root

Level 1

Level 2

Ogni livello contiene i valori centrali della suddivisione. La


radice (root) contiene la metà dell’intero elenco. Il livello 1
contiene i valori centrali delle due metà di elenco. Il livello 2
contiene i valori centrali dei quarti di elenco ……
DICGIM ing. Orazio Gambino
Misura dell’efficienza - Ricerca Binaria

• Anche in questo caso dipende dal numero di confronti.


• Caso migliore: la chiave coincide con l’elemento centrale
dell’elenco. Occorre un solo confronto.
DICGIM ing. Orazio Gambino
Misura dell’efficienza - Ricerca
Binaria

Caso peggiore: con 7 elementi sono necessari 3


confronti, tanti quanti sono i livelli dell’albero +
la radice.
ing. Orazio Gambino
Misura dell’efficienza - Ricerca Binaria
• Il caso peggiore è sicuramente quello in cui la
ricerca fallisce: si è passato a suddivisioni successive
fino a quando si è ridotto tutto l’elenco ad un solo
elemento.
• Tale situazione potrebbe accadere anche quando la
ricerca binaria trova l’elemento coincidente con la
chiave di ricerca. Ma se l’elemento cercato NON
ESISTE nell’elenco, siamo sicuri che saranno
effettuate tutte le suddivisioni fino ad arrivare ad un
solo elemento…che manco è quello cercato! 

DICGIM ing. Orazio Gambino


Calcolo dell’ordine di grandezza – Ricerca binaria
In definitiva, il caso peggiore risponde alla domanda: quante
suddivisioni devo effettuare fino a quando resto con un solo
elemento? Ragioniamo un poco. Conside-riamo elenchi di
lunghezza pari e dividiamo per 2 la lun-ghezza fino ad
arrivare ad uno. Partiamo da un elenco di 8 elementi.
Numero di suddivisioni
8/2=4 ; 4/2=2 ; 2/2=1 3
16/2=8; 8/2=4 …. (vedi sopra) 4
32/2=16; 16/2=8 …(vedi sopra) 5
64/2=32; 32/2=16 …(vedi sopra) 6
………………………….
DICGIM ing. Orazio Gambino
DICGIM ing. Orazio Gambino
DICGIM ing. Orazio Gambino
Calcolo dell’ordine di grandezza – Ricerca binaria

log 2 8 = 3 ⇒ 23 = 8
log 2 16 = 4 ⇒ 2 4 = 16
log 2 32 = 5 ⇒ 25 = 32
log 2 64 = 6 ⇒ 2 6 = 64

Dalla tabella e dalle formule a destra, si deduce che il nu-


mero delle suddivisioni cresce con il logaritmo in base 2 del
numero degli elementi dell’elenco.
Per il caso peggiore, questo algoritmo ricade nella categoria
degli algoritmi con ordine di grandezza log2(n) - Θ(log2n)
DICGIM ing. Orazio Gambino
• Applichiamo la solita formula per il caso medio:
numeroConfrontiCasoPeggiore + numeroConfrontiCasoMigliore log 2 (n) + 1
casoMedio = =
2 2
• In definitiva, sia nel caso peggiore che nel caso medio la
crescita del Lavoro dipende dal log2(n).
• Più in generale, si dice che l’ordine di grandezza di un
algoritmo è logaritmico Θ(log(n)) se il Lavoro cresce in
maniera logaritmica con il numero dei dati.

ing. Orazio Gambino


Confronto tra algoritmi Θ(n)
Θ( ) - Θ (n
( 2) - Θ(log(n))
Θ( )
Dai grafici si
evince che gli
algoritmi con or-
dine di grandez-
za logaritmica
sono preferibili a
queli lineari, ed
a maggior ragio-
ne, a quelli qua-
dratici.

DICGIM ing. Orazio Gambino


Confronto tra prestazioni
• Tanto per chiarire meglio le idee sul perché sia preferibile un algoritmo
logaritmico ad uno lineare, prendiamo l’esempio riportato nella silde 30.
In quell’ esempio il tempo impiegato da una macchina, in grado di
effettuare 100mila confronti/sec, per cercare un nome in un elenco di
20 milioni di nominativi era di 100 sec. Adesso vediamo quanto
impiegherebbe l’algoritmo di ricerca binaria usando la stessa macchina
per risolvere il caso medio dello stesso problema:

log 2 (20000000) + 1 1 12.6


confronti ⋅ sec ondi / confronti ≅ sec = 0.000126 sec
2 100000 100000
Con lo stesso hardware usato per l’algoritmo di ricerca lineare ci si impiega
meno di un millesimo di secondo per fare la stessa cosa. Ragionare
conviene!

ing. Orazio Gambino