algoritmi 109.22KB 2013-09-27 11:57:51

Transcript

algoritmi 109.22KB 2013-09-27 11:57:51
ALGORITMO
Un algoritmo è una sequenza finita di operazioni che porta alla realizzazione di un dato compito o
alla risoluzione di un dato problema.
Ogni operazione deve:
essere non ambigua
essere comprensibile dall’esecutore
essere eseguibile dall’esecutore
richiedere un tempo finito per essere eseguita
Esempi di problemi che possono essere risolti con un algoritmo:
preparare la torta Sacher
montare un mobile dell’Ikea
usare il lettore di DVD
usare l’automobile
disporre una sequenza di nomi in ordine alfabetico
sommare due numeri naturali in colonna
eseguire la moltiplicazione tra due polinomi
calcolare le soluzioni di un’equazione
Esempio di algoritmo (non iterativo): preparare la torta Sacher
Accendere il forno e impostare la temperatura a 180°.
Amalgamare 140g di burro morbido con 40g di zucchero a velo, un pizzico di sale e 1 bustina di
vanillina.
Separare 6 in tuorli e albumi.
Aggiungere i 6 tuorli al composto, uno alla volta.
Aggiungere 130g di cioccolato fondente, precedentemente sciolto a bagnomaria.
Montare i 6 albumi a neve con 180g di zucchero semolato.
Incorporare, nel composto, 180g di farina e gli albumi montati, alternando farina e albumi in piccole
quantità.
Trasferire il composto in uno stampo cilindrico di 24cm di diametro imburrato ai lati e rivestito con
un disco di carta da forno sul fondo.
Cuocere la torta in forno per 50 minuti.
Una volta cotta, farla intiepidire e rovesciarla su una gratella disposta su un foglio di carta da forno.
Tagliare la torta a metà orizzontalmente e farcirla con 100g di confettura di albicocche, già passata al
setaccio e riscaldata.
Ricomporre la torta e spennellarla con altri 100g di confettura di albicocche, scaldata ancora.
Sciogliere bene, a bagnomaria, altri 400g di cioccolato fondente.
Rovesciare il cioccolato fuso sulla torta e stenderlo rapidamente con una spatola flessibile, coprendo
la superficie e i bordi; conservarne 2 cucchiai per la decorazione.
Lasciare rassodare la torta in frigorifero per un'ora.
Formare un cono con un triangolo di carta da forno, fermandolo con
un punto metallico.
Riempirlo con il cioccolato fuso tenuto da parte e riscaldato e
scrivere Sacher sulla torta.
Abbiamo studiato e imparato algoritmi fin dalle scuole elementari, magari senza saperlo. Un esempio
è il seguente algoritmo per la somma di due numeri.
Esempio di algoritmo (iterativo): sommare due numeri naturali in colonna
1. Allinea a destra i due numeri.
2. Considera le cifre della colonna più a destra.
3. Assumi inizialmente il riporto uguale a 0.
4. Somma le cifre della colonna in considerazione e aggiungi il riporto.
5. Se il risultato ottenuto eseguendo la istr. 4 è < 10, scrivi la cifra risultante nella colonna in
considerazione, assegna al riporto il valore 0 e vai all’istr. 7.
6. Se il risultato ottenuto eseguendo la istr. 4 è ≥10, sottrai 10 e scrivi la cifra risultante nella colonna
in considerazione, poni il riporto = 1 per la colonna immediatamente a sinistra e vai all’istr. 7.
7. Spostati sulla colonna immediatamente a sinistra: se non vi sono cifre ed il riporto = 0 fermati,
altrimenti vai all’istr. 4.
Ad esempio:
47+
25
--72
Esempio di algoritmo: usare l’automobile
1. Sbloccare la portiera con la chiave
2. Aprire la portiera
3. Sedersi al posto di guida
4. Chiudere la portiera
5. Allacciare la cintura di sicurezza
6. Schiacciare la frizione
7. Avviare il motore
8. Inserire la prima marcia
9. Rilasciare “delicatamente” la frizione per partire
N.B.: i vari passi sono eseguiti in sequenza ed il loro ordine è essenziale per la correttezza
dell’algoritmo; provare ad esempio a scambiare il passo 8 con il 6 per rendersene conto!
Esempi di problemi non risolubili con algoritmi
I problemi che si presentano spontaneamente sono tutti risolubili con algoritmi. In effetti non è facile
individuare un problema che non lo sia. Ebbene, il matematico inglese Alan Turing, nel 1930,
formalizzò il seguente:
Problema dell’arresto
Presi ad arbitrio un algoritmo A e l’insieme D dei suoi dati di ingresso, decidere in tempo finito se
l’esecuzione di A su D termina o no.
Questo problema consiste nel chiedersi se un generico algoritmo termina la sua esecuzione, oppure
“va in ciclo”, ovvero continua a ripetere la stessa sequenza di operazioni all’infinito.
Ebbene: Turing ha dimostrato che è impossibile riuscire a dimostrare se un algoritmo arbitrario si
arresta e termina la sua esecuzione. Ovvero il problema dell’arresto è, come si dice, indecidibile.
Questo significa che non esiste un algoritmo per il problema dell’arresto.
Turing ci ha quindi insegnato che non esistono algoritmi che decidono il comportamento di altri
algoritmi esaminandoli “dall’esterno”, cioè senza passare dalla loro esecuzione.
Un altro celebre problema per cui non esistono algoritmi è il:
Decimo problema di Hilbert
Il cosiddetto “decimo problema di Hilbert”, fa parte di una lista di 23 problemi stilata dal matematico
tedesco David Hilbert e presentati l’8 agosto 1900 nella sua conferenza del Congresso internazionale
dei matematici svoltasi a Parigi in quell’anno: questa lista costituiva un elenco di problemi ancora
irrisolti a quella data e molti di essi hanno avuto una notevole portata nella matematica del XX
secolo.
Dunque, il decimo problema di Hilbert è il seguente: dato un polinomio p arbitrario in n lettere,
stabilire se l’equazione p=0 ammette soluzioni (n-uple) intere. Ad esempio l’equazione x 2 − 2 = 0
non ha alcuna soluzione intera, l’equazione x − 2 = 0 ha una sola soluzione intera, l’equazione
x 2 − 4 = 0 ha due soluzioni intere, mentre l’equazione x 2 − y = 0 ha infinite soluzioni intere.
Ebbene: solo nel 1970 il matematico russo Yuri Matiyasevich, allora poco più che ventenne, dimostrò
che per questo problema non esistono algoritmi risolutivi.
Ci sono addirittura problemi per i quali, attualmente, non si sa se esistano o meno algoritmi risolutivi.
Uno è il seguente:
Grid problem
Data una griglia di dimensioni note (nell’esempio 6x8), calcolare il numero di cammini da A a B.
B
A
Ebbene: ad oggi non si sa se esista o meno un algoritmo che permetta di rispondere alla domanda.
Nota: la parola “algoritmo” trae origine da Muhammad ibn Musa al-Khwarizmi (pronuncia alcharismi), nome di un matematico persiano vissuto nel IX secolo nella regione centro-asiatica
corrispondente all’odierno Uzbekistan. Al-Khwarizmi è famoso per averci insegnato i cosiddetti
numeri arabi: la sua opera “(Libro) di al-Khwarizmi sui numeri indiani” fu tradotta in latino come
“Algorismi de numero Indorum”. Fu su questo libro che l’Europa intera imparò ad usare il sistema di
notazione decimale posizionale. Le procedure che permettevano di effettuare calcoli in notazione
decimale divennero così note come “algorismi” o “algoritmi” e più tardi quest’ultimo termine fu
applicato in generale alle procedure di calcolo necessarie per ottenere un determinato risultato.
Computer
Chi (o che cosa) è l’esecutore della sequenza di operazioni costituenti un algoritmo?
Può essere un uomo (cuoco che prepara la torta Sacher…) oppure una macchina appositamente
progettata e costruita. In quest’ultimo caso sono possibili varie tecnologie: meccanica, elettronica,
biologica…
L’esecutore può essere capace di eseguire solo compiti predeterminati (come ad esempio la macchina
che fa il caffè a monete) oppure avere la capacità di eseguire compiti diversi, ridefinibili di volta in
volta (ad esempio la cellula, che, durante la sintesi proteica, può creare qualsiasi successione di
amminoacidi diversi, sulla base del tratto di codice genetico che sta leggendo): nel primo caso si
parla di esecutore non programmabile, nel secondo caso di esecutore programmabile.
Il computer (elaboratore o calcolatore, in italiano) è una macchina elettronica programmabile, capace
di eseguire sequenze di operazioni logiche, aritmetiche e di controllo. Ad esempio un computer può
essere programmato in modo che esegua la somma di una qualsiasi sequenza di numeri interi.
INFORMAZIONE
Definizione operativa dell’informazione
Il concetto di informazione è legato a quello di scelta. Vediamo un esempio. Consideriamo una
lampadina, che, una volta montata nel portalampade, può essere accesa o spenta. Per la lampadina
possiamo cioè scegliere tra due soli stati: accesa o spenta. L’unità di misura dell’informazione, legata
al caso della scelta tra 2 sole configurazioni possibili, è detta bit. Si dirà quindi che, per esprimere (o
comunicare) lo stato della lampadina serve 1 bit di informazione.
Un bit d’informazione equivale quindi, per definizione, ad una scelta tra 2 casi possibili, detta anche
scelta binaria. La definizione è operativa, nel senso che si è effettuata, si è operata una scelta.
Si noti che considerando meno di 2 configurazioni, non si ha scelta, per cui non c’è informazione!
E se le configurazioni sono più di 2, quanto vale l’informazione? Intuitivamente ci si aspetta che la
quantità di informazione sia maggiore. Vediamolo con un esempio.
Quanta informazione serve per comunicare in che giorno della settimana siamo?
In questo caso la scelta è tra 7 casi possibili (i giorni della settimana), che però può essere ottenuta
effettuando 3 scelte binarie, come segue:
L’informazione legata al problema esposto è quindi di 3 bit, visto che occorrono, al minimo, 3 scelte
binarie.
Più in generale, si può dimostrare che se c è il numero di configurazioni ammissibili dal sistema in
esame, l’informazione espressa in bit è il minimo esponente n da dare a 2 affinché 2 n sia maggiore o
uguale al numero c. In maniera più coincisa (matematica) si dice che l’informazione vale log 2 c 
bit, ovvero la parte intera superiore del logaritmo in base 2 di c.
Potenze di 2
n
2n
n
2n
1
2
3
4
5
6
7
8
9
10
2
4
8
16
32
64
128
256
512
1024
11
12
13
14
15
16
17
18
19
20
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
Quantità di informazione necessaria per la scelta di una configurazione tra c possibili
c
log 2 c  bit
c
log 2 c  bit
2
3e4
da 5 a 8
da 9 a 16
da 17 a 32
da 33 a 64
da 65 a 128
da 129 a 256
da 257 a 512
da 513 a 1024
1 bit
2 bit
3 bit
4 bit
5 bit
6 bit
7 bit
8 bit
9 bit
10 bit
da 1025 a 2048
da 2049 a 4096
da 4097 a 8192
da 8193 a 16384
da 16385 a 32768
da 32768 a 65536
da 65537 a 131072
da 131073 a 262144
da 262145 a 524288
da 524289 a 1048576
11 bit
12 bit
13 bit
14 bit
15 bit
16 bit
17 bit
18 bit
19 bit
20 bit
Esempi
Scelta
un colore mostrato dal semaforo
un seme della carta
una cifra decimale
una lettera alfabeto
un numero della tombola
un abitante di San Giovanni Valdarno
un italiano
un indirizzo Internet IPv4
un numero di telefono GSM
Informazione
2 bit
2 bit
4 bit
5 bit
7 bit
15 bit
26 bit
32 bit
34 bit
una molecola d’acqua in 1kg d’acqua
una chiave di crittografia AES
un fotogramma di uno schermo a colori da 800pixel x 600pixel
un ulbum musicale archiviato in un CD audio
un genoma umano
un film archiviato in un Blue-ray disk
85 bit
128 bit
11520000 bit
6265728000 bit
6400000000 bit
215000000000 bit
Multipli del bit di uso comune
Nome
kilobit
megabit
gigabit
byte
kilobyte
megabyte
gigabyte
kibibyte
mebibyte
gibibyte
Valore
10 3 bit = 1000 bit
10 6 bit = 1000000 bit
10 9 bit = 1000000000 bit
8 bit
10 3 B = 8000 bit
10 6 B = 8000000 bit
10 9 B = 8000000000 bit
210 B = 1024 B = 8192 bit
2 20 B = 1048576 B = 8388608 bit
2 30 B = 1073741824 B = 8589934592 bit
Simbolo
1 kbit (o 1 kb)
1 Mbit (o 1 Mb)
1 Gbit (o 1 Gb)
1B
1 kB
1 MB
1 GB
1 KiB
1 MiB
1 GiB
INFORMATICA
Cos’è l’informatica?
L’informatica (computer science, in inglese) è la scienza che studia il trattamento dell’informazione
(rappresentazione, acquisizione, memorizzazione, analisi, elaborazione, trasmissione) mediante
procedure automatizzabili.
Ovvero: il compito dell’informatica è quello di formulare algoritmi per risolvere problemi riguardanti
il trattamento dell’informazione. Per le sue peculiarità (estrema versatilità, alta velocità di
esecuzione, basso costo), il computer è l’esecutore cui l’informatica si rivolge.
Nota: la parola “informatica” è un neologismo, creato sul modello del termine greco “matematica”,
che deriva dalla contrazione delle due parole “informazione” e “automatica”.
Linguaggio di programmazione
Un linguaggio di programmazione (programming language, in inglese) è un insieme di simboli e
regole, comprensibili all’esecutore, per rappresentare la sequenza di operazioni di un algoritmo e la
loro concatenazione.
Programma
E’ un algoritmo scritto in un qualsiasi linguaggio di programmazione, al fine di comunicare
all’esecutore (computer, solitamente) le azioni da eseguire.
Processo
Un processo (task, in inglese) è un programma in esecuzione su un computer.
Programmazione
E’ l’insieme delle attività che, partendo dall’analisi del problema, ne definisce l’algoritmo risolutivo
e lo traduce poi in programma.
Programmatore (programmer, in inglese)
E’ la persona che effettua la programmazione.
Flow chart
Un linguaggio di programmazione di particolare importanza è il diagramma di flusso (flow chart),
detto anche diagramma a blocchi. Questo linguaggio usa simboli grafici diversi per rappresentare i
vari tipi di operazioni che si possono avere in un algoritmo:
un rombo: un blocco di controllo (condizione o test);
un rettangolo: un blocco azione (detto anche imperativo, cioè del tipo “fai qualcosa”);
un rettangolo con un simbolo di maggiore a sinistra: un blocco di ingresso;
un rettangolo con un simbolo di maggiore a destra: un blocco di uscita;
un’ellisse: il blocco iniziale e il blocco finale.
Anche la sequenza di esecuzione delle varie operazioni è ottenuta in maniera grafica, con linee di
connessione orientate.
L’esempio che segue è il programma per l’esecuzione della moltiplicazione di due numeri interi
espresso con un diagramma a blocchi.
Esercizi
Risolvere gli esercizi sugli algoritmi presenti in www.liceisgv.it/docenti/baldi, usando come
linguaggio di programmazione il diagramma di flusso, scrivendo e provando i programmi
sull’interprete JavaBlock di Jakub Konieczny, presente allo stesso link sopra richiamato.
CC-BY-NC 2013 by Prof. Ing. Gabriele Baldi
www.liceisgv.it/docenti/baldi