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