Esercizi di complessità (presi da scritti di esame)

Documenti analoghi
Esame di Programmazione 18 Febbraio 2003 TESTO E RISPOSTE

Scritto di Algoritmi e s.d. (1o anno) 27 Settembre 2005 RISPOSTE

Scritto di Algoritmi e s.d. (1o anno) 5 Luglio 2005

Un esempio di calcolo di complessità: insertion sort

Scritto di Algoritmi e s.d. (1o anno) 30 Giugno 2006 RISPOSTE

2a Prova parziale di Algoritmi e s.d. (1o anno) 13 Giugno 2002 TESTO E RISPOSTE. ATTENZIONE: questa e` una delle varianti...

Prova di Algoritmi e s.d. (1o anno) 7 Febbraio TESTO e RISPOSTE

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

ISTRUZIONI A B K A, B, K A<B? SI A<B? SI A<B? SI

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

Matematica - SMID : Programmazione 16 Febbraio 2004

Matematica - SMID : Programmazione 20 Febbraio 2007 FOGLIO RISPOSTE

Codice Gray. (versione Marzo 2007)

Linguaggio Testuale. E un formalismo che consente di rappresentare gli algoritmi mediante semplici istruzioni in linguaggio «parlato»

1a Prova parziale di Programmazione 29 Novembre 2002 TESTO E RISPOSTE

Nell' Informatica è importante porsi questa domanda: Questo è l'argomento che viene trattato nella Complessità Computazionale, e si articola in due

Pseudo codice. Paolo Bison. Fondamenti di Informatica 1 A.A. 2003/04 Università di Padova. Pseudo codice, Paolo Bison, A.A , p.

Sommario. Un algoritmo di ordinamento di complessità lineare: CountingSort. [CLRS10] cap. 8 par.8.2

Calcolare x n = x x x (n volte)

Nozioni di base (II Parte)

Esercizi per il corso di Algoritmi

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Programmazione I - corso B a.a prof. Viviana Bono

Per regnare occorre tenere divisi i nemici e trarne vantaggio. fai ad ogni passo la scelta più conveniente

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

FONDAMENTI DI PROGRAMMAZIONE ESERCITAZIONI Corso di Laurea in MATEMATICA a.a. 2018/19

Esercizi sulla complessità di frammenti di pseudo-codice

Problema: stampa degli interi compresi tra n e m

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera:

Matematica - SMID : Programmazione 22 Gennaio 2004 Testo e Risposte

Esercitazioni di Elementi di Informatica

4. Algoritmi Numerici Fondamentali

In questa lezione. Heap binario heapsort. [CLRS10] cap. 6, par Prof. E. Fachini - Intr. Alg.

Algoritmi, Strutture Dati e Programmi. UD 5.a: Searching (parte 1)

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Programmazione A.A Costrutti di base. ( Lezione XII, parte I ) Gestione dell input. Prof. Giovanni Gallo Dr.

Pascal: esempi di programmazione

4.5 Tempo di calcolo: introduzione.

Introduzione agli algoritmi Prova di esame del 19/9/2016 Prof.sse E. Fachini - R. Petreschi. Parte prima

sum = 0; positivenumbers = 0; /* Passo 1 */ printf("introduci i numeri (0 per finire): "); scanf("%d", &number);

Sommario. Algoritmi di ordinamento lineari: CountingSort. BucketSort. RadixSort

Informatica (A-K) 5. Algoritmi e pseudocodifica

Laboratorio di Programmazione Laurea in Ingegneria Civile e Ambientale

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Esercitazioni di Algoritmi e Strutture Dati

Lab 04 Programmazione Strutturata"

Silvia Rossi. Cenni sulla complessità. Informatica. Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Programmazione I

Il problema delle azioni

Esempio: somma di due numeri

in termini informali: un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico

Cicli. S i a i = a 1 + a 2 + a a n

come segue: data una collezione C di elementi e una un elemento che verifica la proprietà P

Gli algoritmi ricorsivi di ordinamento. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Ing. Lorenzo Vismara

Diagramma a blocchi per la selezione, in un mazzo di chiavi, di quella che apre un lucchetto

Fondamenti di Informatica

Università di Roma Tor Vergata L16-1. Ricerca: esaminare una collezione di dati, cercando un particolare valore. nome e cognome

Appendice B. Algoritmi e Complessità

Dati e Algoritmi I (Pietracaprina) Esercizi sul Text Processing

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Matematica - SMID : Programmazione Gennaio 2009 FOGLIO RISPOSTE

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

Corso di Informatica 1 Esercitazione n. 2

Fondamenti di Informatica Laurea in Ingegneria Civile e Ingegneria per l ambiente e il territorio

Algoritmi e Strutture Dati

Esempio : i numeri di Fibonacci

Iterazione indeterminata

Calcolare il massimo di una lista

complessità degli algoritmi

Moltiplicazione veloce di interi

Algoritmi di ordinamento

Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi:

2. Analisi degli Algoritmi

Algoritmi e Strutture Dati. Capitolo 1 Un introduzione informale agli algoritmi

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

RISOLUZIONE DI SISTEMI LINEARI

Calcolare lo Span di un array di numeri

Introduzione allo Scilab Parte 2: elementi di programmazione strutturata

Algoritmi e Strutture Dati

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Dichiarazione di variabili

Matematica - SMID : Programmazione Luglio 2007 FOGLIO RISPOSTE

Lo sviluppo di un semplice programma e la dimostrazione della sua correttezza

Rappresentazione degli algoritmi

Esercizi di Algoritmi e Strutture Dati

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

TRIPLE DI HOARE: ESEMPI ED ESERCIZI. Corso di Logica per la Programmazione A.A. 2012/13

In questa lezione. Costruire un max-heap. [CLRS01] cap. 6 par Prof. E. Fachini - Intr. Alg.

ALGORITMI DI ORDINAMENTO E RICERCA BINARIA. Docente: Giorgio Giacinto AA 2008/2009. problema dell ordinamento in modi diversi

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Corso di Informatica 1 (IN110) Tutorato n. 4

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

do { printf("inserisci due numeri reali:"); scanf("%f %f", &a, &b);

In questa lezione: correttezza del mergesort Analisi del mergesort: relazioni di ricorrenza e alberi della ricorsione

Logica per la Programmazione

Transcript:

Esercizi di complessità (presi da scritti di esame) Esercizio... (punti 8 in prima approssimazione) L'algoritmo che segue simula un torneo ad "eliminazione diretta"; la procedura elimina, ad ogni passo, simula una fase di eliminazione. Per semplicità supponiamo che i concorrenti siano n, con n che è potenza di 2; inoltre supponiamo che i concorrenti siano numeri interi diversi; tra due vince il maggiore. Algoritmo: var: n, k, j : int concorrenti : array [1.. MAX ] of int leggi ( n ) qui si suppone n MAX per k = 1, 2, 3,... n : leggi (concorrenti[ k ] ) j n div 2 divisione intera while ( j > 0 ) { elimina ( concorrenti, j ) j j div 2 } stampa ( concorrenti [1]) ecco il vincitore! ======================= procedura elimina ( aa : array [1.. MAX ] of int IN-OUT, sup : int IN ) ; { qui si suppone sup MAX var i : int ; per i = 1, 2, 3..., sup: if aa[ 2*i - 1 ] < aa[ 2*i ] then aa[ i ] aa[ 2*i ] else aa[ i ] aa[ 2*i - 1 ] } Domande: a) Calcolare la complessità della chiamata: elimina ( concorrenti, j ) in funzione di j b) Calcolare la complessità dell'algoritmo in funzione di n 1

Risposte: a) Indichiamo con TT ( j ) la complessità della chiamata: elimina ( concorrenti, j ), in funzione di j. I costi sono tutti costanti (passaggio dei parametri, valutazione delle espressioni, esecuzione dell' istruzione if-then-else); il costo totale dipende solo da quante volte si esegue l' if-then-else (cioè quante volte si ripete il ciclo for). Quindi TT ( j ) = a j + b (con a, b costanti oppertune e a> 0) dunque TT ( j ) è in Q( j ). b) Indichiamo con T ( n ) la complessità dell'algoritmo, in funzione di n. I costi sono tutti costanti, tranne che quello delle istruzioni per e while Il costo di per k = 1... n :... è ovviamente lineare in n Il while si ripete per j = n/2, n/4,..., n/(2 i ),..., n/n il costo del while è dunque dato dalla sommatoria (c, d costanti, c > 0 )  (j = n/2,...) (c j + d) = c  (j = n/2,...) j +  (j = n/2,...) d La seconda sommatoria ha per valore circa d( log 2 n ) infatti gli j sono circa log 2 n La prima è c (n/2 + n/4 +... ) = quindi è circa c n c n ( 1/2 + 1/4 + 1/8 +... 1/n) = c n (1-1/n) [ vedere (*) sotto ] Sommando tutto, il termine dominante e` lineare in n quindi T ( n ) è in Q( n ). (*) notare che : 1/2 + 1/4 = 1-1/4 1/2 + 1/4 + 1/8 = 1-1/8 1/2 + 1/4 + 1/8 + 1/16 = 1-1/16 eccetera questo si vede ancora meglio disegnando una "torta" Esercizio... (punti 6 in prima approssimazione) L'algoritmo che segue non fa nulla di interessante... Algoritmo: var: n, val, q : integer pot : array [1.. MAX ] of integer 2

leggi ( n ) qui supponiamo n MAX leggi ( val ) per q = 0, 1, 2,... n-1 : pot [q+1] val + q per q = 2, 3, 4,... n : ppp ( pot, q ) ======================= procedura ppp( aa : array [1.. MAX ] of integer IN-OUT, ind : integer IN ) { qui si suppone ind MAX var aux, cont : integer aux 1 ; cont ind while cont > 0 { aux aux * aa[ind ] cont cont -1 } aa[ind] aux } Domande: a) Calcolare la complessità della chiamata: ppp ( pot, q ) in funzione di q b) Calcolare la complessità dell'algoritmo in funzione di n Risposte: a) Nella procedura ppp tutti i costi (incluso il passaggio dei parametri) sono costanti, tranne quello del while; nel while: test e corpo sono a costo costante; l'esecuzione del corpo si ha per cont = q, q-1,...,1; quindi il while ha un costo del tipo a q + b (a, b constanti, a > 0); dunque il costo dellla chiamata è della forma a q + c ed è in Q( q ). b) Nell'algoritmo, tutto ha costo costante, tranne le due istruzioni per. La prima ( per q = 0, 1, 2,... ) ha test, incrementi e corpo a costo costante, quindi ha un costo totale della forma a n + b (a, b costanti, diverse dalle precedenti, a >0) La seconda ( per q = 2, 3, 4,... n : ppp (pot, q) ) ha un costo proporzionale a: Â ( q = 2, 3,...,n) q = a' n 2 + b'n + c' [vedi nota] Quindi tutto l'algoritmo è in Q( n 2 ). 3

Nota: molti hanno avuto problemi con la somma Nel tentativo di cavarsela hanno scritto ( piu' o meno):  ( q = 2, 3,...,n) q =  ( q = 0, 1,...,n-2) q  ( q = 2, 3,...,n) q Non va bene (basta provare a verificare con n= 3...) Era molto piu' semplice:  ( q = 2, 3,...,n) q = (  ( q = 0, 1,...,n) q ) - 2-1... Esercizio... (punti 6 in prima approssimazione) L'algoritmo che segue non fa nulla di interessante... Algoritmo: var: leggi ( k ) j, k, p: integer aa : array [1.. MAX ] of integer qui supponiamo k MAX per j = 1, 2,... k : leggi (aa[j]) qui supponiamo input corretto p 1 while p < k do { Domanda: } per j = 1, 2,..., p : scrivi a[j] scrivi (" * ") per j = p+1, p+2,..., k : scrivi a[j] p 2 * p Calcolare la complessità dell'algoritmo in funzione di k Precisare se c'è un caso peggiore e,se c'è, qual'è. Risposta: Nell'algoritmo tutti i costi sono costanti, tranne: 4

per j = 1, 2,... k : leggi (aa[j]) costo della forma ak + b (a>1) il while, il cui costo si valuta come segue: -- le istruzioni per k = 1, 2,..., p : scrivi a[k] per k = p+1, p+2,..., n : scrivi a[k] valutate globalmente hanno un costo della forma ck + d (c>1) -- il while si esegue per p = 1, 2, 4, 8,..., 2 s, con 2 s che e` circa k, quindi si esegue log k volte circa; ad ogni iterazione il costo è sempre lo stesso ed è quello indicato sopra piu' costanti (per le altre istruzioni del corpo, il test,...) quindi: ck+d' ( Usando le sommatorie ed ignorando le costanti:  (p=1,2,4,8,...,k) k = k  (p=1,2,4,8,...,k) 1 = k log k ) Quindi il costo totale dell'algoritmo ha la forma che è in Q( k log k). Non c'è un caso peggiore. log k (ck+d') + ak+b + b' Esercizio... (punti 6 in prima approssimazione) L'algoritmo che segue non fa nulla di interessante... var: j, k, p: integer aa : array [1.. MAX ] of integer bb : array [1.. MAX ] of integer leggi ( k ) qui supponiamo 0 < k MAX aa[1] 1 per j = 2, 3,... k : aa[j] aa[j-1]+1 per j = 1,2, 3,... k : bb[j] aa[j] p k while p >0 do { per j = 1, 2,..., p : bb[j] aa[j] * bb[j] p p div 2 } Domanda: Calcolare la complessità dell'algoritmo in funzione di k. Precisare se c'è un caso peggiore e, se c'è, qual'è. 5

Risposta La complessità dell'algoritmo è in Q(k); infatti Non c'è una caso peggiore. Tutto ha costo costante, tranne le due istruzione "per" ed il while. I due " per " hanno, ciascuno, un costo della forma ak+b (a, b costanti, a 1). Quanto al while: il corpo si esegue per p = k, k/2, k/4, k/8,..., k/(2 alla j),... il costodel corpo è della forma cp+d (c, d costanti, c 1); Quindi il costo del while è dato da S (p = k, k/2, k/4, k/8,...) (cp+d) = c S (p =...) p + d S (p =...) 1 Ovviamente il primo termine è quello dominante, quindi possiamo limitarci a calcolare la prima sommatoria; scrivendola per disteso c( k + k/2 + k/4 + k/8 + k/16 +...) = c k (1 + 1/2 + 1/4 + 1/8 + 1/16 +...) che è circa 2ck infatti 1/2 + 1/4 + 1/8 + 1/16 +... è circa 1 (come si vede subito, pensando ad una torta). 6