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