ALGORITMI
Calcolo delle radici di un polinomio
Problema: Dati i coefficienti a,b,c di un polinomio di
2° grado della forma: ax^2 + bx + c = 0,
calcolare le radici.
A lezione sono stati presentati i seguenti passi per
risolvere un problema:
1.
Individuazione di un procedimento risolutivo
2.
Scomposizione del procedimento in un insieme ordinato di
azioni (algoritmo)
3.
Rappresentazione dei dati e dell’algoritmo attraverso un
formalismo comprensibile al calcolatore (linguaggio di
programmazione, programma)
ALGORITMI
Calcolo delle radici di un polinomio
Passo 1:
Individuazione di un procedimento risolutivo
Cosa sappiamo di questo problema? Qual è la conoscenza
specifica che abbiamo sul dominio del problema?
x1, 2
− b ± b 2 − 4ac
=
,
2a
b 2 − 4ac ≥ 0
ALGORITMI
Calcolo delle radici di un polinomio
Passo 2:
Scomposizione del procedimento
ordinato di azioni (algoritmo)
•
Leggi a,b,c
•
Calcola il “delta”
•
Se il delta è maggiore (o uguale) a 0:
•
allora
in
un
insieme
calcola il numeratore (utilizzando il segno +)
•
dividi il num. per il den. e memorizza il primo risultato
•
calcola il numeratore utilizzando il segno –
•
dividi il num. per il den. e memorizza il secondo risultato
•
restituisci entrambi i risultati
•
•
altrimenti
restituisci il messaggio di errore “Radici non reali!”
ALGORITMI
Verifica se un numero è primo
Problema: Dato un numero, stabilire se questo e’
primo.
A lezione sono stati visti i concetti di dominio di
ingresso e dominio di uscita di un algoritmo.
In questo caso quindi:
– dom. di ingresso: l’insieme dei numeri interi
– dom. di uscita: una risposta del tipo SI/NO
(vero/falso)
ALGORITMI
Verifica se un numero è primo
Si parte sempre col trovare un procedimento risolutivo.
In questo caso, la definizione di numero primo
suggerisce sicuramente una soluzione.
Un numero e’ primo se e’ divisibile solo per
1 e per sé stesso
Dalla definizione ne consegue che un numero è primo
se non è divisibile per tutti i numeri compresi tra 1 ed il
numero stesso (esclusi i due estremi).
ALGORITMI
Verifica se un numero è primo
Una prima soluzione potrebbe essere:
- Sia X il numero da verificare
- Sia R un numero inizialmente = 1 (sarà il nostro risultato…)
- Sia Z un numero, inizialmente = 2
- Per ogni valore che Z può assumere nell’intervallo [2, (X-1)] fai:
-
se X è divisibile per Z
-
allora poni R = 0
- Restituisci come risultato SI se R vale 1, NO se R vale 0
ALGORITMI
Verifica se un numero è primo
Alcuni problemi introdotti nella soluzione precedente:
1. Cosa vuol dire che un numero intero (non) è
divisibile per un altro numero intero?
2. E’ davvero necessario provare a dividere per tutti i
numeri compresi in [2, X-1]? Posso restringere
l’intervallo?
3. Devo provare tutte le divisioni o in “certi” caso mi
posso fermare prima?
4. Devo veramente provare a dividere per tutti i
numeri, oppure posso provare la divisione solo con
alcuni di essi (e tralasciarne altri) ?
5. Quante divisioni devo eseguire?
ALGORITMI
Generazione di numeri primi
Problema:
dato
un
limite
massimo
(per
opportunità), determinare tutti i numeri primi minori
di tale limite.
L’algoritmo quindi riceve in ingresso un numero intero,
ed in uscita deve restituire un insieme di numeri interi
•Dominio di ingresso: insieme dei numeri interi
•Domino di uscita: sottoinsiemi dell’insieme dei numeri
interi
ALGORITMI
Generazione di numeri primi
Una prima soluzione, sfruttando il problema risolto
in precedenza:
– Leggo il limite L
– Sia S l’insieme dei numeri primi, inizialmente vuoto
– Sia X un numero intero
– Per ogni valore che X può assumere in [1, L] fai:
–
se X è primo
–
allora aggiungi il valore di X a S
– Restituisci come risultato l’insieme S
Nota: “se X è primo” lo stabiliamo appunto con
l’algoritmo già visto.
ALGORITMI
Generazione di numeri primi
Esercizio:
Pensare ad un algoritmo equivalente a quello
presentato, che però tenga conto delle
osservazioni riguardo lo stabilire se un numero e’
primo o no.
Ricordiamo che:
Due algoritmi si dicono equivalenti quando:
1. Hanno lo stesso dominio di ingresso
2. Hanno lo stesso dominio di uscita
3. In corrispondenza degli stessi valori del dominio di
ingresso producono gli stessi valori nel dominio di uscita.
ALGORITMI
Ordinamento di numeri interi – Naïve Sort
Problema: Data una lista di numeri interi, ordinarla in
ordine crescente.
Si supponga per semplicità che:
– Le posizioni nella lista siano numerate da 0 a N-1, dove N
e’ il numero totale di elementi
– Si possa accedere ad ogni singolo elemento tramite
l’indice della sua posizione
Ad esempio:
7 5 9 10 2 4
Deve diventare:
2 4 5 7 9 10
ALGORITMI
Ordinamento di numeri interi – Naïve Sort
Algoritmo Naïve Sort:
– sia N il numero di elementi della lista
– ripeti, per (N-1) volte:
–
sia j la posizione dell’elemento attuale (all’inizio j=0)
–
determina il minimo tra i valori dopo la posizione j
–
confronta il valore dell’elemento j-esimo con il
minimo trovato
–
–
–
se il valore del j-esimo elemento e’ maggiore
allora inverti la posizione dei due elementi
incrementa j di 1 e ripeti.
Dopo (N-1) passaggi, la lista e’ sicuramente ordinata!
ALGORITMI
Ordinamento di numeri interi – Naïve Sort
All’inizio:
7 5 9 10 2 4
Dopo il 1° passaggio:
2 5 9 10 7 4
Dopo il 2° passaggio:
2 4 9 10 7 5
Dopo il 3° passaggio:
2 4 5 10 7 9
Dopo il 4° passaggio:
2 4 5 7 10 9
Dopo il 5° passaggio:
2 4 5 7 9 10
ALGORITMI
Ordinamento di numeri interi – Bubble Sort
Problema: Data una lista di numeri interi, ordinarla in
ordine crescente.
Si supponga per semplicità che:
– Le posizioni nella lista siano numerate da 0 a N-1, dove N
e’ il numero totale di elementi
– Si possa accedere ad ogni singolo elemento tramite
l’indice della sua posizione
Ad esempio:
7 5 9 10 2 4
Deve diventare:
2 4 5 7 9 10
ALGORITMI
Ordinamento di numeri interi – Bubble Sort
Algoritmo Bubble Sort:
– sia N il numero di elementi della lista
– ripeti, per (N-1) volte:
–
confronta il primo elemento col successivo:
–
se il primo elemento e’ maggiore
–
allora inverti la posizione dei due elementi
–
confronta il secondo elemento col successivo
–
se questi e’ il maggiore
–
–
allora inverti la posizione dei due elementi
ripeti i confronti per tutti gli elementi della lista
Dopo (N-1) passaggi, la lista e’ sicuramente ordinata!
ALGORITMI
Ordinamento di numeri interi – Bubble Sort
Algoritmo Bubble Sort (scritto meglio):
– sia N il numero di elementi della lista
– ripeti, per N-1 volte:
–
per i che assume ogni valore possibile in [0, N-2] fai:
–
confronta l’elemento i-esimo con (i+1)-esimo
–
se l’elemento in pos. i e’ maggiore
–
allora scambia l’elemento i-esimo
con l’elemento (i+1)-esimo
L’algoritmo e’ detto “bubble” (bolla) perché gli elementi minori si
spostano verso la cima della lista un po’ come le bolle vengono a
galla nell’acqua.
ALGORITMI
Ordinamento di numeri interi – Bubble Sort
All’inizio:
7 5 9 10 2 4
Dopo il 1° passaggio:
5 7 9 2 4 10
Dopo il 2° passaggio:
5 7 2 4 9 10
Dopo il 3° passaggio:
5 2 4 7 9 10
Dopo il 4° passaggio:
2 4 5 7 9 10
Dopo il 5° passaggio:
2 4 5 7 9 10
Da notare che il 5° passaggio non ha modificato la
lista… questo era un caso fortunato!!!
ALGORITMI
Ordinamento di numeri interi – Bubble Sort
All’inizio:
6 5 4 3 2 1
Dopo il 1° passaggio:
5 4 3 2 1 6
Dopo il 2° passaggio:
4 3 2 1 5 6
Dopo il 3° passaggio:
3 2 1 4 5 6
Dopo il 4° passaggio:
2 1 3 4 5 6
Dopo il 5° passaggio:
1 2 3 4 5 6
Questo caso e’ risultato essere un po’ più sfortunato…
ALGORITMI
Ordinamento - Naïve Sort vs. Bubble Sort
Quale dei due algoritmi è “migliore”?
•“Migliore” in che senso? Per ora, grossolanamente,
diciamo “migliore” nel senso di “più veloce”…
– Il Naïve Sort esegue sempre (N-1) cicli, e per ogni
iterazione esegue diversi controlli (in media (N-1)/2 ).
Anche se la lista e’ già ordinata, il Naïve Sort esegue tutti i
cicli per (N-1) volte.
– Per quel che abbiamo visto, il bubble sort esegue lo stesso
numero di cicli e di controlli. Ma è possibile, modificandolo
leggermente, incrementarne le prestazioni tenendo conto
che, se durante un ciclo non si effettua nessuno scambio,
allora il vettore e’ già ordinato e non e’ necessario eseguire
tutti i controlli… quindi nel caso peggiore i due algoritmi si
equivalgono, mentre nel caso migliore (lista già ordinata) il
bubble sort è “migliore”…
ALGORITMI: ESEMPI
• Somma
degli elementi dispari di un insieme
– Detto INS l’insieme di elementi considero un elemento X di
INS alla volta senza ripetizioni. Se X è dispari, sommo X a
un valore S inizialmente posto uguale a 0. Se X è pari non
compio alcuna azione
• Somma di due numeri X e Y
• Incrementare il valore di Z, inizialmente posto uguale
a X per Y volte
– poni Z = X
– poni U = 0
– finché U è diverso da Y
•
•
incrementa Z
incrementa U
– Il risultato è Z
(Z=Z+1)
(U=U+1)
ALGORITMI EQUIVALENTI (3)
ESEMPIO: calcolo del M.C.D. fra due interi M, N
• Algoritmo 1
–
–
–
–
Calcola l'insieme A dei divisori di M
Calcola l'insieme B dei divisori di N
Calcola l'insieme C dei divisori comuni = A ∩ B
Il risultato è il massimo dell’insieme C
• Algoritmo 2 (di Euclide)
 M (oppure N)
MCD (M,N) =  MCD (M-N, N)
 MCD (M, N-M)
se M=N
se M>N
se M<N
ALGORITMI EQUIVALENTI (4)
ESEMPIO: calcolo del M.C.D. fra due interi M, N
• Algoritmo 2 (di Euclide)
Finché M≠N:
– se M>N, sostituisci a M il valore M’ = M-N
– altrimenti sostituisci a N il valore N’ = N-M
– Il Massimo Comune Divisore è il valore finale ottenuto quando M e
N diventano uguali
 M (oppure N)
MCD (M,N) =  MCD (M-N, N)
 MCD (M, N-M)
se M=N
se M>N
se M<N