Presentazione di PowerPoint

Richiami di concetti generali
Lezione n°1
Prof.ssa Rossella Petreschi
Lezione del 1 /10/2013 del Corso di Algoritmica
Al-Khuwarizmi
La parola algoritmo deriva dalla latinizzazione del nome Abdallah
Mohamed Abu Jafar Ibn Musa al-Khuwarizmi al-Magusi
(780/850d.c).Matematico, astronomo, astrologo e geografo visse a
Baghdad presso la corte del califfo al-Ma’mun che lo nominò
responsabile della famosa biblioteca Bayt al-Hikma (casa della
speranza).
Fino al sec.XVII algoritmo indicava
il sistema di numerazione posizionale.
per via del testo
Algoritmi de numero indorum
I primi algoritmi (2000-1650 a.c.)
Problema n°51 del papiro di Rhind
Se ti viene detto: un triangolo di 10 khet di altezza e 4 khet la sua
base (Input)
Quale è la sua area?
Fare come si deve (Sequenza di operazioni)
Fai la metà di 4, cioè 2.
Fai la moltiplicazione di 10 per 2. E’ la sua area.
La sua area è 20.(Output)
I primi algoritmi (2000-1650 a.c.)
Da tavoletta babilonese
Il numero è 4;10 (Input)
Qual è il suo inverso?
Procedi come segue (Sequenza di operazioni)
Forma l’inverso di 10, troverai 6.
(10x600)(6x60-1)=1
Moltiplica 6 per 4 troverai 24.
Aggiungi 1 troverai 25.
Forma l’inverso di 25 troverai 2;24.
(25x600)(2x60-1+24x60-2)=1
Moltiplica 2;24 per 6. Troverai 14;24. (4x601+10)(14x60-2+24x60-3)=1
L’inverso è 14;24 (Output)
Questo è il modo di procedere.
L’algoritmo di Euclide
libro VII degli Elementi (IV SEC A.C.)
Supponiamo che siano dati due numeri AB e GD non primi tra loro e che GD sia il più piccolo.
Si deve trovare la più grande misura comune dei numeri AB e GD.
Se GD misura AB allora GD è la misura comune di AB e GD perchè GD misura anche se stesso; è evidente che
esso è la misura comune più grande poiché nessun numero maggiore di GD può misurare GD.
Ma se GD non misura AB e se togliamo il minore tra AB e GD dal maggiore resterà qualche numero che misura
ciò che rimane. Il resto non sarà uno, altrimenti i numeri AB e GD sarebbero primi tra loro, il che non è ipotizzato.
Supponiamo che GD misurando AB lasci AE più piccolo di lui, e che AE, misurando GD lasci GZ più piccolo di lui
e che infine GZ misuri AE. Poichè GZ misura AE e AE misura DZ, GZ misura DZ. Ma esso misura se stesso quindi
misura l’intero GD.
Ma GD misura BE dunque GZ misura EB, ma esso misura anche AE, quindi esso misura l’intero AB. Dunque GZ è
una misura comune di AB e GD.
Input: due numeri interi n ed m
Output: MCD(n,m)
Passo 1: Se n = m, MCD(n,m) = n;
Passo 2: altrimenti se m>n MCD(m-n,n)
altrimenti MCD(n-m,m) se n < m
Algoritmi
Secondo Donald E. Knuth dato un particolare input, un
algoritmo deve generare un output proseguendo per passi
successivi (sequenza di operazioni elementari)
caratterizzati dalle seguenti proprietà:
Finitezza
Effettività
Definitezza
The Art of Computer Programming. Volume 1: Fundamental Algorithms. (1975)
Finitezza
Ogni algoritmo deve sempre terminare dopo l’esecuzione di un
numero finito di passi.
Quando (raramente) si accetta la non terminazione di un algoritmo
si parla di procedura computazionale.
Esempio di procedura computazionale: il sistema operativo di un
computer progettato per controllare l’esecuzione di altri programmi
e per restare in stato di attesa quando nessun programma è in
esecuzione.
Effettività
Ogni algoritmo deve essere effettivamente
eseguibile, ovvero ogni operazione deve essere
sufficientemente di base da poter essere eseguita a
carta e penna in una quantità finita di tempo.
Esempio di mancanza di effettività:
la divisione di un numero naturale per 0.
Definitezza
Ogni passo di un algoritmo deve essere definito in modo
chiaro e non ambiguo, ovvero deve dar luogo alla stessa
sequenza di operazioni e di risultati, indipendentemente
da chi lo esegue e in qualunque momento venga eseguito.
Esempio di mancanza di definitezza: ricette di specialità
culinarie (che quindi non sono algoritmi), dove sono
molto diffusi i termini “a piacimento” o “quanto basta”.
Validazione
Una volta che un algoritmo è stato progettato bisogna
provarne la correttezza, ovvero bisogna dimostrare che
esso fornisce l’output corretto per ogni possibile input.
Solo dopo che è stato validato, un algoritmo può essere
trasformato in programma.
Programma
Programma è un algoritmo espresso in un opportuno
linguaggio di programmazione
I linguaggi di programmazione sono stati introdotti per
garantire la definitezza ed evitare le ambiguità, ovvero
progettati in modo che ogni enunciato ammesso dal
sistema abbia un unico significato quando interpretato da
un calcolatore.
Correttezza
Provare la correttezza di un programma vuol dire
verificare che il programma esprime in modo corretto
l’algoritmo che sta implementando.
Notare la differenza fra la validazione (che riguarda la
“filosofia “ dell’algoritmo) e la correttezza (che riguarda
l’analisi del programma).
Costo di un programma
L’esecuzione di un programma richiede il consumo di
risorse computazionali: spazio, tempo, processori. Poichè
il tempo è la misura più significativa, si ha che:
il costo di un programma è in genere calcolato rispetto al
tempo richiesto per la sua esecuzione e la definizione di
tempo di esecuzione, per essere robusta, deve essere
definita in modo indipendente dal modello di calcolo
adoperato, pertanto ci si può riferire direttamente al costo
di un algoritmo
Bontà di un algoritmo
La bontà di un algoritmo è determinata dal suo costo,
ovvero dal computo del numero di operazioni elementari
compiute dall’algoritmo stesso.
Una operazione è elementare se si considera indipendente
dalla dimensione degli operandi.
La complessità in tempo di un algoritmo permette di
stabilire un limite superiore al tempo di calcolo reale
dell’algoritmo: tempo reale = tempo 1 operazione
elementare × complessità
Costo dell’algoritmo di Euclide
(per sottrazione)
Input: due numeri interi n ed m
Output: MCD(n,m)
Passo 1: Se n = m, MCD(n,m) = n;
Passo 2: altrimenti se m>n MCD(m-n,n)
altrimenti MCD(n-m,m) se n < m
Esempio:
MCD (1001,2)=MCD (999,2)=MCD (997,2)=………=MCD (2,1)=MCD (2,1)=MCD (1,1)=1
Sono state necessarie 500 (1001 = 2x500 + 1) sottrazioni per arrivare al risultato, da cui si
evince che il calcolo del MCD per sottrazioni è proporzionale alle dimensioni di n ed m.
Ma se noi calcolassimo da subito il quoziente q ed il resto r della divisione di n per m
(n>m)?
Esempio:
1001 = 2x500 + 1;
2 = 2x1 + 0.
Costo dell’algoritmo di Euclide
(per divisione)
Input: due numeri interi n ed m
Output: MCD(n,m)
Passo 1: Se n < m, scambia n con m;
Passo 2: fintantochè m>0 calcola n = qm + r
sostituisci m al posto di n e r al posto di m
Ritorna (l’ultimo)n come MCD
Quanti passi in questo caso?
r < n/2 (poiché n>=m+r e m>r), quindi
dopo k passi consecutivi, m <= n/ 2K
ovvero sono sufficienti al più log2n passi per calcolare MCD(n,m),
da cui si evince che il calcolo del MCD per divisioni è proporzionale al numero di bits
necessari per rappresentare n.
Caso peggiore e caso medio
Analisi del caso peggiore
Il tempo è determinato considerando, per ciascuna dimensione,
l’istanza che richiede maggior tempo di calcolo.
Analisi del caso medio
Il tempo è determinato calcolando, per ciascuna dimensione, la media
dei tempi di calcolo per le istanze di quella dimensione. Il calcolo del
caso medio non è sempre possibile: per una buona stima occorre
conoscere la distribuzione di probabilità delle istanze del problema.
In generale, il tempo richiesto da un algoritmo cresce con la
dimensione dell’input.
In generale, ma non sempre…
Somma dei primi n numeri interi dipendente dall’input: O(n)
Input: un numero intero n
Output: S = somma dei primi n numeri interi
Passo 1: Si pone S = 0;
Passo 2: Si ripete S = S + i per i = 1, ..., n
Passo 3: Si fornisce S in output
Somma dei primi n numeri interi indipendente dall’input:O(1)
Input: un numero intero n
Output: S = somma dei primi n numeri interi
Passo 1: S = n x (n+1)/2;
Passo 3: Si fornisce S in output