Complessità algoritmi su strutture dati (riassunto)

Documenti analoghi
Complessità algoritmi su strutture dati (riassunto)

Esercizi di preparazione alla prova scritta

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Lezione 12 Tabelle Hash

Esercitazione 6. Array

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Esercizio 1: funzione con valore di ritorno di tipo puntatore

strutture e file di testo/binari Esercizio - lettura/filtro/scrittura PEOPLE.TXT PARTNERS.DAT Due persone sono compatibili

Informatica 1. Prova di recupero 21 Settembre 2001

PILE E CODE. Pile (stack):

Verificare se un albero binario è bilanciato

Fondamenti di Informatica T-1 Modulo 2

Lezione 9 Alberi binari di ricerca

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

Algoritmi di Ricerca. Esempi di programmi Java

1. Realizzare una funzione: int trovaritardatari(file *fprestiti, FILE *frate, Prestito *dest, int dim)

Algoritmi di Ricerca. Esempi di programmi Java

Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato

Heap e code di priorità

Esercizi. Stringhe. Stringhe Ricerca binaria

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

ADT ALBERO BINARIO (tree)) ADT ALBERO BINARIO

1 (6) 2 (7) 3 (7) 4 (7) 5 (6)

Alcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli

Memorizzazione di una relazione

Esercizio 1: calcolo insieme intersezione

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

Esercitazione 11. Liste semplici

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Puntatori a Funzioni e Callback. Massimo Benerecetti

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 28 Gennaio 1999 PROVA SCRITTA

Stringhe e allocazione dinamica della memoria

Esempio di Prova Scritta

Perché il linguaggio C?

PROVA SCRITTA 23 MARZO 2010

Complessità degli algoritmi. Obiettivi: Calcolare (valutare) la complessità di un algoritmo Confrontare algoritmi risolutivi del medesimo problema

Fondamenti di Programmazione

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

Esercizio 1 Liste: calcolo perimetro di un poligono

Il linguaggio C Strutture

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Algoritmi di ordinamento: Array e ricorsione

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Esercizio 1 - Soluzione

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Programmazione di base

Esercizio 1. Esercizio 1 - Soluzione

Alberi binari e alberi binari di ricerca

Scrittura formattata - printf

Corso di Informatica 1 (IN1) Tutorato n. 11

1. Esercizio tipo per prova pratica

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Politecnico di Milano Facoltà di Ingegneria Milano Leonardo A.A. 2007/08

Esercitazione 6. Alberi binari di ricerca

Corso di Informatica 1 Esercitazione n. 4

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Programmazione I - Laboratorio

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

Allocazione dinamica della memoria

1. Realizzare una funzione int trovaevasori(file * fcatasto, FILE * ftasse, Lotto * dest, int dim)

Inserimento in una lista ordinata

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

ALGORITMI E STRUTTURE DATI

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Indici multilivello dinamici (B-alberi e B + -alberi) Alberi di ricerca - 1. Un esempio. Alberi di ricerca - 3. Alberi di ricerca - 2

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 21 Gennaio 1998

Alberi binari di ricerca

Lezione 5 Sottoarray di somma massima

5. Quinta esercitazione autoguidata: liste semplici

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

LA COMPLESSITA DEGLI ALGORITMI

Algoritmi di ordinamento

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 06 Array" Lab06 1

Linguaggio C: introduzione

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Esercitazione 12. Esercizi di Ricapitolazione

ALGORITMI E STRUTTURE DATI

prova.c #include <stdio.h> char funzione(char); codice oggetto del main()

Università degli Studi di Brescia. Vettori di variabili. ! Sono variabili aggregate in grado di memorizzare una collezione (organizzata) di oggetti

PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

alberi completamente sbilanciati

Esercizi di Algoritmi e Strutture Dati

Esercizio 1. Esercizio - 1

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 5A di Mercoledì 13 Luglio 2011 tempo a disposizione 2h

Strutture dati. Le liste

Lezione 8 Struct e qsort

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

IL PRIMO PROGRAMMA IN C

Fondamenti di Informatica T-1 Modulo 2

Gestione di files Motivazioni

Esercizi di Algoritmi e Strutture Dati

Un albero completamente bilanciato o pieno (full) alberi completamente sbilanciati. Un albero binario completo

Transcript:

Complessità algoritmi su strutture dati (riassunto) Struttura di dato Algoritmo di ricerca Complessità (caso peggiore) applicabile Tavola come array non Ricerca sequenziale O(N) ordinato (N elementi) Tavola come array ordinato Ricerca binaria O(log2N) (N elementi) Ricerca sequenziale O(N) File non ordinato (N Ricerca sequenziale O(N) elementi) File ordinato (N elementi) Ricerca binaria O(log2N) Ricerca sequenziale O(N) Lista collegata (anche se ordinata, N elementi) Alberi binari (N nodi) Alberi binari di ricerca (N nodi) Ricerca sequenziale Ricerca esaustiva (visita) (su campo chiave) Ricerca binaria Ricerca esaustiva (visita) O(N) O(N) O(h), h altezza dell albero (che vale log2n solo se l albero è bilanciato) O(N)

FONDAMENTI DI INFORMATICA II 2013 Maggio 23 Esercizio n. 1 Dato il seguente codice in linguaggio C, dove il tipo list rappresenta una lista di interi (non ordinata): int p(list A, list L) { int c=0; while (A!=NULL) {if (search(a->value, L)) c++; A=A->next;} return c; } int search(int i, list L) { if (L!=NULL) {if (i==l->value) return 1+search(i,L->next); else return search(i, L->next); } else return 0; } a) Si descriva cosa restituisce la funzione p e che tipo di ricerca fa la funzione search. b) Si discuta la complessità del codice per la chiamata p(l1,l2) sapendo che la lista l1 contiene M elementi e la lista l2 contiene N elementi, per la chiamata p(l1,l2) (contare le esecuzioni complessive del test sottolineato nella funzione search). La funzione p conta gli elementi comuni alle due liste. Per ogni elemento della prima lista, chiama la funzione search per cercarlo nella seconda, con ricerca sequeziale. Se la lista l1 contiene M elementi e la lista l2 contiene N elementi, la complessità della chiamata p(l1,l2) data dal numero di esecuzioni complessive del test sottolineato nella funzione search è: M x N

FONDAMENTI DI INFORMATICA 12 Settembre 2011 Esercizio n. 1 Dato il seguente codice in linguaggio C, dove il tipo list rappresenta una lista di interi, insord la funzione di inserimento ordinato in senso crescente in una lista e member la funzione di ricerca binaria in un vettore ordinato di interi: #include <stdio.h> void main(void) { int i, c=0; int v[10] = {0,1,2,3,4,5,6,7,8,9}; list L1 = NULL; scanf("%d",&i); do { L1=insord(i,L1); scanf("%d",&i); } while (i>0); while (L1!=NULL) { if ( member(l1->value,v) ) c++; L1=L1->next; } printf( \n%d\n, c); } a) Si indichi cosa fa questo frammento di programma; b) Se ne indichi la complessità in termini di numero di test condizionali eseguiti dalla funzione member, ipotizzando che da input siano stati inseriti N valori distinti (da 1 a N) seguiti da 0. Si distinguano caso migliore, peggiore e medio (il vettore v è dato e di dimensione 10) motivando opportunamente.

Il programma crea una lista di N+1 interi (N positivi, e 0). Poi conta quanti elementi di questa lista appartengono al vettore v, ed infine stampa a video tale valore. Caso migliore: tutti gli N valori positivi sono uguali al mediano di v, la complessità è O di N volte un confronto: N*1 Caso peggiore: tutti gli N valori positivi sono diversi da qualsiasi elemento di v, la complessità è = di N volte * log2(10): (N+1)*log2(10) Caso medio: la ricerca binaria costa nel caso medio come nel caso peggiore: N*log2(10) In tutti e tre i casi, la ricerca binaria dell N+1-esimo valore della lista (lo 0), paga un costo log2(10), da sommarsi alle formule precedenti, ma di fatto trascurabile.

FONDAMENTI DI INFORMATICA II - 27 Marzo 2013 Esercizio 1 Dato il seguente codice in linguaggio C, dove il tipo tree rappresenta un albero binario di interi e ordins la funzione di inserimento in un albero binario di ricerca: #include <stdio.h> int fun(int e, tree T) { if (T==NULL) return 0; else if (e==t->value) return 1; else if (e<t->value) return fun(e,t->left); else return fun(e,t->right); } void main(void) { int i, sum=0; tree T =NULL; scanf("%d",&i); while (i>0) { T=ordins(i,T); scanf("%d",&i); } for(i=0; i<10; i++) if ( fun(i,t) ) sum=sum+1; printf("%d",sum); } Si indichi cosa fa il programma e la funzione fun (cosa viene stampato dal main?); Se ne indichi la complessità in termini di numero di test condizionali dell istruzione if (test sottolineato) nella funzione fun, ipotizzando che da input siano stati dati M valori (nessuno uguale a 0,1,..9) che, inseriti nell albero T, hanno prodotto un albero perfettamente bilanciato.

Il programma crea un albero binario di ricerca di interi, leggendo i valori da input. Cerca poi con la funzione fun i primi 10 valori interi da 0 a 9, e stampa quanti di questi compaiono nell albero. fun esegue una ricerca binaria nell albero. Se da input sono stati dati M valori (nessuno uguale a 0,1,..9 caso peggiore) che, inseriti nell albero T, hanno prodotto un albero perfettamente bilanciato, in ciascuna delle dieci chiamate della funzione, la complessità è log2m, quindi in complesso: 10* log2m

FONDAMENTI DI INFORMATICA modulo B 2015 Gennaio 13 Esercizio n. 1 Dato il seguente codice in linguaggio C, dove il tipo tree rappresenta un albero binario di caratteri e ord_ins la funzione di inserimento per alberi binari di ricerca: #include <stdio.h>... int m (char i, tree T) { if (T==NULL) return 0; else if (i==t->value) return (1 + m(i,t->left)); else if (i<t->value) return m(i,t->left); else return m(i,t->right); } void main(void) { char i; tree T=NULL; scanf("%c",&i); do { T=ord_ins(i,T); scanf("%c",&i); } while ((i>= A ) and (i<= Z )); scanf("%c",&i); printf( %d,m(i,t)); } a) Si indichi cosa fa questo frammento di programma e la funzione m in particolare.

b) Si supponga che il ciclo do legga da input N caratteri compresi tra A e Z, poi *. Si valuti la complessità come numero di attivazioni della funzione m, nel caso in cui il valore letto successivamente all uscita dal ciclo do non sia presente nell albero. Si discutano i casi migliore e peggiore e li si motivi adeguatamente. Il programma conta e stampa quante volte il carattere letto compare nell albero, tramite la funzione m. Il caso migliore si ha quando il carattere è la radice dell albero, costo: 1 Il caso peggiore, quando il carattere non appartiene all albero, costo: - se albero non bilanciato, N+1 (NUMERO NODI), - se albero bilanciato, log 2 (N+1). In generale il costo è pari all altezza dell albero.

FONDAMENTI DI INFORMATICA 2016 Febbraio 18 Esercizio n. 1 Dato il tipo tree per un albero binario di interi, sia ordins(int,tree) la funzione che inserisce un intero in un albero binario di ricerca. Si consideri il codice seguente: int common(tree A, tree B) { if ((A!=NULL)&&(B!=NULL)) { if ( A->value == B->value ) /* istr. dominante */ return 1+common(A->left,B->left)+common(A->right,B- >right); else return 0; } else return 0; } void main(void) { int x, i; tree T1=NULL; tree T2=NULL; scanf("%d",&i); while (i>0) { T1=ordins(i,T1); T2=ordins(i,T2); scanf("%d",&i); } printf("%d",common(t1,t2)); } a) Si descriva cosa fa la funzione common;

b) Si discuta la complessità del codice sapendo che T1, e T2 costruiti nel main, hanno M elementi. Individuare la complessità come numero di esecuzioni dell istruzione dominante nella funzione common (codice sottolineato), motivando opportunamente. La funzione common verifica se gli alberi sono identici (stessi valori, stesso profilo). Se non lo sono, restituisce 0, se lo sono restituisce il numero dei nodi. Di fatto per come sono creati, lo sono. La funzione esegue una visita in pre-ordine, e tocca tutti i nodi (di ciascuno): la complessità (asintotica) è pari al numero dei nodi, O(M).

FONDAMENTI DI INFORMATICA 19 Febbraio 2013 Dato il seguente codice in linguaggio C, dove il tipo list rappresenta una lista di interi, e tree un tipo albero binario (di ricerca). Le variabili L di tipo list e T di tipo tree sono state create come lista ordinata e albero binario di ricerca. #include <stdio.h> list crea_lista(list); tree crea_tree(tree); int same(list l, tree t) { int trovato=0; tree aux=t; while (l!=null) { t=aux; trovato=0; while ((t!=null) && (!trovato)) if (l->value==t->value) trovato=1; else if (l->value < t->value) t=t-> left; else t=t->right; } if (trovato) l=l->next; else l=null; } return trovato; } void main(void) { list L=NULL; tree T=NULL;

L=crea_lista(L); T=crea_tree(T); printf("%d", same(l,t)); } a) Si indichi cosa fa questo frammento di programma e la funzione same in particolare; b) Se ne indichi la complessità in termini di numero di esecuzioni del test condizionale sottolineato, ipotizzando che da input siano stati inseriti N valori in lista e M valori nell albero e che gli N valori in lista siano tutti presenti anche nell albero T. Il programma crea lista L e albero T, poi con la funzione same in particolare controlla che ogni elemento della lista L sia in T. Questa funzione scandisce sequenzialmente L e cerca ogni elemento di L in T applicando una ricerca binaria. La complessità in termini di numero di esecuzioni del test condizionale sottolineato, ipotizzando che da input siano stati inseriti N valori in lista e M valori nell albero e che gli N valori in lista siano tutti presenti anche nell albero T: nel caso peggiore è di N*h dove h è l altezza dell albero (tutti gli elementi in lista sono uguali a alcune delle foglie di T; h vale log2m se T è perfettamente bilanciato; se completamente sbilanciato h vale M); nel caso migliore è N*1 (tutti gli elementi in lista sono uguali alla radice di T)

FONDAMENTI DI INFORMATICA modulo B Prova C - 18 Maggio 2015 Un file di tipo di testo, parole1.txt, contiene un elenco di parole della lingua italiana. Il file non è ordinato e ogni parola può ripetersi nel file. Le parole sono al più di 20 caratteri, senza spazi. Si realizzi un programma C, organizzato in almeno tre funzioni, rispettivamente dedicate a: costruire in memoria centrale una lista ordinata, L, che riporta tutte le parole del file che iniziano con il carattere a. La funzionea riceve come parametri il puntatore a un file e il puntatore alla radice della lista data in ingresso (più eventuali parametri a scelta) e restituisce il puntatore radice della lista L modificata; mostrare a video il contenuto (ordinato) di L; accedendo a L, contare quante sono le parole contenute e stampare il valore calcolato su un file di uscita, uscita.txt. Ad esempio, se il file parole1.txt contiene ape casa bulbo apice fontana ape la lista L dovrà contenere ape ape apice ed il file di uscita dovrà contenere il valore 3. Il file uscita.txt va consegnato con il codice sorgente. Questa funzione (funzioneb) riceve il puntatore radice L, il puntatore al file di uscita, più eventuali parametri a scelta, e restituisce void.

FONDAMENTI DI INFORMATICA modulo B Prova C 22 Dicembre 2014 Un file di tipo di testo, parole1.txt, contiene alcune parole della lingua italiana. Il file non è ordinato e ogni parola può ripetersi nel file. Le parole sono al più di 20 caratteri, senza spazi. Si realizzi un programma C, organizzato in almeno tre funzioni, rispettivamente dedicate a: costruire in memoria centrale un albero binario di ricerca, T, ordinato sul campo parola, che riporta tutte le parole del file che iniziano con lettera vocale. La stessa parola può ripetersi nell'albero. La funzionea riceve come parametri il puntatore al file, più eventuali parametri a scelta, e restituisce il puntatore radice dell'albero T; mostrare a video il contenuto (ordinato) di T; accedendo a T, stampi il contenuto (ordinato) dell'albero T su un file di uscita, uscita.txt. Ad esempio, se il file parole1.txt contiene: il mare a genova e` piu` bello del mare a savona ed anche del mare adriatico l'albero T dovrà contenere: a a adriatico anche e` ed il ed il file di uscita dovrà contenere lo stesso elenco. Il file uscita.txt va consegnato con il codice sorgente. Questa funzione (funzioneb) riceve il puntatore radice T, il puntatore al file di uscita, più eventuali parametri a scelta, e restituisce void. NOTA BENE: Si consegnino SEMPRE i sorgenti, eseguibile e i file di uscita generati. È possibile utilizzare librerie C (ad esempio per le stringhe). Nel caso si strutturi a moduli l'applicazione qualunque libreria utente va riportata nello svolgimento.