proprieta` di efficienza e correttezza dei programmi

Programmazione 1: Introduzione alla
Programmazione usando Java
Introduzione alle proprietà di complessità e correttezza degli algoritmi
Consideriamo il problema della somma dei primi 100 numeri interi positivi, cioè la somma
1+2+3+...+ 99+100 e pensiamo di risolverlo usando una calcolatrice.
Posso: 1.azzerare il visore, 2.battere e registrare 1, 3.sommare, 4.battere 2, 5.sommare, ...,
198.battere 99, 199.sommare, 200.battere 100, 201.sommare. A questo punto il visore mostra
la somma voluta 5050.
Oppure posso conoscere il risultato di Gauss secondo il quale 1+2+3+...+ 99+100 = 50 * 101,
e quindi usare la calcolatrice come segue: 1.azzerare il visore, 2.battere e registrare 50, 3.
battere 101, 4.fare il prodotto. A questo punto il visore mostra 5050.
I due diversi procedimenti per ottenere la somma voluta sono due strategie o algoritmi
differenti di uso della calcolatrice per risolvere lo stesso problema.
Se poi voglio sommare i primi 200 numeri interi le due precedenti strategie adattate al nuovo
caso diventano:
- 1.azzerare il visore, 2.battere e registrare 1, 3.sommare, 4.battere 2, 5.sommare, ...,
398.battere 199, 399.sommare, 400.battere 200, 401.sommare. A questo punto il visore mostra
la somma voluta 20100.
- 1.azzerare il visore, 2.battere e registrare 100, 3. battere 201, 4.fare il prodotto. A questo
punto il visore mostra 20100 cioè 100 * 201.
Ci rendiamo subito conto che la prima strategia richiede più operazioni sulla calcolatrice.
Nell’ipotesi che le operazioni richiedano lo stesso tempo, ipotesi molto semplificativa ma che
fa al caso nostro, la prima strategia richiede 201 operazioni nel primo caso e 401 nel secondo:
all’incirca il doppio come doppio è il numero di addendi della somma voluta nei due casi.
La seconda strategia richiede 4 operazioni in ogni caso; quindi un numero di operazioni
costante indipendentemente dal numero di addendi nella somma voluta.
Diremo che la prima strategia ha complessitá proporzionale al numero di addendi da
sommare poichè richiede un numero di operazioni proporzionale alla quantitá di addendi, la
seconda strategia ha invece complessitá costante perché il numero di operazioni è sempre lo
stesso a prescindere dal numero di addendi da sommare. La prima strategia è piú complessa o
piú costosa in termini di tempo o numero di operazioni richieste rispetto alla seconda strategia.
E’ lecito si abbia il dubbio che le due strategie differenti sopra indicate risolvano lo stesso
problema cioè che calcolino la stessa somma. In particolare, il risultato di Gauss è meno ovvio
del primo cammino di calcolo e deve essere dimostrato nella sua correttezza per convincerci
che e’ una corretta strategia alternativa alla strategia piú ovvia ma piú lunga.
Nel progetto e poi specifica dei programmi che saranno oggetto del corso di Programmazione
1, fin dai casi piú semplici completeremo molti esercizi con asserzioni. A chi conosce cosa
sono i commenti in un programma, le asserzioni appariranno nei nostri programmi come
commenti particolari. Le asserzioni possono essere usate per dimostrare la correttezza di un
algoritmo specificato in modo formale. Tuttavia questo uso non è scopo del nostro corso e
viene lasciato agli studenti di ottima volontá mentre noi faremo soltanto ragionamente
informali su come si ottenga una asserzione finale alle annotazioni di una sequenza di codice o
di un metodo.