Progetto di laboratorio di Algoritmi e Strutture Dati. di Sonia Dalla Costa

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Progetto di laboratorio di Algoritmi e Strutture Dati. di Sonia Dalla Costa"

Transcript

1 Progetto di laboratorio di Algoritmi e Strutture Dati di Sonia Dalla Costa

2 Obiettivi dell esperimento: Si vuole studiare il comportamento in media degli algoritmi di ordinamento InsertionSort e MergeSort in funzione della dimensione del vettore, stimando per ognuno di essi con intervallo di confidenza del 95% il tempo di esecuzione in media su vettori di lunghezze n pari a10,20,50,100,200,500,1000,5000. Svolgimento della prova: L ambiente di sviluppo adottato nella prova è Java version I test sono stati effetuati su Intel Pentium GHz con 256 Mb di memoria ram con sistema operativo Debian SID. Metodologia dell esperimento: Per lo studio del comportamento dei due algoritmi di ordinamento (Insertionsort e MergeSort) per prima cosa viene calcolato il numero di ripetizioni necessarie per ottenere una misurazione significativa dei tempi (con un errore relativo percentuale inferiore all 5% ) e poi si passa alla misurazione dei tempi relativi all inizializzazione dell array e all esecuzione degli algoritmi di ordinamento. Le misurazioni dei tempi sono state effettuate su 200 campioni di vettori di lunghezza variabile n (con n compreso tra 10 e 5000). Per il calcolo dei tempi medi infatti si dovrebbero generare n! vettori di lunghezza l e fare la media dei tempi ottenuti;questo non è possibile e quindi ci limitiamo a un campione di vettori che permette di garantire un risultato affidabile che è di 200 elementi. Dopo il calcolo dei tempi relativi ai vari campioni, vengono calcolati il tempo medio, la varianza e l intervallo di confidenza. L intevallo di confidenza (1-α ) deve essere al 95%. Abbiamo quindi: = 1 c n z(1 α ) 2 s( n) dove cn è la cardinalità del campione. Infine, la formula per il calcolo della varianza è: s 1 = c cn 2 2 ( n) X ( n, i ) E'[ X ( n n i= 1 )] 2 Funzionamento del programma: Il programma realizzato prende come argomento da riga di comando il numero di elementi dell array da testare e il numero di ripetizioni necessarie per garantire un risultato affidabile (200 ripetizioni). All inizio viene eseguito un semplice controllo sugli argomenti passati e poi inizia il programma. Nella prima parte viene calcolato il fattore di ripetizione che servirà per ridurre l errore relativo delle misure. Per la misura dei tempi utilizzo il metodo gettime() che restituisce tempi in millisecondi. 2

3 Per limitare l errore relativo all 5% devo misurare un evento di durata d, con δ tale che: 100:5 = δ :5 ovvero δ =100. L esecuzione delle procedure di inizializzazione e di ordinamento dell array verranno quindi ripetute n volte. Il fattore di ripetizione n viene calcolato una sola volta sulla procedura più breve e cioè su quella di inizializzazione del vettore. In un primo tempo viene fatta una stima per difetto e poi una per eccesso mediante due cicli while. Nel primo ciclo n viene raddoppiato ciclicamente fino a quando l intervallo misurato supera δ. Alla fine del ciclo il fattore n sarà compreso tra l intervallo [a,b]. Il secondo ciclo riduce questo intervallo attraverso una serie di divisioni per due. Al termine del ciclo b sarà una stima per eccesso del fattore di ripetizione con un errore di 5. Una volta determinato il fattore n si passa alla misura dei tempi di esecuzione degli algoritmi di ordinamento: viene inizializzato un vettore di lunghezza n con degli elementi casuali e viene misurato il tempo necessario per eseguire n volte l algoritmo di ordinamento in esame. Una volta terminata la misurazione, si passa al prossimo vettore campione. Vengono effettuate nell ordine le misurazioni dei tempi di esecuzione dell algoritmo di inizializzazione, di InsertionSort,e di MergeSort e poi si ottengono i tempi medi, la varianza e l intervallo di confidenza. Codice: import java.util.*; class LabASD { public static void main (String[] arg) { /* Progetto di Laboratorio - Algoritmi e Strutture Dati */ System.out.println(" "); System.out.println("Progetto di laboratorio di Algoritmi e Strutture Dati"); System.out.println("Componente del gruppo:sonia Dalla Costa"); System.out.println(" "); /*I parametri passati tramite linea di comando sono due: il numero di elementi e il numero di campioni. Convalida dei parametri e assegnamento delle variabili globali */ /*Si verifica che il numero di parametri passati in input coincida con la sintassi del programma */ campioni>"); if (arg.length!= 2) { /* Se gli argomenti sono piu` o meno di due... */ System.out.println("Sintassi: java LabASD <numero di elementi> <numero di return; /*...il programma termina */ un intero */ try { size = Integer.parseInt(arg[0]); /* Si verifica che la dimensione dell'array sia if (size < 2) { /* Si verifica che l'array contenga almeno 2 elementi */ System.out.println("L'array deve contenere almeno 2 elementi"); 3

4 return; /* Se contiene meno di due elementi il programma termina */ catch (NumberFormatException e) { /* Se il parametro passato non e` un intero il programma termina... */ System.out.println("La dimensione dell'array dev'essere un intero"); /*...restituendo l'errore */ try { sia un intero */ campione"); */ samples = Integer.parseInt(arg[1]); /* Si verifica che il numero dei campioni if (samples < 1) { /* Si verifica che ci sia almeno un test da eseguire */ System.out.println("Il test dev'essere eseguito su almeno un return; /* Se il numero di test e` minore di uno il programma termina catch (NumberFormatException e) { /* Se il parametro passato non e` un intero il programma termina... */ System.out.println("Il numero di campioni dev'essere un intero"); /*...restituendo l'errore */ /* Inizializzazione dell'array e chiamate delle funzioni */ Random generator = new Random(); seed = generator.nextint(); //inizializza il seme del generatore di numeri casuali data = new int[size]; findloops(); String M="MergeSort"; String I="InsertionSort"; findtime(i); findtime(m); /* La funzione timegettime() calcola il tempo corrente e lo restituisce in millisecondi */ private static double timegettime() { Date time; time = new Date(); /* A ogni chiamata viene instanziato un nuovo oggetto Date */ return (double)time.gettime(); /* Viene restituito il tempo corrente in millisecondi con un cast a double */ /* La funzione findloops() calcola il numero di ripetizioni necessarie per calcolare una stima con un errore relativo limitato all'5% */ 4

5 private static void findloops() { double time1,time2; /* Dichiara due variabili double che conterranno i tempi */ int a,b,numofloops; /* Dichiara due variabili intere che conterranno gli estremi e il numero di ripetizioni */ numofloops = 1; /* Inizializzazione del numero di ripetizioni */ time1 = time2 = 0; /* Inizializzazione dei tempi */ /* Si determina una stima per eccesso e una per difetto del fattore di ripetizione */ while( (time2-time1) < delta) { /* Finche` non si misura un evento di durata almeno uguale a delta... */ numofloops *= 2; /*...il fattore di ripetizione viene raddoppiato */ time1 = timegettime(); for (int i = 1; i < numofloops; i++) init(); /* Si calcolano i tempi per la procedura di inizializzazione */ time2 = timegettime(); a = numofloops / 2; /* Stima per difetto */ b = numofloops; /* Stima per eccesso */ System.out.println("Estremi dell'intervallo calcolato: [" + a + ", " + b + "]"); di 5 */ /*L'intervallo calcolato viene ridotto attraverso un processo di bisezione; Alla fine del ciclo b sarà una stima per eccesso del fattore di ripetizione con un errore while( (b - a) >= 5) { /* Finche` l'errore non e` inferiore a 5... */ numofloops = ((a+b)/2); /*...l'intervallo viene dimezzato */ time1 = timegettime(); for (int i = 1; i < numofloops; i++) init(); /* Si calcolano i tempi per la procedura di inizializzazione */ time2 = timegettime(); if (( time2 - time1) <= delta) /* Se la durata dell'evento non e` superiore a delta */ a = numofloops; else b = numofloops; System.out.println("Fattore di ripetizione calcolato: " + numofloops); loops = numofloops; /* Assegna il risultato alla variabile globale contenente il fattore di ripetizione */ /* La funzione findtime(), utilizzando il fattore di ripetizione precedentemente trovato, restituisce in output la media la varianza e l'intervallo di confidenza calcolati per ciascuno degli algoritmi di ordinamento. Il test viene eseguito su un determinato numero di campioni contenuto nella variabile globale 'samples' */ public static void findtime(string algorithm) { double time1, time2, totaltime = 0, sqrtotaltime = 0, grosstime, nettime, tare; System.out.println(" "); System.out.println("[2] "+algorithm); 5

6 System.out.println(" "); for(int k = 0; k < samples; k++) { /* Per ciascuno dei campioni... */ System.out.print("Campione [" + (k+1) + "] :"); time1 = timegettime(); for(int i = 0; i < loops; i++) { /*...utilizzando il fattore di ripetizione calcolato... */ init(); /*...viene calcolato il tempo necessario a inizializzare il vettore... */ if (algorithm.equals("insertionsort")) { insertionsort(0, size -1); /*...e a ordinarlo tramite InsertionSort. */ else{ mergesort(); time2 = timegettime(); grosstime = time2 - time1; /* Si ottiene così il tempo lordo di esecuzione */ time1 = timegettime(); for(int i = 0; i < loops; i++) init(); /* Viene quindi calcolato il tempo necessario alla sola inizializzazione... */ time2 = timegettime(); tare = time2 - time1; /*...che viene sottratto al tempo lordo ottenendo la tara */ nettime = (grosstime - tare) / loops; /* Viene infine calcolato il tempo netto medio... */ System.out.println(" " + nettime + " millisecondi"); totaltime += nettime; /*...che viene quindi sommato al tempo complessivo... */ sqrtotaltime += (nettime * nettime); /*...e al quadrato del tempo complessivo */ double averagetime = totaltime / samples; /* Vengono calcolati: il tempo medio complessivo... */ double varianza = (sqrtotaltime - samples * averagetime * averagetime) / (samples); /*... la varianza... */ double error = 1.96 * ( Math.sqrt(varianza / samples) ); /*...e l'intervallo di confidenza */ double delta =(1/(Math.sqrt(samples)))*1.96*(Math.sqrt(varianza)); double sx = averagetime-delta; double dx = averagetime+delta; System.out.println("Lunghezza = "+ size); System.out.println("Ripetizioni = "+ samples); System.out.println("Varianza = "+ varianza); System.out.println("Media = "+ averagetime +" +/- " + error); System.out.println("Intervallo di confidenza: "+sx+", "+dx); System.out.println(); 6

7 /* La funzione init() inizializza il vettore utilizzando il generatore di numeri casuali istanziato come variabile globale. In questo modo ad ogni esecuzione del programma si ottiene un generatore inizializzato con un seme basato sul tempo corrente */ public static void init() { for (int i = 0; i < size; i++) /* Per ogni elemento del vettore */ data[i] = (int)(65536*rand()); /* Viene generato un valore casuale compreso tra 0 e 2^16-1 */ /* La funzione insertionsort(int p,int q) ordina l'array secondo il corrispondente algoritmo */ public static void insertionsort(int p,int q) { int j, i; int tmp; for(j = p + 1; j <= q; j++) { /* Per ogni elemento del vettore */ tmp = data[j]; /* Il valore corrente viene salvato nella variabile tmp */ for(i = j-1; (i>=p) && (data[i]>tmp); i--) { /* Se l'elemento non è in ordine... */ data[i+1] = data[i]; /* Viene scambiato */ data[i+1] = tmp; /* Il valore temporaneo viene inserito nella posizione corretta */ /* Nella variabile temp vengono salvati i valori */ private static int[] temp; public static void mergesort(){ temp=new int[size]; mergesort(1,size-1); /* La funzione mergesort(int p, int q) ordina l array secondo il corrispondente algoritmo */ public static void mergesort(int p, int q) { int r; if (p < q) { /* Se il vettore contiene almeno un elemento calcola in r l indice della metà del vettore */ r = (int)math.floor((p + q) / 2); mergesort(p,r); mergesort(r + 1,q); /* Richiama ricorsivamente la procedura fondendo i due sottovettori (p,r) e (r + 1, q) */ Merge(p,q,r); /* Chiama la procedura Merge per fondere e ordinare i due sottovettori */ private static void Merge(int p, int q, int r) { /* La procedura Merge fonde e ordina i sottovettori */ int i=p,j=q+1,k=0,h; /* int[] temp=new int[size-1]; while (i<=q && j<=r) { /* Con questo ciclo legge i valori dei due sottovettori e li riporta nell ordine giusto nella variabile temp */ if (data[i]<data[j]) { temp[k]=data[i]; i++; 7

8 else{ temp[k]=data[j]; j++; k++; if (j <=r) { /* Quando uno dei due sottovettori è stato ordinato, vengono copiati nella variabile temp i valori dell altro sottovettore, già ordinati */ for (h=j; h<=r; h++) { /* Se gli elementi del secondo sottovettore sono stati ordinati, si copiano gli elementi del secondo sottovettore */ temp[k]=data[h]; k++; else { for (h=i; h<=q; h++) { /* se gli elementi del primo sottovettore sono stati ordinati, si copiano gli elementi del primo sottovettore */ temp[k]=data[h]; k++; for (h=0; h<k; h++) { /* Vengono copiati gli elementi ordinati presenti nella variabile temp nel vettore di partenza data */ data[h+p]=temp[h]; public static double rand() { final int a = 16807; /* Costanti per il calcolo dei numeri casuali */ final int m = ; final int q = ; final int r = 2836; double lo, hi, test; hi = (int)(seed / q); /* Procedura che calcola i numeri casuali */ lo = seed - q * hi; test = a * lo - r * hi; if (test < 0) seed = test + m; else seed = test; return (seed / m); /* Variabili globali */ static int size; /* Dimensione dell'array */ static int samples; /* Numero di campioni */ static int loops; /* Fattore di ripetizione */ static int data[]; /* Array da ordinare */ static final int delta = 100; /* 100 : 1 = delta : 1 -> delta = 100 */ private static double seed; 8

9 Analisi del codice: -Generatore di numeri casuali: Al generatore di numeri casuali viene fornito un seme (seed), cioè un numero che dev essere sempre diverso, altrimenti sarebbe sempre lo stesso e poi viene generata una sequenza determinata dal seme di numeri razionali compresi tra 0 e 1. public static double rand() { final int a = 16807; final int m = ; final int q = ; final int r = 2836; double lo, hi, test; hi = (int)(seed / q); lo = seed - q * hi; test = a * lo - r * hi; if (test < 0) seed = test + m; else seed = test; return (seed / m); -Algoritmo InsertionSort: L algoritmo InsertionSort per ordinare il vettore considera l elemento i-esimo e lo confronta con gli elementi (i-esimi-1) già ordinati per poterlo inserire nella corretta posizione; la complessità di questo algoritmo nel caso peggiore è n 2. public static void insertionsort(int p,int q) { int j, i; int tmp; for(j = p + 1; j <= q; j++) { /* Per ogni elemento del vettore */ tmp = data[j]; /* Valore corrente viene salvato nella variabile tmp */ for(i = j-1; (i>=p) && (data[i]>tmp); i--) { /* Se l'elemento non e` in ordine... */ data[i+1] = data[i]; /* Viene scambiato */ data[i+1] = tmp; /* Il valore temporaneo viene inserito nella posizione corretta */ - Algoritmo MergeSort: Il MergeSort ordina il vettore nel seguente modo: all inizio il vettore viene diviso in due sottovettori che poi vengono ordinati ricorsivamente; alla fine si richiama la procedura Merge che fonde i due sottovettori ordinati da mergesort; la complessità di tale algoritmo nel caso peggiore è n log n. 9

10 public static void mergesort(int p, int q) { int r; if (p < q) { r = (int)math.floor((p + q) / 2); mergesort(p,r); mergesort(r + 1,q); Merge(p,q,r); private static void Merge(int p, int q, int r) { int i=p,j=q+1,k=0,h; int[] temp=new int[size-1]; while (i<=q && j<=r) { if (data[i]<data[j]) { temp[k]=data[i]; i++; else{ temp[k]=data[j]; j++; k++; if (j <=r) { for (h=j; h<=r; h++) { temp[k]=data[h]; k++; else { for (h=i; h<=q; h++) { temp[k]=data[h]; k++; for (h=0; h<k; h++) { data[h+p]=temp[h]; 10

11 Tabelle e grafici riepilogativi e comparativi: Tabella dati dell algoritmo InsertionSort Lunghezza vettore Varianza Media Intervallo di confidenza 10 1,231847*10-8 0, /- 2,175377*10-5 0, , 0, ,184681*10-8 0, /- 4,874327*10-5 0, , 0, ,177673*10-7 0, /- 1,410338*10-4 0, , 0, , , /- 3,472618*10-4 0,758716, 0, , , /- 0, ,956443, 2, , , /- 0, ,182650, 18, , , /- 0, ,822696, 72, , , /- 0, ,59905, 1804, Grafico dell InsertionSort Tempo impiegato Grafico dell'insertionsort 50 Lunghezza vettore InsertionSort OSSERVAZIONI: Come si può notare anche dal grafico il tempo impiegato dall InsertionSort per ordinare un vettore aumenta vertiginosamente se il vettore da ordinare è grande. Tabella dati del MergeSort Lunghezza vettore Varianza Media Intervallo di confidenza 10 3,071465*10-7 0, /- 1,086224*10-4 0,04706, 0, ,147967*10-6 0, /- 3,47753*10-6 0,113859, 0, ,859203*10-6 0, /- 4,320545*10-4 0,349249, 0, ,130889*10-5 0, /- 9,047665*10-4 0,845365, 0, , *10-5 2, /- 0, ,173829, 2, , , /- 0, ,745933, 8, , , /- 0, ,827007, 27, , , /- 0, ,615305, 543,

12 Grafico del MergeSort Grafico del MergeSort 600 Tempo impiegato MergeSort Lunghezza del vettore 5000 OSSERVAZIONI: Come si può notare anche dal grafico il tempo impiegato dal MergeSort per ordinare un vettore aumenta vertiginosamente se il vettore da ordinare è grande. Confronto dei tempi impiegati dall InsertioSort e dal MergeSort per ordinare il vettrore n Lunghezza vettore (n) Tempo impiegato dall InsertionSort per ordinare il vettore Tempo impiegato dal MergeSort per ordinare il vettore 10 0, /- 2,175377*10-5 0, /- 1,086224* , /- 4,874327*10-5 0, /- 3,47753* , /- 1,410338*10-4 0, /- 4,320545* , /- 3,472618*10-4 0, /- 9,047665* , /- 0, , /- 0, , /- 0, , /- 0, , /- 0, , /- 0, , /- 0, , /- 0,

13 Grafici di confronto tra InsertionSort e MergeSort Confronto fra i due algoritmi presi in considerazione per vettori piccoli Confronto InsertionSort e MergeSort Tempo impiegato 3,5 3 2,5 2 1,5 1 0, Lunghezza del vettore MergeSort InsertionSort Punto d intersezione tra InsertionSort e MergeSort Punto d'intersezione tra InsertionSort e MergeSort Tempo impiegato 3,5 3 2,5 2 1,5 1 0, Lunghezza del vettore MergeSort InsertionSort OSSERVAZIONI: I grafici e le tabelle sopra riportati ci mostrano che l algoritmo MergeSort risulta essere più lento nel calcolo del tempo per vettori di piccole dimensioni, a differenza dell InsertionSort, mentre risulta essere molto più veloce nel calcolo del tempo impiegato per ordinare vettori di grandi dimensioni. 13

14 Funzionamento del programma: Fondendo i due algoritmi possiamo ottenerne un altro più potente in grado di calcolare più rapidamente i tempi di ordinamento di un vettore. Il nuovo algoritmo, che chiamo OptimizeSort, utilizza l algoritmo dell InsertionSort per ordinare i vettori con lunghezza inferiore a 110 elementi in quanto quest ultimo risulta essere più efficace rispetto al MergeSort nel calcolo dei tempi di ordinamento; quando il vettore supera queste dimensioni utilizzo l algoritmo MergeSort che risulta essere migliore dell InsertionSort. Codice: import java.util.*; class Ultimo { public static void main (String[] arg) { /* Progetto di Laboratorio - Algoritmi e Strutture Dati */ System.out.println(); System.out.println("Progetto di laboratorio di Algoritmi e Strutture Dati"); System.out.println("Sonia Dalla Costa"); System.out.println(); /* I parametri passati tramite linea di comando sono due: il numero di elementi e il numero di campioni. Convalida dei parametri e assegnamento delle variabili globali */ /* Si verifica che il numero di parametri passati in input coincida con la sintassi del programma */ if (arg.length!= 2) { /* Se gli argomenti sono piu` o meno di due... */ System.out.println("Sintassi: java LabASD <numero di elementi> <numero di campioni>"); return; /*...il programma termina */ try { size = Integer.parseInt(arg[0]); /* Si verifica che la dimensione dell'array sia un intero */ if (size < 2) { /* Si verifica che l'array contenga almeno 2 elementi */ System.out.println("L'array deve contenere almeno 2 elementi"); return; /* Se contiene meno di due elementi il programma termina */ catch (NumberFormatException e) { /* Se il parametro passato non e` un intero il programma termina... */ System.out.println("La dimensione dell'array dev'essere un intero"); /*...restituendo l'errore */ 14

15 try { samples = Integer.parseInt(arg[1]); /* Si verifica che il numero dei campioni sia un intero */ if (samples < 1) { /* Si verifica che ci sia almeno un test da eseguire */ System.out.println("Il test dev'essere eseguito su almeno un campione"); return; /* Se il numero di test e` minore di uno il programma termina */ catch (NumberFormatException e) { /* Se il parametro passato non è un intero il programma termina... */ System.out.println("Il numero di campioni dev'essere un intero"); /*...restituendo l'errore */ /* Inizializzazione dell'array e chiamate delle funzioni */ casuali */ Random generator = new Random(); seed = generator.nextint(); /* inizializza il seme del generatore di numeri data = new int[size]; findloops(); String M="MergeSort"; /* Stringhe che indicano che algoritmo è in utilizzo */ String I="InsertionSort"; String O="optimizeSort"; findtime(i); findtime(m); findtime(o); /* La funzione timegettime() calcola il tempo corrente e lo restituisce in millisecondi */ private static double timegettime() { Date time; time = new Date(); /* A ogni chiamata viene instanziato un nuovo oggetto Date */ return (double)time.gettime(); /* Viene restituito il tempo corrente in millisecondi con un cast a double */ /* La funzione findloops() calcola il numero di ripetizioni necessarie per calcolare una stima con un errore relativo limitato all'5% */ private static void findloops() { double time1,time2; /* Dichiara due variabili double che conterranno i tempi */ int a,b,numofloops; /* Dichiara due variabili intere che conterranno gli estremi e il numero di ripetizioni */ numofloops = 1; /* Inizializzazione del numero di ripetizioni */ time1 = time2 = 0; /* Inizializzazione dei tempi */ 15

16 /* Si determina una stima per eccesso e una per difetto del fattore di ripetizione */ while( (time2-time1) < delta) { /* Finchè non si misura un evento di durata almeno uguale a delta... */ numofloops *= 2; /*...il fattore di ripetizione viene raddoppiato */ time1 = timegettime(); for (int i = 1; i < numofloops; i++) init(); /* Si calcolano i tempi per la procedura di inizializzazione */ time2 = timegettime(); a = numofloops / 2; /* Stima per difetto */ b = numofloops; /* Stima per eccesso */ System.out.println("Estremi dell'intervallo calcolato: [" + a + ", " + b + "]"); /* L'intervallo calcolato viene ridotto attraverso un processo di bisezione. Alla fine del ciclo b sarà una stima per eccesso del fattore di ripetizione con un errore di 5 */ while( (b - a) >= 5) { /* Finche` l'errore non e` inferiore a 5... */ numofloops = ((a+b)/2); /*...l'intervallo viene dimezzato */ time1 = timegettime(); for (int i = 1; i < numofloops; i++) init(); /* Si calcolano i tempi per la procedura di inizializzazione */ time2 = timegettime(); if (( time2 - time1) <= delta) /* Se la durata dell'evento non è superiore a delta */ a = numofloops; else b = numofloops; System.out.println("Fattore di ripetizione calcolato: " + numofloops); loops = numofloops; /* Assegna il risultato alla variabile globale contenente il fattore di ripetizione */ /* La funzione findtime(), utilizzando il fattore di ripetizione precedentemente trovato, restituisce in output la media la varianza e l'intervallo di confidenza calcolati per ciascuno degli algoritmi di ordinamento. Il test viene eseguito su un determinato numero di campioni contenuto nella variabile globale 'samples' */ public static void findtime(string algorithm) { double time1, time2, totaltime = 0, sqrtotaltime = 0, grosstime, nettime, tare; System.out.println(" "); System.out.println("[*] "+algorithm); System.out.println(" "); for(int k = 0; k < samples; k++) { /* Per ciascuno dei campioni... */ System.out.print("Campione [" + (k+1) + "] :"); time1 = timegettime(); for(int i = 0; i < loops; i++) { /*...utilizzando il fattore di ripetizione calcolato... */ init(); /*...viene calcolato il tempo necessario a inizializzare il vettore... */ 16

17 if (algorithm.equals("insertionsort")) { insertionsort(0, size -1); /*...e a ordinarlo tramite InsertionSort. */ if (algorithm.equals("mergesort")){ /* o tramite MergeSort */ mergesort(); else{ optimizesort(); time2 = timegettime(); grosstime = time2 - time1; /* Si ottiene così il tempo lordo di esecuzione */ time1 = timegettime(); for(int i = 0; i < loops; i++) init(); /* Viene quindi calcolato il tempo necessario alla sola inizializzazione... */ time2 = timegettime(); tare = time2 - time1; /*...che viene sottratto al tempo lordo ottenendo la tara */ nettime = (grosstime - tare) / loops; /* Viene infine calcolato il tempo netto medio... */ System.out.println(" " + nettime + " millisecondi"); totaltime += nettime; /*...che viene quindi sommato al tempo complessivo... */ sqrtotaltime += (nettime * nettime); /*...e al quadrato del tempo complessivo */ double averagetime = totaltime / samples; /* Vengono calcolati: il tempo medio complessivo... */ double varianza = (sqrtotaltime - samples * averagetime * averagetime) / (samples); /*... la varianza... */ double error = 1.96 * ( Math.sqrt(varianza / samples) ); /*...e l'intervallo di confidenza */ double delta =(1/(Math.sqrt(samples)))*1.96*(Math.sqrt(varianza)); double sx = averagetime-delta; double dx = averagetime+delta; System.out.println("Lunghezza = "+ size); System.out.println("Ripetizioni = "+ samples); System.out.println("Varianza = "+ varianza); System.out.println("Media = "+ averagetime +" +/- " + error); System.out.println("Intervallo di confidenza: "+sx+", "+dx); System.out.println(); /* La funzione init() inizializza il vettore utilizzando il generatore di numeri casuali istanziato come variabile globale. In questo modo ad ogni esecuzione del programma si ottiene un generatore inizializzato con un seme basato sul tempo corrente */ public static void init() { for (int i = 0; i < size; i++) /* Per ogni elemento del vettore */ 17

18 data[i] = (int)(65536*rand()); /* Viene generato un valore casuale compreso tra 0 e 2^16-1 */ public static void insertionsort(int p,int q) { int j, i; int tmp; for(j = p + 1; j <= q; j++) { /* Per ogni elemento del vettore */ tmp = data[j]; /* Valore corrente viene salvato nella variabile tmp */ for(i = j-1; (i>=p) && (data[i]>tmp); i--) { /* Se l'elemento non è in ordine... */ data[i+1] = data[i]; /* Viene scambiato */ data[i+1] = tmp; /* Il valore temporaneo viene inserito nella posizione corretta */ private static int[] temp; /* Algoritmo del MergeSort */ public static void mergesort(){ temp=new int[size]; mergesort(1,size-1); public static void mergesort(int p, int q) { int r; if (p < q) { r = (int)math.floor((p + q) / 2); mergesort(p,r); mergesort(r + 1,q); Merge(p,q,r); public static void optimizesort() { temp=new int[size]; mescsort(1,size-1); public static void mescsort(int p, int r) { if ((r-p)<110) { /* Se la lunghezza del vettore è inferiore a */ int j, key,i; /*...il vettore viene ordinato con InsertionSort */ for (j=p; j<=r; j++) { key=data[j]; i=j-1; while (i>=p && data[i]>key) { data[i+1]=data[i]; i--; data[i+1]=key; else{ /*...altrimenti ordina il vettore con MergeSort */ int q=(p+r)/2; mescsort(p,q); mescsort(q+1,r); Merge(p,q,r); 18

19 private static void Merge(int p, int q, int r) { /* Algoritmo del MergeSort */ int i=p,j=q+1,k=0,h; int[] temp=new int[size-1]; while (i<=q && j<=r) { if (data[i]<data[j]) { temp[k]=data[i]; i++; else{ temp[k]=data[j]; j++; k++; if (j <=r) { for (h=j; h<=r; h++) { temp[k]=data[h]; k++; else { for (h=i; h<=q; h++) { temp[k]=data[h]; k++; for (h=0; h<k; h++) { data[h+p]=temp[h]; /* Generatore di numeri casuali */ public static double rand() { /* Costanti per il calcolo dei numeri casuali */ final int a = 16807; final int m = ; final int q = ; final int r = 2836; double lo, hi, test; hi = (int)(seed / q); Procedura che calcola i numeri casuali */ lo = seed - q * hi; test = a * lo - r * hi; if (test < 0) seed = test + m; else seed = test; return (seed / m); /* Variabili globali */ static int size; /* Dimensione dell'array */ static int samples; /* Numero di campioni */ static int loops; /* Fattore di ripetizione */ static int data[]; /* Array da ordinare */ static final int delta = 100; /* 100 : 1 = delta : 1 -> delta = 100 */ private static double seed; 19

20 static int f; Tabelle e grafici riepilogativi e comparativi: Tabella dati dell algoritmo OptimizeSort Lunghezza vettore Varianza Media Intervallo di confidenza 10 2,617080*10-8 0, /- 3,170768*10-5 0,011119, 0, ,215063*10-7 0, /- 6,832120*10-5 0,035536, 0, , *10-7 0, /- 1, ,195939, 0, ,663683*10-6 0, /-4, ,753928, 0, ,622085*10-5 1, /-7, ,644210, 1, ,413754*10-4 3, /- 0, ,241876, 3, , , /- 0, ,528374,8, , , /- 1, ,367612, 65, Grafico dell OptimizeSort OptimizeSort 200 Tempo impiegato OptimizeSort Lunghezza del vettore Confronto dei tempi impiegati dall InsertionSort, dal MergeSort e dall OptimizeSort per ordinare il vettore n n Tempo impiegato dall InsertionSort per ordinare il vettore Tempo impiegato dal MergeSort per ordinare il vettore Tempo impiegato dal OptimizeSort per ordinare il vettore 10 0, /- 2,175377*10-5 0, /- 1,086224*10-4 0, /- 3,170768* , /- 4,874327*10-5 0, /- 3,47753*10-6 0, /- 6,832120* , /- 1,410338*10-4 0, /- 4,320545*10-4 0, /- 1, , /- 3,472618*10-4 0, /- 9,047665*10-4 0, /-4, , /- 0, , /- 0, , /-7, , /- 0, , /- 0, , /- 0, , /- 0, , /- 0, , /- 0, , /- 0, , /- 0, , /- 1,

21 Grafici di confronto tra InsertionSort, MergeSort e OptimizeSort Grafico comparativo 2000 Tempo impiegato InsertionSort MergeSort OptimizeSort Lunghezza del vettore Confronto fra i tre algoritmi presi in considerazione per vettori piccoli Grafico comparativo 1 Tempo impiegato 3,5 3 2,5 2 1,5 1 0, Lunghezza del vettore InsertioSort MergeSort OptimizeSort CONCLUSIONI: Dai grafici e dalle tabelle osserviamo che l OptimizeSort risulta essere più efficiente rispetto gli altri due algoritmi nel calcolo del tempo sia per vettori di piccole dimensioni che per quelli di grandi dimensioni. Come si può notare dalle tabelle e dai grafici, ogni algoritmo ha dei pregi: l InsertionSort è rapido nel calcolo dei tempi di ordinamento per vettori di piccole dimensioni, il MergeSort, invece, è più rapido per vettori di grandi diemensioni, mentre l OptimizeSort è efficace sia con vettori di piccoli che di grandi dimensioni. 21

Algoritmi di ordinamento: Array e ricorsione

Algoritmi di ordinamento: Array e ricorsione Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1 Indice Algoritmi di ordinamento: Insertion

Dettagli

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 9 - Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

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

Programmazione I - corso B a.a prof. Viviana Bono Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 2009-10 prof. Viviana Bono Blocco 15 Algoritmi su array: selection sort, insertion sort, fusione

Dettagli

Algoritmi di ordinamento e ricerca. Classe SelSort.java

Algoritmi di ordinamento e ricerca. Classe SelSort.java Classe SelSort.java public class SelSort Trova l elemento più piccolo nella porzione finale di un array. @param a l array da esplorare @param from la posizione iniziale dell intervallo @return la posizione

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Calcolare x n = x x x (n volte)

Calcolare x n = x x x (n volte) Calcolare x n = x x x (n volte) Abbiamo bisogno di: una variabile ris in cui ad ogni iterazione del ciclo si ha un risultato parziale, e che dopo l ultima iterazione contiene il risultato finale; una variabile

Dettagli

2. Analisi degli Algoritmi

2. Analisi degli Algoritmi 2. Analisi degli Algoritmi Introduzione 2.1 Un modello di macchina elementare: la Macchina a Registri 2.2 Costo di esecuzione di un programma 2.3 Analisi del costo di esecuzione: il modello a costi uniformi

Dettagli

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni Esercizio 1 Dire quale è la complessità temporale del seguente metodo, espressa con notazione asintotica O(.) (con la migliore

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a. 2016/ Giugno 2017

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a. 2016/ Giugno 2017 Cognome Matricola Nome Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a. 2016/2017 12 Giugno 2017 Testo Il database del sistema di gestione delle prenotazioni dei voli

Dettagli

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro Laboratorio di Programmazione Lezione 2 Cristian Del Fabbro Prossima lezione GIOVEDÌ 29 OTTOBRE 14:00 Input da tastiera package input; import java.io.*; public class Input { public static void main(string[]

Dettagli

Le basi del linguaggio Java

Le basi del linguaggio Java Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una

Dettagli

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione Corso: Fondamenti di Informatica (Gruppo 2) a.a. 2017-18 Corsi di laurea: Ing. Settore Informazione Questionario a Risposte Multiple per auto-valutazione del Lab05 Domanda n. 1 Argomento: Iterazioni, array

Dettagli

Lezione 6 programmazione in Java

Lezione 6 programmazione in Java Lezione 6 programmazione in Java Nicola Drago drago@sci.univr.it Dipartimento di Informatica Università di Verona Anteprima Le costanti I vettori Cos è un vettore Come si usa I vari tipi di vettori Esempi

Dettagli

Metodi statici. Dichiarazione e chiamata di metodi statici

Metodi statici. Dichiarazione e chiamata di metodi statici Metodi statici Dichiarazione e chiamata di metodi statici Cos è un metodo Un metodo è un blocco di istruzioni che fornisce una funzionalità e viene identificato con un nome Può avere dei parametri ed un

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011 Cognome Nome Matricola Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2010-11 8 luglio 2011 Testo Il database di un videonoleggio è costituito da due vettori paralleli.

Dettagli

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro Laboratorio di Programmazione Lezione 3 Cristian Del Fabbro Prossima lezione GIOVEDÌ 12 NOVEMBRE ORE 14:00 Array a.k.a. vettore Un array è una collezione ordinata di dati omogenei (cioé sono tutti dello

Dettagli

Corso di Tecniche di Programmazione

Corso di Tecniche di Programmazione Corso di Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica Anno Accedemico 003/004 Proff. Giuseppe De Giacomo, Luca Iocchi, Domenico Lembo Dispensa : Algoritmi di Ordinamento

Dettagli

C: panoramica. Violetta Lonati

C: panoramica. Violetta Lonati C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati

Dettagli

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento Fondamenti di Informatica Algoritmi di Ricerca e di Ordinamento 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure l elemento

Dettagli

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010 Quicksort e qsort() Alessio Orlandi 28 marzo 2010 Intro Quicksort è l algoritmo di ordinamento più implementato, insieme con Mergesort. Tutte le librerie standard UNIX ne prevedono una implementazione.

Dettagli

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA Matlab: esempi ed esercizi Sommario e obiettivi Sommario Esempi di implementazioni Matlab di semplici algoritmi Analisi di codici Matlab Obiettivi

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Algoritmi di ordinamento Gli ordinamenti interni sono fatti su sequenze in memoria centrale Fondamenti di Informatica 18. Algoritmi di ordinamento in C++ Gli ordinamenti esterni sono fatti su sequenze

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a gennaio 2012

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a gennaio 2012 Cognome Nome Matricola Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2011-12 16 gennaio 2012 Testo Il database di un videonoleggio è costituito da due vettori paralleli.

Dettagli

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

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008 Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Esercitazione 7 Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti

Dettagli

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT) QUICKSORT Basato sul paradigma divide-et-impera (come MERGE-SORT) Divide: stabilisce un valore di q tale da dividere l array A[p.. r] in due sottoarray non vuoti A[p.. q] e A[q+1.. r], dove ogni elemento

Dettagli

Programmazione di base

Programmazione di base Fondamenti di Informatica Testo A Secondo Appello 016-17 febbraio 017 Rispondi alle domande negli appositi spazi. I punti assegnati per ogni domanda sono indicati nel riquadro a lato. L'esame contiene

Dettagli

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011 Fondamenti di Informatica 1 Prof. B.Buttarazzi A.A. 2010/2011 Sommario Istruzione condizionale switch Istruzioni di salto break e continue Uso di variabili di tipo boolean Variabili di tipo array (monodimensionali)

Dettagli

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli ELEMENTI DI INFORMATICA L-B Ing. Claudia Chiusoli Materiale Lucidi delle lezioni Date degli appelli Testi di esami precedenti Informazioni e contatti http://www.lia.deis.unibo.it/courses/ Programma del

Dettagli

Richiami di Fondamenti di Informatica - 1

Richiami di Fondamenti di Informatica - 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 2 Richiami di Fondamenti di Informatica - 1 A. Miola Febbraio 2008 http://www.dia.uniroma3.it/~java/fondinf1/ Richiami di FdI-1

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 06 Algoritmi di ordinamento C. Limongelli Febbraio 2008 http://www.dia.uniroma3.it/~java/fondinf2/ Algoritmi di Ordinamento 1

Dettagli

ALGORITMI E STRUTTURE DATI

ALGORITMI E STRUTTURE DATI ALGORITMI E STRUTTURE DATI Esercitazioni AndreA Orlandini http://www.dia.uniroma3.it/~orlandin/asd/ e-mail: orlandin@dia.uniroma3.it Orario di ricevimento: Martedì 14.00-16.00 Introduzione al C + Array

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2012

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2012 Cognome Nome Matricola Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2011-12 17 settembre 2012 Testo Il database di un videonoleggio è costituito da due vettori paralleli.

Dettagli

Laboratorio di Programmazione 1 [Java]

Laboratorio di Programmazione 1 [Java] Laboratorio di Programmazione 1 [Java] Prova di esame - 7 Settembre 2010 Tempo massimo: 50 minuti Si implementino in Java le classi Tavolo e Ristorante. La classe Tavolo ha i seguenti attributi: numero

Dettagli

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.200.2005/06 Prof. V.L. Plantamura Dott.ssa A. Angelini Confronto di algoritmi Uno stesso problema può essere risolto in modi diversi,

Dettagli

Laboratorio di Programmazione 1 [Java]

Laboratorio di Programmazione 1 [Java] Laboratorio di Programmazione 1 [Java] Prova di esame - 26 Gennaio 2011 Tempo massimo: 50 minuti Si implementino in Java le classi Tavolo e Pizzeria. La classe Tavolo ha i seguenti attributi: nome (una

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche Fondamenti di Informatica Algebra di Boole: Concetti di base Fondamenti di Informatica - D. Talia - UNICAL Algebra di Boole E un algebra basata su tre operazioni logiche OR AND NOT Ed operandi che possono

Dettagli

Corso di Laurea in Matematica Corso di Informatica Prova d Esame del 02/02/2010

Corso di Laurea in Matematica Corso di Informatica Prova d Esame del 02/02/2010 Esercizio 1. Si deve modellare con una classe Java il contenuto di un portamonete, con delle opportune semplificazioni. Le monete da considerare sono di soli 4 tagli: 10, 20, 50 e 100 centesimi (cioè 1

Dettagli

Algoritmi di ordinamento (II parte)

Algoritmi di ordinamento (II parte) Algoritmi di ordinamento (II parte) E3: sommario Studio di due implementazioni di algoritmi avanzati Algoritmo ordinamento veloce (QuickSort) Algoritmo per fusione (MergeSort) Metodi offerti in java.util

Dettagli

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

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} } ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il

Dettagli

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

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false; Metodi iterativi con array monodimensionali 1. Scrivere un metodo che, dato un array di interi a, restituisce il valore minimo in a. public static int minimo (int[] a) { int min = a[0]; for (int i=1; i

Dettagli

Ordinamento. Scoperta guidata di tipici algoritmi: selection sort, bubble sort

Ordinamento. Scoperta guidata di tipici algoritmi: selection sort, bubble sort Ordinamento Scoperta guidata di tipici algoritmi: selection sort, bubble sort. Problema stimolo Si possiede una bilancia a due piatti ed N sacchi di iuta pieni di caffè. Ciascun sacco è identificato da

Dettagli

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

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 12 Array e Oggetti A. Miola Dicembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Array e Oggetti 1 Contenuti Array paralleli

Dettagli

Informatica 3 secondo recupero 13 Settembre 2002

Informatica 3 secondo recupero 13 Settembre 2002 Informatica 3 secondo recupero 13 Settembre 2002 Nome (stampatello) Cognome (stampatello) Matr Recupero: Prima prova in itinere Seconda prova in itinere spazio per il docente Punteggi recupero prima prova

Dettagli

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo) Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo) Selezione di prove di esame al calcolatore Esercizio 1 (esame del 13/01/2006) La classe Matrice definisce oggetti che rappresentano matrici

Dettagli

Un vettore è una struttura dati che permette di memorizzare sequenze di dati omogeneii (sequenze di interi, di valori booleani,...

Un vettore è una struttura dati che permette di memorizzare sequenze di dati omogeneii (sequenze di interi, di valori booleani,... Vettori (array) Un vettore è una struttura dati che permette di memorizzare sequenze di dati omogeneii (sequenze di interi, di valori booleani,...) I vettori sono caratterizzati da dimensione tipo Es.

Dettagli

Costrutti iterativi. Utilizzo dei costrutti iterativi

Costrutti iterativi. Utilizzo dei costrutti iterativi Costrutti iterativi Utilizzo dei costrutti iterativi Costrutti iterativi (1/3) I costrutti iterativi permettono di eseguire ripetutamente del codice Il linguaggio Java mette a disposizione tre costrutti

Dettagli

Algoritmi di ordinamento

Algoritmi di ordinamento Algoritmi di ordinamento! Selection Sort! Quick Sort! Lower bound alla complessità degli algoritmi di ordinamento Ordinamento 1 Selection Sort SelectionSort(dati[]) { for (i=0; idati.length-1; i++) { min

Dettagli

Esercitazione 6. Array

Esercitazione 6. Array Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione

Dettagli

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

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa. 3 ITI - a.s. 2007-2008 Compiti di Informatica ESTATE 2008 ARRAY E STRINGHE Scrivere una funzione che carica da tastiera un array di n elementi e lo stampa invertendo il primo elemento con l'ultimo, il

Dettagli

Problemi, algoritmi e oggetti

Problemi, algoritmi e oggetti Fondamenti di informatica Oggetti e Java Luca Cabibbo Capitolo 5 Marzo 2007 1 Fondamenti di informatica: Oggetti e Jav Contenuti... Problemi e algoritmi comprensione del problema identificazione di un

Dettagli

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22 Lezione 21 e 22 - Allocazione dinamica delle matrici - Generazione di numeri pseudocasuali - Funzioni per misurare il tempo - Parametri del main - Classificazione delle variabili Valentina Ciriani (2005-2008)

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011 Cognome Nome Matricola Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2010-11 22 luglio 2011 Testo Il database di un videonoleggio è costituito da due vettori paralleli.

Dettagli

Si può fare di meglio?

Si può fare di meglio? Si può fare di meglio? Gli algoritmi visti fino ad ora hanno costo O(n 2 ) È possibile fare di meglio? Quanto meglio? Algoritmi e Strutture Dati 1 Algoritmi divide et impera Idea generale Divide: Scomporre

Dettagli

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

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 6 - Blocchi e cicli Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it

Dettagli

Esercizi C su array e matrici

Esercizi C su array e matrici Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza,, ordinamento, ricerca e merge, matrice simmetrica, puntatori Array Array o vettore Composto da una serie di celle int vett[4]

Dettagli

Passare argomenti al programma

Passare argomenti al programma Passare argomenti al programma Quando si invoca un programma è possibile passare degli argomenti ad esso durante la chiamata. Gli argomenti ricevuti saranno stringhe (array di char) quindi l insieme di

Dettagli

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari 7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Fondamenti di Informatica AlgoBuild: Strutture selettive, iterative ed array Prof. Arcangelo Castiglione A.A. 2016/17 AlgoBuild : Strutture iterative e selettive OUTLINE Struttura selettiva Esempi Struttura

Dettagli

Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine. Ipotesi: gli elementi siano memorizzati in un array.

Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine. Ipotesi: gli elementi siano memorizzati in un array. ALGORITMI DI ORDINAMENTO Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine lo scopo finale è ben definito algoritmi equivalenti diversi i algoritmi i possono avere efficienza

Dettagli

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione Corso di Fondamenti di Programmazione canale E-O Tiziana Calamoneri Ricorsione DD Cap. 5, pp. 160-184 KP Cap. 5, pp. 199-208 Un esempio Problema: prendere in input un intero e calcolarne il fattoriale

Dettagli

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi: Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli

Dettagli

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014 Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi

Dettagli

Studio degli algoritmi

Studio degli algoritmi COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.2006/07 Prof. V.L. Plantamura Dott.ssa A. Angelini Studio degli algoritmi Dato un problema P, le problematiche riguardano: Sintesi

Dettagli

Concetto di Funzione e Procedura METODI in Java

Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Metodi e Sottoprogrammi Mentre in Java tramite le classi e gli oggetti è possibile

Dettagli

Bubble Sort. Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica. Elaborato di Algoritmi e Strutture Dati. Anno Accademico 2011/2012

Bubble Sort. Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica. Elaborato di Algoritmi e Strutture Dati. Anno Accademico 2011/2012 Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Elaborato di Algoritmi e Strutture Dati Bubble Sort Anno Accademico 2011/2012 Professore Carlo Sansone Studente Lampognana Francesca M63/000144

Dettagli

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A Matematica 13/11/2007 Teoria Compito A Domanda 1 Descrivere, eventualmente utilizzando uno schema, gli elementi funzionali di una CPU. Domanda 2 Java è un linguaggio compilato o interpretato? Motivare

Dettagli

Ordinamento per inserzione e per fusione

Ordinamento per inserzione e per fusione Ordinamento per inserzione e per fusione Alessio Orlandi 15 marzo 2010 Fusione: problema Problema Siano A e B due array di n A e n B interi rispettivamente. Si supponga che A e B siano ordinati in modo

Dettagli

Modulo 2: Strutture fondamentali della programmazione Java

Modulo 2: Strutture fondamentali della programmazione Java Modulo 2: Strutture fondamentali della programmazione Java Argomenti Trattati: Un semplice programma Java: Presentazione di un primo Esempio; Introduzione alla struttura; Compilazione ed esecuzione. Argomenti

Dettagli

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Analisi algoritmi ricorsivi e relazioni di ricorrenza Analisi algoritmi ricorsivi e relazioni di ricorrenza Punto della situazione Finora abbiamo affrontato: il tempo di esecuzione di un algoritmo, l analisi asintotica con le notazioni asintotiche e la tecnica

Dettagli

Ricerca binaria (o dicotomica) di un elemento in un vettore

Ricerca binaria (o dicotomica) di un elemento in un vettore Ricerca binaria (o dicotomica) di un elemento in un La ricerca binaria o dicotomica è utilizzata per ricercare i dati in un ORDNATO. L algoritmo di ricerca binaria, dopo ogni confronto, scarta metà degli

Dettagli

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

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ Heap e Heapsort Algoritmi di ordinamento Insertion Sort Quicksort Heapsort Insertion Sort L

Dettagli

Dati aggregati. Violetta Lonati

Dati aggregati. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica - in breve: Definizione di tipi Array Stringhe Strutture

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a febbraio 2013

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a febbraio 2013 Cognome Nome Matricola Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2012-13 22 febbraio 2013 Testo Il database di un videonoleggio è costituito da due vettori paralleli.

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa E04 Esempi di algoritmi e programmi C. Limongelli - A. Miola Settembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Esempi

Dettagli

Programmazione di base

Programmazione di base Fondamenti di Informatica Primo Appello 01-17 8 febbraio 017 Rispondi alle domande negli appositi spazi. I punti assegnati per ogni domanda sono indicati nel riquadro a lato. L'esame contiene 10 domande,

Dettagli

Programmazione II Compitino (Vers. A)

Programmazione II Compitino (Vers. A) Programmazione II Compitino (Vers. A) 17 dicembre 2015 Cognome... Nome... Matricola... Anno di corso... Nei seguenti quesiti, quando vi è richiesto di scrivere un programma, potete limitarvi al corpo del

Dettagli

Esercizi di Algoritmi e Strutture Dati

Esercizi di Algoritmi e Strutture Dati Esercizi di Algoritmi e Strutture Dati Moreno Marzolla marzolla@cs.unibo.it Ultimo aggiornamento: 10 novembre 2010 1 La bandiera nazionale (problema 4.7 del libro di testo). Il problema della bandiera

Dettagli

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013 Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario Metodi statici Parametri attuali e formali Passaggio dei parametri Effetti collaterali Metodi statici per Array Esercizi 16/01/2013

Dettagli

Lezione 8 Struct e qsort

Lezione 8 Struct e qsort Lezione 8 Struct e qsort Rossano Venturini rossano@di.unipi.it Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 3 QuickSort strambo Modificare il Quicksort

Dettagli

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt); Un esempio per iniziare Il controllo del programma in C DD Cap.3 pp.91-130 /* calcolo di 8!*/ #include #define C 8 int main() int i=1; int fatt=1; while (i

Dettagli

Java, Oggetti e Strutture Dati di G. Callegarin - Edizioni CEDAM

Java, Oggetti e Strutture Dati di G. Callegarin - Edizioni CEDAM Java, Oggetti e Strutture Dati di G. Callegarin - Edizioni CEDAM ERRATA CORRIGE dei programmi della prima stampa (Aprile 2004) aggiornato al 20/05/2017 Nota: il codice corretto è ottenibile da quella errato

Dettagli

Pr1: determinare il maggiore di n numeri interi n. Fondamenti di Informatica Prof. Vittoria de Nitto Personè

Pr1: determinare il maggiore di n numeri interi n. Fondamenti di Informatica Prof. Vittoria de Nitto Personè Pr1: determinare il maggiore di n numeri interi 1 2 3 4 n 1 Pr1: determinare il maggiore di n numeri interi 1 2 3 4 n P1. trovare il maggiore fra i primi 2 numeri; P2. trovare il maggiore fra il terzo

Dettagli

TSP Ricerca Locale. Riccardo Mondani Martina Alberti

TSP Ricerca Locale. Riccardo Mondani Martina Alberti TSP Ricerca Locale Riccardo Mondani Martina Alberti Caratteristiche di base Partenza: Soluzione euristica dell algoritmo TSP Closest Neighborhood. Il vettore o finale contiene un ordinamento di tutti i

Dettagli

Lezione 5 Sottoarray di somma massima

Lezione 5 Sottoarray di somma massima Lezione 5 Sottoarray di somma massima Rossano Venturini rossano@di.unipi.it Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 1 My strcat 1 Esercizio Implementare

Dettagli

Laboratorio di Programmazione Ottobre. Simone Zaccaria

Laboratorio di Programmazione Ottobre. Simone Zaccaria Laboratorio di Programmazione 27 31 Ottobre Simone Zaccaria Esercizio di Ripasso Scrivere un programma che: 1. dichiari 2 variabili a e b; 2. inizializzi le 2 variabili con valori numerici a scelta; 3.

Dettagli

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1 Si definisca Interval Tree un albero binario di ricerca le

Dettagli

Corso: Fondamenti di Informatica (Canale 5) a.a Corsi di laurea: Ing. Settore Informazione

Corso: Fondamenti di Informatica (Canale 5) a.a Corsi di laurea: Ing. Settore Informazione Domanda n. 1 Corso: Fondamenti di Informatica (Canale 5) a.a. 2016-17 Corsi di laurea: Ing. Settore Informazione Questionario a Risposte Multiple per auto-valutazione del Lab10 Argomento: Algoritmi e complessita'

Dettagli

Laboratorio di Matlab

Laboratorio di Matlab Laboratorio di Matlab Alessandro Formaglio Dipartimento di Ingegneria dell Informazione, Università di Siena alex@dii.unisi.it http://www.dii.unisi.it/ control/matlab/labmatlab.html 9 Luglio 2009 DII -

Dettagli

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

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length); Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Fondamenti di Informatica Prima prova intermedia - 11 Novembre 2009 Si risolvano i seguenti esercizi. Il compitino prevede un punteggio massimo di 15/14-esimi, cui andranno sommati i punti ottenuti nel

Dettagli

Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso

Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso AA 2015/2016 Tutor: Vincenzo Lomonaco vincenzo.lomonaco@unibo.it Programma Introduzione al calcolatore

Dettagli

GESTIONE DEGLI ERRORI

GESTIONE DEGLI ERRORI GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori L approccio classico consiste nell inserire controlli (if else..) per cercare di intercettare a priori

Dettagli

Programmazione II Compitino (Vers. B)

Programmazione II Compitino (Vers. B) Programmazione II Compitino (Vers. B) 17 dicembre 2015 Cognome Jackson Nome Michael Matricola 696969 Anno di corso 1 Nei seguenti quesiti, quando vi è richiesto di scrivere un programma, potete limitarvi

Dettagli

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013 Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario La ricorsione Metodi ricorsivi Esercizi proposti 16/01/2013 2 La ricorsione In Java ogni metodo può chiamare anche se stesso,

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2009-10 I scritto Febbraio 11 Febbraio 2011

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2009-10 I scritto Febbraio 11 Febbraio 2011 Cognome Matricola Nome Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2009-10 I scritto Febbraio 11 Febbraio 2011 Quesito La Biblioteca è costituita da due array: il primo

Dettagli

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso Obiettivi Di seguito vengono riportate una serie di domande che possono essere poste durante la prova formale del corso. Le seguenti domande non sono da ritenersi esaustive ma esemplificative. 1. Architettura

Dettagli