46
1 Introduzione agli Algoritmi Prof. Francesco Pappalardo

Introduzione agli Algoritmi - francescopappalardo.net · •Schemi fondamentali di Composizione; •Algoritmi iterativie Algoritmiricorsivi. ... Gli oggetti (dati) sui quali si opera

Embed Size (px)

Citation preview

1

Introduzione agli Algoritmi

Prof. Francesco Pappalardo

Argomenti trattati

• A l g o r i t m i ; • P r o p r i e t à d e g l i A l g o r i t m i ;• D e s c r i z i o n e ;• C o s t a n t i e V a r i a b i l i ;

• P r o p o s i z i o n i e P r e d i c a t i ;

• D i a g r a m m i a b l o c c h i ;

• S c h e m i f o n d a m e n t a l i d iC o m p o s i z i o n e ;

• A l g o r i t m i i t e r a t i v i e A l g o r i t m i r i c o r s i v i

Algoritmo: definizione

Il procedimento di analisi e programmazione è l'insieme di tutte quelle attivitàche servonoformulazione

Scopo

per risolvere problemidel problema fino alladell'analisi è quello di

utilizzando un elaboratore, e che vanno dallapredisposizione dell'elaboratore.definire un algori tmo .

ALGORITMO: un elenco finito di istruzioni che specificano unaserie di operazioni, eseguendo le quali è possibile risolvere ogniproblema di un dato tipo (classe di problemi).

Un algoritmo può essere utilizzato per risolvere un particolare problema. Il problemadeve essere del tipo del quale l'algoritmo fornisce la soluzione.

In questo caso l 'uomo può eseguire le istruzioni indicate nell'algoritmo suidati che caratterizzano il particolare problema da risolvere.

Un algoritmo non può essere eseguito direttamente da un elaboratore.

Programma: definizione

• Scopo della programmazione è quello di definire un programma.

• Un programma è la descrizione di cosa devefare un elaboratore (insieme univoco di istruzioni) per risolvere ogni problema diun dato tipo.

• Un programma è eseguibile da parte di un elaboratore

• Programma -> descrizione di un algoritmo in una forma “comprensibile” per l’elaboratore

Linguaggio di programmazione: definizione

• Un linguaggio di programmazione è un linguaggio rigoroso che permette di descrivere un algoritmo in modo che esso diventi un programma, cioè in modo che esso possa essere eseguito da un elaboratore.

• La soluzione di un particolare problema di un dato tipo si ottiene eseguendo il programma formulato per la soluzione di quel tipo di problemi e specificando i dati caratteristicidel problema particolare.

• I risultati ottenuti dalla esecuzione del programma rappresentano la soluzione richiesta.

• L’esecuzione di un programma è anche detta elaborazione.

A n a l o g i e t r a u o m o e d e l a b o r a t o r e

ANALISI

ALGORITMO+

DATI

RISULTATO

PROGRAMMAZIONE

PROGRAMMA+

DATI

RISULTATO

ESECUZIONE DA PARTEDELL’UOMO +MACCHINA CALCOLATRICE

ESECUZIONE DA PARTEDELL’ELABORATORE

A n a l i s i e p r o g r a m m a z i o n e

problema

ANALISI

algoritmo

PROGRAMMAZIONE

programma

ELABORAZIONE

risultato

dati + elaboratore

Schema per la soluzione di nuovi classi di problemi

Schema per la soluzionedi problemi già risolticon nuovi dati

Primi esempi di algoritmo• Esempio: Ordinamento di un mazzo d i 40 carte

• Problema : Si supponga di avere un mazzo da 40 carte mescolato. Si vuoleordinare il mazzo di carte in modo che le carte con il seme cuori siano posteper prime, seguite dalle carte con seme quadri, fiori e picche. Le carte di unostesso seme sono ordinate dall'asso al re.

• Algoritmo (possibi le) :

1. inizio dell’algoritmo;

2. Suddividere il mazzo in 4 mazzetti; ciascun mazzetto è costituito da tutte le carte

dello stesso seme;

3. Ordinare le carte di ciascun mazzetto dall’asso al re;

4. Prendere nell’ordine il mazzetto dei cuori, dei quadri, dei fiori e delle picche;

5. fine dell'algoritmo.

Primi esempi di algoritmo (segue)• Esempio: Calcolo del le radici del le equazioni di secondo grado.

• Problema : Determinare le radici x1, x2, dell’equazione di secondo grado ax2 +bx+ c=0. Il procedimento prevede il calcolo del determinante Δ =b2 - 4ac. Se Δ > 0 si hanno due radici reali e distinte x1 e x2 = [-b ± √(Δ) ] /2a. Se Δ = 0 si hanno due radici reali coincidenti x1 e x2 = -b/2a. Se Δ< 0 non si hanno radici nel campo dei numeri reali.

• Algoritmo (possibi le) :

1. inizio dell’algoritmo;

2. Introdurre i valori di a, b e c;

3. Calcolare Δ =b2 - 4ac;

4. Se Δ > 0 porre x1=[-b + √(Δ) ] /2a e x2=[-b - √(Δ) ] /2a e poi passare all’istruzione 7;

5. Se Δ = 0 porre x1=x2= -b /2a e poi passare all’istruzione 7;

6. Se Δ < 0 restituire il messaggio “non esistono radici reali” e poi passare all’istruzione 8;

7. Restituire x1 e x2;

8. Fine dell’algoritmo.

A l g o r i t m o : i s t r u z i o n i e d a t i

Fino ad adesso sono state utilizzate delle proposizioni per descrivere un algoritmo. Le proposizioni sono composte di due parti:

• operazioni da eseguire (ISTRUZIONI)• oggetti sui quali eseguire le operazioni al fine di ottenere i risultati (DATI).

Esempi sugli algoritmi appena visti:

ISTRUZIONI DATI

calcola b2 - 4ac 4, a, b, c,porre….x1=x2 x1 e x2suddividere… in quattro mazzetti mazzo di carte

I DATI: Costanti e variabili

Gli oggetti (dati) sui quali si opera per mezzo d i un algoritmosono solitamente di 2 tipi:

costante: tipo di dato che rimane sempre lo stesso durante una esecuzione dell’algoritmo e anche per esecuzioni diverse dellostesso algoritmo.

Variabile: Una variabile è una coppia <nome,valore>. Essa può essere immaginata come una scatola sulla quale è scritto unnome. Questa scatola può contenere un valore che può cambiare durante l’esecuzione dell’algoritmo.

v a l o r e

n o m e

Costanti e variabili

• Data una variabile <x,v> si dice che x è il nome della variabile e che v è il valore attuale della variabile di nome x (oppure, più semplicemente, che v è il valore di x).

• Un dato variabile risulta indeterminato al momento della definizione dell'algoritmo;

• il dato però corrisponde a un valore ben preciso durante ogni esecuzione dell’algoritmo.

• Esempio: Radici di una equazione di 2° grado.• Si consideri il passo 3 "Δ =b2 - 4ac" i dati a, b, c non corrispondono a nessun

valore finché non si esegue l'algoritmo per una ben precisa equazione di 2°grado, ad esempio x2 - 9x - 4 = 0.

• Solo durante l’esecuzione dell’algoritmo (in particolare al passo 2) è possibile stabilire che i nomi a, b, c corrispondono, rispettivamente, ai numeri 1; - 9; - 4!

L’istruzione di assegnamento

L’istruzione di assegnamento (assegnazione) o, più semplicemente, assegnamento è quella particolare istruzione che permette di definire il valore attuale di una variabile.

Quel valore resta inalterato finché una successiva assegnazione non modifica il valore stesso.

L'assegnazione è rappresentata da ←

La forma generale dell’assegnazione è:

nome di variabile ← espressione

e si legge: assegna a “nome di variabile” il valore di “espressione”.

L'espressione a destra di ← deve essere formata utilizzando costanti, nomi di variabilie/o simboli di operazione.

Assegnazione (segue)

A d e s e m p i o , s e a b b i a m o

6

b

d o p o l ’ o p e r a z i o n e d i a s s e g n a z i o n e a ← b + c

6

a b

c

c

Utilità delle assegnazioni

Con l'utilizzo delle variabili e della assegnazione è possibile esprimere in modopiù conciso le azioni descritte in un algoritmo. Ad esempio, una operazionecome "calcolare il volume di un parallelepipedo per mezzo del prodotto deivalori delle tre dimensioni" può essere espressa come:

volume ← lunghezza X larghezza X altezza

I nomi delle variabili sono arbitrari;

È di solito opportuno scegliere il nome di una variabile in modo che ricordi ilsignificato del valore associato.

In un algoritmo è sempre necessario rispettare la regola dell’ordinamento:

Ogni volta che una variabile compare a destra di una operazione di assegnazioneè necessario che a quella variabile sia stato precedentemente già associato un

valore!!!

Algoritmo: Tipi di “istruzione”

a. istruzioni operative: istruzioni che effettivamente producono deirisultati, se eseguite;

b. istruzioni di controllo: istruzioni che controllano il verificarsi o meno di condizioni specificate. In base al risultato del controllodeterminano l’esecuzione di alcune istruzioni anziché altre.

c. Istruzioni di salto: istruzioni che alterano il normale ordine di esecuzione dell’algoritmo, specificando esplicitamente quale sia la successiva istruzione da eseguire.

Due tipologie:

• Salto condizionato: l 'effettiva esecuzione del salto sia vincolataal verificarsi di una condizione specificata (include al suo interno una istruzione di controllo).

• Salto incondizionato : che il salto viene eseguito tutte levolte che l 'istruzione è eseguita;

Algoritmo: tipi di “istruzione” (segue)

d. istruzione di inizio esecuzione: indica l’inizio dell’esecuzionedell'algoritmo;

e. istruzione di fine esecuzione: indica la fine dell 'esecuzionedell'algoritmo;

f. istruzione di I/O (o trasmissione): indicano come unatrasmissione di dati o messaggi debba avvenire tra l’algoritmo el’ambiente esterno.

Possono essere:

• di ingresso o input (di let tura): i valori vengono trasmessi dau n ambiente esterno all'interno dell'algoritmo oppure istruzioni

• di uscita o output (di scr i t tura): i valori debbono esseretrasmessi dall'algoritmo verso l 'ambiente esterno.

Esempio tipo di ' ' istruzione' '(algoritmo radici equazione secondo grado)

1. inizio dell’algoritmo;

2. Introdurre i valori di a, b e c;

3. Calcolare Δ ← b2 - 4ac;

4. Se Δ > 0 porre x1 ←[-b + √(Δ) ] /2a e x2 ←[-b - √(Δ) ] /2a e poi passare all’istruzione 7;

5. Se Δ = 0 porre x1 ← x2 ← -b /2a e poi passare all’istruzione 7;

6. Se Δ < 0 restituire il messaggio “non esistono radici reali” e poi passare all’istruzione 8;

7. Restituire x1 e x2;

8. Fine dell’algoritmo.

Istruzione di inizio esecuzione

Istruzione di fine esecuzione

Istruzione di output

Istruzione di input

Istruzione operativa

Istruzioni di

controllo

Istruzione di salto

Istruzione di salto

Istruzione di salto

Una proposizione è un costrutto linguistico del quale si può dire se è vero o falso. Ad esempio:

Roma è la capitale della Francia; 3 è un numero intero;1 è un numero dispari;

sono proposizioni; la prima è falsa altre due sono vere.Viceversa le seguenti non sono proporzioni

Luigi, leggi quel libro! arrivederci a tutti.

Il valore di verità di una proposizione è l'essere vera o falsa.

Una proposizione è un predicato se in essa appaiono delle variabili, e il valorevariabili determina il valore di verità della proposizione stessa.

Esempio:la variabile età è minore di 30;la variabile base ha un valore maggiore di quello della variabile altezza

Proposizioni e predicati

Valutazione del predicato è l'operazione che permette di determinare se il predicato è vero o falso sostituendo alle variabili i loro valori attuali.I due valori "vero" o "falso" sono detti valori logici o valori booleani.

In forma più concisa possiamo scrivere:

età < 30 base > altezza

Per la scrittura dei predicati è possibile utilizzare i seguenti simboli, dettioperatori relazionali oppure operatori d i confronto:

= uguale> maggiore≥ maggiore o uguale

≠ diverso< minore≤ minore o uguale

I predicati che contengono un solo operatore relazionale sono dettipredicati semplici.

Valutazione di un predicato

Predicati compostiÈ inoltre possibile utilizzare all’interno di un predicato i seguenti operatori booleani:

• AND (indicato anche con ^ )

• OR ( indicato anche con v )

• NOT (indicato anche con il simbolo di soprasegnato)

I predicati nei quali compare almeno un simbolo NOT, AND, OR sono detti predicati composti.

La tavola di verità di un predicato composto è un modo di descrivere il significato un predicato.Essa consiste nello specificare il valore del predicato per ognuna delle possibilicombinazioni degli argomenti del predicato.

Le tavole di verità dei predicati p AND q e p OR q sono le seguenti:

vero vero vero vero vero vero

falso vero falso vero vero falsofalso falso vero vero falso verofalso falso falso falso falso falso

p AND q p q p OR q p q

Analisi di algoritmi

Un algoritmo si ottiene come risultato di un procedimento di analisi che può essere suddiviso in tre fasi:

a) definizione del problema: non si deve riferire ad un casoconcreto, ma casi generali.

b) scelta del metodo di soluzione: in base alle conoscenzepossedute si definisce il metodo da seguire per risolvere il problema;

c) descrizione delle operazioni o sviluppo dell’algoritmo: una volta scelto il metodo si descrivono le operazioni che devonoessere eseguite per risolvere il problema scelto.

Analisi di algoritmi. Metodo delle scomposizioni successive

Il punto di partenza è la definizione del problema. Si ottiene poi una primascomposizione del problema scomponendo il problema in sottoproblemi e scegliendo perciascuno di essi il metodo di soluzione.

Ciascun sottoproblema può successivamente essere riformulato fornendo unadescrizione sempre più dettagliata ottenendo così una seconda scomposizione del problema,una terza scomposizione del problema e così via fino ad ottenere una scomposizione, dettascomposizione finale del problema che contenga solo descrizioni di operazioni direttamenteeseguibili.

Questa successione di operazioni direttamente eseguibili è l’algoritmo.

Nei problemi particolarmente semplici, la prima scomposizione può esseredirettamente composta da operazioni direttamente eseguibili.

Il metodo delle scomposizioni successive risulta particolarmente utile quando iproblemi da risolvere sono complicati. Gli esempi successivi sono introdotti soprattutto a scopoillustrativo.

Analisi di algoritmi (segue)

Esempio: Calcolare la somma delle prime n potenze del 2. È noto che:

Pertanto questa notazione algebrica fornisce ilmetodo per la soluzione delproblema posto. In questo caso la scelta del metodo coincide con la descrizionedelle operazionidirettamente eseguibili.

L'algoritmo, ottenuto direttamente come prima scomposizione delproblema, è:

1) Inizio dell’algoritmo2) acquisire dall’esterno il valore di n;3) a ←2n

4) b ← a - 15) c ← a + b6) Restituire c7) Fine dell’algoritmo

Analisi di algoritmi (segue)

Metodologie per la soluzione dei problemi

• Come già detto, in base alle conoscenze possedute si definisce il metodo da seguire. Ad esempio, se si conoscono le formule per il calcolo delle radici dell’equazione di secondo grado, è possibile usare quelle.

• Per molti problemi (ad esempio algoritmi di ordinamento e cammino minimo) è possibile utilizzare delle metodologie più avanzate

• La scomposizione del problema in sottoproblemi più piccoli (e quindi più semplici da risolvere) o approccio top-down è un possibile procedimento per approcciarsi ad un problema. Questo tipo di approccio è anche conosciuto comedivide et impera o divide and conquer

• Un altro approccio di che più essere utilizzato è l’approccio bottom up, che parte dal caso base (semplice) e costruisce via via una soluzione generale.

26

Flowcharts(diagrammi di flusso o a blocchi)

• La diagrammazione a blocchi è un possibile linguaggio generalizzato per la rappresentazione degli algoritmi

• Il diagramma a blocchi o flowchart permette di realizzare una descrizione grafica di un algoritmo

• Un diagramma a blocchi indica il flusso (cioè la sequenza) delle operazioni da eseguire per realizzare la trasformazione, descritta nell'algoritmo, dei dati iniziali per ottenere i risultati finali.

-

Flowcharts (segue)

• Un particolare simbolo grafico, detto bloccoelementare o più semplicemente blocco , èassociato ad ogni tipo di istruzione.

• Ogni istruzione dell’algoritmo è rappresentataall'interno di un blocco la cui forma

grafica è determinata dal tipo dell’istruzione.

• I blocchi sono collegati tra loro da frecce cheindicano gli schemi di flusso, cioè il susseguirsidelle azioni elementari.

Flowcharts (segue)

Un diagramma a blocchi è un insieme di blocchielementari costituito da:

a) un blocco iniziale;

b) un blocco finale;

c) un numero finito n (n ≥1) di blocchi di azione

e/ o di lettura-scrittura

d) un numero finito m (m ≥ 0) di blocchi di

controllo

Flowcharts (segue)

BEGIN END

A

LEGGI A SCRIVI A

Blocco di inizio Blocco finale

Blocco di controlloBlocco operativo

Blocco di I/O (lettura) Blocco di I/O (scrittura)

verofalso

Flowcharts: calcolo (segue)

Flowcharts (segue)E s e m p i o : D i a g r a m m a a b l o c c h i d e l l ' a l g o r i t m o p e r il c a l c o l o d iM . C . D . ( a , b )

Flowcharts (segue)

Si noti come l'operazione "scambiare i valori di a e b" è stata realizzata con la sequenza di assegnazioni

Infatti per scambiare i valori di due variabili è sempre necessaria una variabile di appoggio (in questo caso x) in quanto l'assegnazione è distruttiva nel senso che quando si assegna un nuovo valore ad una variabile non si ha memoria del suo valore precedente. Pertanto se le variabili a e b fossero:

una sequenza di assegnazioni

avrebbe come effetto

Schemi fondamental i di composizioneFra tutti i possibili schemi di flusso ne esistono alcuni che sono detti schemi

fondamental i d i composizione; essi sono i seguenti.

N.B. Ogni schema fondamentale ha un unico punto di ingresso ed un unico punto di uscita.

Schema di sequenzaMette in evidenza la composizione di n schemi di flusso che devono essere eseguiti uno dopo l'altro. Graficamente appare come:

S c h e m i f o n d a m e n t a l i d i c o m p o s i z i o n e ( s e g u e )

Schema di selezioneEsiste un blocco di controllo. La condizione indicata determina due diversi comportamenti; uno da seguire nel caso che la condizione abbia valore di verità vero, l’altro nel caso abbia valore di verità falso.

S c h e m i d i i t e r a z i o n e

Mette in evidenza il fatto che uno stesso schema S deve essere ripetutamente eseguito più volte. Due possibili modi di iterazione sono illustrati nell’immagine seguente:

a) lo schema S può anche non essere mai eseguito, nel caso che la condizione C sia subito falsab) S è eseguito sempre almeno una volta.

In a) S è eseguito finché la condizione C è vera (iterazione per vero) sulla condizione C; in b) si ha una iterazione per falso ( S è eseguito finché la condizione C è falsa).

Gli schemi di flusso sono aperti quando si ha una sola esecuzione di una sequenza di blocchi elementari; Gli schemi di flusso sono chiusi quando si può avere più di una esecuzione di una sequenza di blocchi elementari.

Gli schemi di sequenza e di selezione sono aperti, lo schema di iterazione è chiuso.

I Cicli

Un ciclo rappresenta un particolare schema di iterazione.

Un ciclo è definito quando si conosce a priori il numero di volte che deve essere eseguito. Un ciclo definito è detto anche ciclo enumerativo.

In questo caso si usa la tecnica del contatore: una variabile, detta contatore del ciclo, che conta quante volte istruzioni del ciclo sono state eseguite.

Il contatore del ciclo può essere utilizzato in due modi:

Incremento del contatore: il contatore viene inizializzato ad un valore minimo, ad esempio 0, e incrementato di uno tutte le volte che il ciclo è eseguito. Si ha una uscita dal ciclo quando il valore del contatore è uguale al numero prefissato di volte che il ciclo deve essere eseguito (vedi esempio precedente).

Decremento del contatore: il contatore viene inizializzato con un valore uguale al numero di volte che il ciclo deve essere eseguito e decrementato di uno ogni volta che il ciclo è eseguito. Si ha una uscita quando il valore del contatore raggiunge il valore 0.

Un ciclo è indefinito quando non è possibile conoscere a priori quante volte deve essere eseguito. In questo caso la condizione di fine ciclo viene fatta controllando valore di una o più variabili. I valori di queste variabili sono modificati da istruzioni che fanno parte della iterazione.

Algoritmi iterativiAccade molto spesso che, per risolvere un problema, un lo stesso insieme di operazioni debba essere eseguito un numero opportuno di volte.

Consideriamo ad esempio il seguente problema: Calcolare la somma dei cubi dei tre numeri interi successivi ad un valore dato n.

(n+1)3+(n+2)3+(n+3)3Un possibile algoritmo è il seguente:

Algoritmi iterativi (segue)

Il risultato è ottenuto usando la variabile sommacome un contenitore di somme parziali finché non si ottiene la somma totale richiesta.

Questo risultato viene raggiunto eseguendo delle azioni "simili" per un numero opportuno di volte.

Lo stesso risultato può essere ottenuto modificando leggermente le istruzioni così che l’algoritmo sia composto da un numero prefissato di azioni uguali:

Algoritmi iterativi (segue)

In questo modo il valore finale di somma è ottenuto mediante l’esecuzione, per una sola volta, della sequenza di istruzioni

E dalla esecuzione per tre volte della sequenza di istruzioni

Algoritmi iterativi (segue)

Algoritmi ricorsiviGli algoritmi ricorsivi sono algoritmi che richiamano se stessi per la risoluzione di un problema.

Molto semplici da scrivere e pensare, ma meno efficienti sul calcolatore degli algoritmi iterativi.

L'algoritmo richiama se stesso generando una sequenza di chiamate che ha termine al verificarsi di una condizione particolare che viene chiamata condizione di terminazione, che in genere si ha con particolari valori di input.

Esempio: Calcolo del fattoriale n! (si ricorda che 0!=1, 1!=1 e n! = n *(n-1)*(n-2)*…..*2*1).

NB: Ogni algoritmo ricorsivo può essere convertito in un algoritmo iterativo.

FATT(5)

5 * FATT(4)

5 * 4 * FATT(3)

5 * 4 * 3 * FATT(2)

5 * 4 * 3 * 2 * FATT(1)

5 * 4 * 3 * 2 *1

n=1

Vettori (segue)

Ciascuno scomparto si dice componente o elemento delvettore.

Ciascuno scomparto è individuato per mezzo del nome del vettore seguito,racchiuso tra parentesi (tonde o quadre), dal numero che individua lo scomparto.Il numero tra parentesi è l’indice dell'elemento.

La dimensione di un vettore è il numero dei suoi elementi.Nel nostro esempio, la dimensione del vettore v è 4 e gli elementi sono individuati

v(l), v(2), v(3), v(4).Ogni volta che un vettore è usato in un algoritmo è necessario dichiararne le

caratteristiche nell'elenco delle variabili usate.

I vettori sono particolarmente utili quando è necessario effettuare lo stesso tipodi operazionisu un insieme di dati.

Vettori (se gue)

a l l o r a i l v e t t o r e s o m m a e è d a t o d a( s o m m a p e r p o s i z i o n e a ( 1 ) + b ( 1 ) ,

a ( 2 ) + b ( 2 ) e t c )

Vettori

i <- i+1