La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Linguaggio Java e Algoritmi ( 09CBIPC, 09CBIMQ ) Corsi di Laurea in Ingegneria del cinema e dei mezzi di comunicazione Matematica per l’Ingegneria Silvano.

Presentazioni simili


Presentazione sul tema: "Linguaggio Java e Algoritmi ( 09CBIPC, 09CBIMQ ) Corsi di Laurea in Ingegneria del cinema e dei mezzi di comunicazione Matematica per l’Ingegneria Silvano."— Transcript della presentazione:

1 Linguaggio Java e Algoritmi ( 09CBIPC, 09CBIMQ ) Corsi di Laurea in Ingegneria del cinema e dei mezzi di comunicazione Matematica per l’Ingegneria Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino1

2 Java language Originally developed by James Gosling at Sun Microsystems and released in 1995 It derives much of its syntax from C and C++ Java applications are typically compiled to bytecode that can run on any Java Virtual Machine (JVM) regardless of computer architecture As of May 2007 Sun relicensed most of its Java technologies under the GNU General Public License Sun Microsystems was acquired by Oracle Corporation's in 2010 Java is as of 2012 one of the most popular programming languages in use, particularly for client-server web applications, with a reported 10 million users Google and Android, Inc. have chosen to use Java to design applications for the Android operating system, an open-source operating system built on the Linux 2.6 kernel, designed primarily for touchscreen mobile devices (smartphones, tablet PCs, mobile Internet devices, …) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 2

3 Java Environment Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino3 Java bytecodes platform-independent intermediate language Java Virtual Machine (Java VM) virtual machine able to execute Java bytecodes Java bytecodesJava source

4 Java Portability Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino4 any implementation of Java VM can execute Java bytecodes

5 Java Security Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino5 Check of correctness of parameter types and compliance with access rules

6 Java Platform Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino6 Java Application Programming Interface (Java API) set of Java bytecodes libraries (packages) supporting a large range of functionalities http://docs.oracle.com/javase/6/docs/api/index.html

7 Java Technology Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino7 CDC = Connected Device Configuration CLDC = Connected Limited Device Configuration PDA = Personal Digital Assistant (palmare) POS = Point Of Sale

8 Java Platform - Standard Edition Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino8

9 Java Development Kit (JDK) Tools Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino9 javac The compiler for the Java programming language. java The launcher for Java applications. javadoc API documentation generator. appletviewer Run and debug applets without a web browser. jar Manage Java Archive (JAR) files. jdb The Java Debugger. javah C header and stub generator. Used to write native methods. javap Class file disassembler extcheck Utility to detect Jar conflicts.

10 Java: HelloWorld program Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino10 HelloWorld.java public class HelloWorld { /* The HelloWorld class implements an application that displays "Hello World!" to the standard output */ public static void main ( String[] args ) { System.out.println( "Hello World!" ); }

11 Eclipse Integrated Development Environment (IDE) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino11

12 (real numbers) (integers) (other types) Keyword byte short int long float double char boolean Description Byte-length integer Short integer Integer Long integer Single-precision floating point Double-precision floating point A single character A boolean value ( true or false ) Size/Format 8-bit two's complement 16-bit two's complement 32-bit two's complement 64-bit two's complement 32-bit IEEE 754 64-bit IEEE 754 16-bit Unicode character true or false Java: Primitive Data Types Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino12 LiteralData type 178int 8864Llong 37.266double 37.266Ddouble 87.363Ffloat 26.77e3double ' c'' c'char trueboolean falseboolean

13 Java: Arithmetic Operators Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino13 OperatorUse Description ++op++ Increments op by 1; evaluates to the value of op before it was incremented ++++op Increments op by 1; evaluates to the value of op after it was incremented --op-- Decrements op by 1; evaluates to the value of op before it was decremented ----op Decrements op by 1; evaluates to the value of op after it was decremented OperatorUseDescription +op1 + op2 Adds op1 and op2 -op1 - op2 Subtracts op2 from op1 *op1 * op2 Multiplies op1 by op2 /op1 / op2 Divides op1 by op2 %op1 % op2 Computes the remainder of dividing op1 by op2

14 Java: Relational and Conditional Operators Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino14 Operator Use Returns true if && op1 && op2 op1 and op2 are both true, conditionally evaluates op2 || op1 || op2 either op1 or op2 is true, conditionally evaluates op2 ! ! op op is false & op1 & op2 op1 and op2 are both true, always evaluates op1 and op2 | op1 | op2 either op1 or op2 is true, always evaluates op1 and op2 ^ op1 ^ op2 if op1 and op2 are different--that is if one or the other of the operands is true but not both OperatorUse Returns true if >op1 > op2op1 is greater than op2 >=op1 >= op2op1 is greater than or equal to op2 <op1 < op2op1 is less than op2 <=op1 <= op2op1 is less than or equal to op2 ==op1 and op2 are equal !=op1 != op2op1 and op2 are not equal op1 == op2

15 Java: Shift and Logical Operators Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino15 OperatorUseOperation >>op1 >> op2 shift bits of op1 right by distance op2 <<op1 << op2 shift bits of op1 left by distance op2 >>>op1 >>> op2 shift bits of op1 right by distance op2 (unsigned) OperatorUseOperation &op1 & op2 bitwise and |op1 | op2 bitwise or ^op1 ^ op2 bitwise xor ~~op2 bitwise complement

16 Java: Assignment Operators Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino16 OperatorUseEquivalent to +=op1 += op2op1 = op1 + op2 -=-= op1 -= op2op1 = op1 - op2 *=op1 *= op2op1 = op1 * op2 /=op1 /= op2op1 = op1 / op2 %=op1 %= op2op1 = op1 % op2 &=op1 &= op2op1 = op1 & op2 |=op1 |= op2op1 = op1 | op2 ^=op1 ^= op2op1 = op1 ^ op2 <<=op1 <<= op2op1 = op1 << op2 >>=op1 >>= op2op1 = op1 >> op2 >>>=op1 >>>= op2op1 = op1 >>> op2 op1= op2;

17 Java: Other Operators Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino17 Operator UseDescription ?: op1 ? op2 : op3 If op1 is true, returns op2. Otherwise, returns op3. [ ] type [] Declares an array of unknown length, which contains type elements. [ ] type [ op1 ] Creates and array with op1 elements. Must be used with the new operator. [ ] op1[ op2 ] Accesses the element at op2 index within the array op1. Indices begin at 0 and extend through the length of the array minus one.. op1.op2 Is a reference to the op2 member of op1. ( ) op1(params) Declares or calls the method named op1 with the specified parameters. The list of parameters can be an empty list. The list is comma-separated. (type) (type) op1 Casts (converts) op1 to type. An exception will be thrown if the type of op1 is incompatible with type. new new op1 Creates a new object or array. op1 is either a call to a constructor, or an array specification. instanceof op1 instanceof op2 Returns true if op1 is an instance of op2

18 Java: Control Flow Statements - looping Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino18 while (boolean expression) { statement(s) } do { statement(s) } while (boolean expression); for (initialization ; termination ; increment ) { statement(s) }

19 Java: Control Flow Statements – decision making Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino19 if (boolean expression) { statement(s) } if (boolean expression) { statement(s) } else { statement(s) } switch (expression) { case constant expression : statement(s) break;... default: statement(s) break; }

20 Java: Control Flow Statements – branching Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino20 label: someJavaStatement ; break; terminates the innermost switch, for, while, or do - while statement break label; terminates an outer switch, for, while, or do - while statement with the given label continue; terminates the current iteration of the innermost loop continue label; terminates the current iteration of the loop with the given label return; terminates the current method return value; terminates the current method and returns a value to the method's caller

21 Java: Creating Arrays Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino21 Declaring a Variable to Refer to an Array int[] anArray; // declare an array of integers float[] anArrayOfFloats; boolean[] anArrayOfBooleans; Object[] anArrayOfObjects; String[] anArrayOfStrings; Creating an Array anArray = new int[10]; // create an array of 10 integers Declaring, Creating and Initializing an Array boolean[] answers = { true, false, true, true, false };

22 Java: Using Arrays Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino22 Copying Arrays System.arraycopy (Object source, int srcIndex, Object dest, int destIndex, int length) Getting the Size of an Array arrayname.length Accessing an Array Element anArray[i] source

23 Java: Iterating through Arrays (for statement) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino23 Iterating through Arrays class ForDemo { public static void main(String[] args) { int[] numbers = {1,2,3,4,5,6,7,8,9,10}; for (int i=0 ; i<numbers.length ; i++) System.out.print(" " + numbers[i]); }

24 Java: Iterating through Arrays (enhanced for statement) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino24 Iterating through Arrays class EnhancedForDemo { public static void main(String[] args) { int[] numbers = {1,2,3,4,5,6,7,8,9,10}; for (int item : numbers) System.out.print(" " + item); }

25 Software Quality Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino25 to perform appropriately, relative to the amount of resources used to perform the requirements and specification to be user friendly to be in a failure-free condition at all times to provide appropriate response and processing time to be easily and transparently upgradable to keep away from security threats to be easily modifiable to have consideration for future growth to perform appropriately, relative to the amount of resources used to perform the requirements and specification to be user friendly to be in a failure-free condition at all times to provide appropriate response and processing time to be easily and transparently upgradable to keep away from security threats to be easily modifiable to have consideration for future growth Functionality Usability Performance Reliability Efficiency Scalability Extensibility Security Maintainability Software Quality

26 Complessità computazionale algoritmoalgoritmo : sequenza finita di operazioni, capace di risolvere un determinato problema in un tempo finito programmaprogramma : rappresentazione di un algoritmo mediante un linguaggio di programmazione dimensionedimensione di un problema : intero positivo n proporzionale allo spazio occupato dai dati di ingresso relativi al problema complessità temporalespazialecomplessità temporale ( o spaziale ) di un algoritmo : indicazione del tempo ( o dello spazio ) richiesto dall'algoritmo in funzione della dimensione n del problema Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 26

27 Complessità worst/average case complessità nel caso peggiore ( worst-case ) : D n è l'insieme degli ingressi I di dimensione n t (I ) è il tempo di esecuzione relativo all'ingresso I complessità media ( average-case ) : p( I ) è la probabilità di I Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 27 W(n) = max { t( I )  I  D n } A(n) =  p( I ) t( I ) I  D n

28 Complessità Asintotica Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino28 non superiore insieme delle funzioni che crescono con rapidità non superiore a quella di f(n) uguale insieme delle funzioni che crescono con rapidità uguale a quella di f(n) non inferiore insieme delle funzioni che crescono con rapidità non inferiore a quella di f(n)  ( f(n) )  ( f(n) )  ( f(n) )

29 Notazione  Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino29  ( f(n) ) è l'insieme di tutte le funzioni g(n) tali che esistano due costanti positive c e m per cui : g(n)  c f(n),  n ( n  m ) g(n)   ( f(n) ) se lim = c La notazione  delimita superiormente la crescita asintotica della complessità e fornisce quindi una indicazione della bontà di un algoritmo g(n) f(n) n   c  (log n)  ( (log n) k )  (n)  ( n(log n) k )   (n k )  ( n k (log n) h )  (n k+1 )  (d n )

30 Notazione  Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino30  ( f(n) ) è l'insieme di tutte le funzioni g(n) tali che esistano due costanti positive c e m per cui : g(n)  c f(n),  n ( n  m ) g(n)   (f(n)) se lim = f(n)   O( g(n) ) se e solo se g(n)   ( f(n) ) Un algoritmo di complessità O( f(n) ) si dice ottimo se qualunque algoritmo che risolva lo stesso problema ha complessità  ( f(n) ) c > 0  g(n) f(n) n 

31 Programming in the Small/Large Programming in the smallProgramming in the small software projects are developed by single programmers main problems to be solved: choice of appropriate data structures development of efficient algorithms Programming in the largeProgramming in the large software projects are developed by large groups of programmers different groups make development (analysis, design, coding, integration, testing) maintenance (extensions, upgrading) over large time intervals main problems to be solved: good choice of software components communication of information among components component integration Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 31

32 Sviluppo di algoritmi per raffinamenti successivi Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino32 definizione delle specifiche del problema scomposizione del problema in una sequenza, o selezione, o iterazione di sottoproblemi e definizione delle specifiche di ciascun sottoproblema soluzione ricorsiva del problema codifica della soluzione scelta di un problema start stop si no la soluzione del problema è esprimibile direttamente nel linguaggio di programmazione prescelto ? uno dei sottoproblemi generati coincide con uno dei problemi da cui è stato derivato ? ancora problemi da risolvere ? nosi

33 Massimo Comune Divisore (1) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino33 MCD(a,b) = MCD(b,a) MCD(a,a) = a MCD(a,0) = a /* a,b interi positivi */ CALCOLA MassimoComuneDivisore(a,b) /* MCD(a,b) */ P

34 Massimo Comune Divisore (2) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino34 /* a,b interi positivi */ { int x,y; P1: INIZIALIZZA x,y ; /* MCD(x,y) = MCD(a,b) */ while (x!=y) P2: RIDUCI |x-y| SENZA VARIARE MCD(x,y) ; } /* x = MCD(a,b) */ P MCD(a,a) = a /* a,b interi positivi */ { x=a; y=b; } /* MCD(x,y) = MCD(a,b) */ P1

35 Massimo Comune Divisore (3) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino35 /* MCD(x,y) = MCD(a,b); x!=y */ { if (x>y) x -= y; else y -= x; } /* MCD(x,y) = MCD(a,b) */ P2 Se k è divisore comune di x e y  x = k q x ; y = k q y  |x-y| = k |q x - q y |  k è divisore comune di |x-y|

36 Massimo Comune Divisore (4) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino36 /* a,b interi positivi */ { int x,y; /* P1: INIZIALIZZA x,y */ x=a; y=b; /* MCD(x,y) = MCD(a,b) */ while (x!=y) /* P2: RIDUCI |x-y| SENZA VARIARE MCD(x,y) */ if (x>y) x -= y; else y -= x; } /* x = MCD(a,b) */ P

37 Massimo Comune Divisore (5) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino37 public class Mcd1 { public static void main( String[] args ) { System.out.println("MCD(42,56)= "+ mcd(42,56)); } static int mcd(int a, int b) { while (a!=b) if (a>b) a -= b; else b -= a; return a; }

38 Massimo Comune Divisore (6) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino38 /* a,b interi positivi */ { int x,y; P1: INIZIALIZZA x,y ; /* MCD(x,y) = MCD(a,b) */ while (y!=0) P3: RIDUCI y SENZA VARIARE MCD(x,y) ; } /* x = MCD(a,b) */ P MCD(a,0) = a /* a,b interi positivi */ { x=a; y=b; } /* MCD(x,y) = MCD(a,b) */ P1

39 Massimo Comune Divisore (7) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino39 /* MCD(x,y) = MCD(a,b); y!=0 */ { r = x % y; x = y; y = r; } /* MCD(x,y) = MCD(a,b) */ P3 Se k è divisore comune di x e y  x = k q x ; y = k q y  x % y = x – (x / y) y = k(q x – (x / y) q y )  k è divisore comune di x % y MCD(x,y) = MCD(y,x%y)

40 Massimo Comune Divisore (8) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino40 /* a,b interi positivi */ { int x,y,r; /* P1: INIZIALIZZA x,y */ x=a; y=b; /* MCD(x,y) = MCD(a,b) */ while (y!=0) /* P2: RIDUCI y SENZA VARIARE MCD(x,y) */ { r = x % y; x = y; y = r; } /* x = MCD(a,b) */ P

41 Massimo Comune Divisore (Euclide) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino41 public class Mcd2 { public static void main( String[] args ) { System.out.println("MCD(42,56)= "+ mcd(42,56)); } static int mcd(int a, int b) { int r; while (b!=0) { r = a % b; a = b; b = r; } return a; }

42 Ricorsione Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino42 n! = n*(n-1)! 1! = 1

43 Algoritmi ricorsivi (MCD) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino43 /* a,b interi positivi */ int mcd(int a, int b) { if (b==0) return a; else return mcd(b,a%b); } MCD(a,b) = MCD(b,a%b) MCD(a,0) = a mcd(36,42) mcd(42,36) mcd(36,6) mcd(6,0) 6 6 6 6

44 Algoritmi ricorsivi (Fattoriale) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino44 /* n intero positivo */ int fact(int n) { if (n==1) return 1; else return n * fact(n-1); } n! = n*(n-1)! 1! = 1 fact(4) fact(3) fact(2) fact(1) 24 6 2 1 complessità:  (n)

45 Algoritmi ricorsivi (Potenza) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino45 b¹ = b b e = b * b e-1 /* b,e interi positivi */ int pot(int b, int e) { if (e==1) return b; else return b * pot(b,e-1); } complessità:  (e) pot(3,4) pot(3,3) pot(3,2) pot(3,1) 81 27 9 3

46 Algoritmi ricorsivi (Potenza) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino46 /* b,e interi positivi */ int pot(int b, int e) { if (e==1) return b; else if ((e & 1)==1) return b*pot(b*b,e/2); //e dispari else return pot(b*b,e/2); //e pari } b¹ = b e pari  b e = (b * b) e/2 e dispari  b e = b * b e-1 = b * (b * b) e/2 pot(3,5) pot(9,2) pot(81,1) 243 81 complessità:  (log 2 e)

47 Algoritmi ricorsivi (Torri di Hanoi) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino47 n 1 sorgenteintermediadestinazione /* n dischi ordinati in s */ Sposta n dischi da s a d utilizzando i, muovendo un disco per volta e mantenendo l’ordinamento /* n dischi ordinati in d */ P

48 Algoritmi ricorsivi (Torri di Hanoi) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino48 sorgenteintermediadestinazione n 1 n-1 n 1

49 Algoritmi ricorsivi (Torri di Hanoi) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino49 /* n dischi ordinati in s */ { P: Sposta n-1 dischi da s a i utilizzando d, muovendo un disco per volta e mantenendo l’ordinamento; /* n-1 dischi ordinati in i */ P1: Sposta il disco n da s a d; P: Sposta n-1 dischi da i a d utilizzando s, muovendo un disco per volta e mantenendo l’ordinamento; } /* n dischi ordinati in d */ P

50 Algoritmi ricorsivi (Torri di Hanoi) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino50 /* n dischi ordinati in s */ void hanoi(int n, char s, char i, char d) { if (n==1) System.out.println("muovi 1 da " + s + " a " + d); else { hanoi(n-1,s,d,i); /* n-1 dischi ordinati in i */ System.out.println("muovi " + n + " da " + s + " a " + d); hanoi(n-1,i,s,d); } /* n dischi ordinati in d */ P

51 Algoritmi ricorsivi (Torri di Hanoi) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino51 public class Hanoi { public static void main( String[] args ) { hanoi(5,'S','I','D'); } static void hanoi(int n, char s, char i, char d) { if (n==1) System.out.println("muovi 1 da " + s + " a " + d); else { hanoi(n-1,s,d,i); System.out.println("muovi " + n + " da " + s + " a " + d); hanoi(n-1,i,s,d); }

52 Algoritmi ricorsivi (Torri di Hanoi) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino52 n n-1 n-2 n-1 n-2 complessità:  (2 n ) 11111 1 11 2020 2121 2 2 n-1 … 2 0 + 2 1 + 2 2 +…+ 2 n-1 = 2 n - 1

53 Algoritmi ricorsivi (Fibonacci) L'intento di Fibonacci (Pisa, 1170-1240) era quello di trovare una legge matematica che potesse descrivere la crescita di una popolazione di conigli Assumendo per ipotesi che: si disponga di una coppia di conigli appena nati questa coppia diventi fertile al compimento del primo mese e dia alla luce una nuova coppia al compimento del secondo mese le coppie fertili, dal secondo mese di vita in poi, diano alla luce una coppia di figli al mese le nuove coppie nate si comportino in modo analogo si verifica quanto segue: nel primo mese c’è 1 coppia di conigli (non fertile) nel secondo mese c’è 1 coppia (fertile) nel terzo mese ci saranno 1+1=2 coppie (1 fertile, 1 non fertile) nel quarto mese ci saranno 1+2=3 coppie (2 fertili, 1 non fertile) nel quinto mese ci saranno 2+3=5 coppie (3 fertili, 2 non fertili) … in ogni mese il numero totale di coppie è uguale alla somma dei numeri di coppie presenti nei due mesi precedenti: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, … Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 53

54 Algoritmi ricorsivi (Fibonacci) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino54 /* n intero positivo */ int fib(int n) { if (n<=1) return n; else return fib(n-1) + fib(n-2); } fib(n) = fib(n-1) + fib(n-2) fib(1) = 1 fib(0) = 0 Mario Merz: Il volo dei numeri Torino, Luci d’artista

55 Algoritmi ricorsivi (Fibonacci) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino55 3 fib(4) 2 1 1 11 0 1 0 fib(3) fib(2) fib(1)fib(0) fib(2) fib(1)fib(0)fib(1) complessità:  (2 n )

56 Ricorsione  Iterazione (Fibonacci) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino56 /* n intero positivo */ int fib(int n) { int f1=1; int f0=0; for (int i=1; i<n; i++) { /* f1 = fib(i), f0 = fib(i-1) */ f1 += f0; /* f1 = fib(i+1), f0 = fib(i-1) */ f0 = f1-f0; /* f1 = fib(i+1), f0 = fib(i) */ } return f1; } complessità:  (n)

57 Algoritmi di ordinamento Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino57 v 0 N-1 v v 0 0 i insieme non ancora ordinato insieme ordinato int[] v;... for(i=0; i<v.length; i++) { P1: SPOSTA UN ELEMENTO DI v DALLA PORZIONE NON ORDINATA A QUELLA ORDINATA } P v v

58 Algoritmi di ordinamento (crescente) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino58 P12: SELEZIONA IL PIU’PICCOLO ELEMENTO DELLA PORZIONE NON ORDINATA E SCAMBIALO CON QUELLO DI INDICE i P1 P13: INSERISCI L’ELEMENTO DI INDICE i NELLA PORZIONE ORDINATA, SPOSTANDO IN AVANTI QUELLI PIU’ GRANDI P1 v 0 N-1 i m v 0 i

59 Ordinamento per selezione Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino59 m = v[i] ; im = i ; for(j=i+1; j<N; j++) if( v[j] < m ) { m = v[j]; im = j; } v[im] = v[i]; v[i] = m; P12 v 0 N-1 i im m 1 3 2

60 Ordinamento per selezione Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino60 void selectSort(int[] v) { int i,j,m,im; int n = v.length; for (i=0; i<n-1; i++) { m = v[i]; im = i; for (j=i+1; j<n; j++) if( v[j] < m ) { m = v[j]; im = j; } v[im] = v[i]; v[i] = m; } complessità:  (n 2 )

61 Ordinamento per selezione Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino61 public class Selectsort { public static void main(String[] args) { int[] a = {3,2,4,6,3,9,8,7,5}; selectSort(a); for(int i:a) System.out.print(i+" "); } static void selectSort(int[] v) {... }

62 Ordinamento per inserimento Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino62 x = v[i] ; for( j=i-1; j>=0 && x<v[j]; j-- ) v[j+1] = v[j]; v[j+1] = x; P13 v 0 N-1 i v 0 i x 1 3 2 4

63 Ordinamento per inserimento Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino63 void insertSort(int[] v) { int i,j,x; int n = v.length; for (i=1; i<n; i++) { x = v[i]; for (j=i-1; j>=0 && x<v[j]; j--) v[j+1] = v[j]; v[j+1] = x; } complessità:  (n 2 )

64 Ordinamento per inserimento Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino64 public class Insertsort { public static void main(String[] args) { int[] a = {3,2,4,6,3,9,8,7,5}; insertSort(a); for(int i:a) System.out.print(i+" "); } static void insertSort(int[] v) {... }

65 Quicksort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino65 v l h m int[] v;... { P1: PARTIZIONA GLI ELEMENTI DI v IN MODO TALE CHE OGNI ELEMENTO DELLA PARTIZIONE VERDE SIA MINORE DI (O UGUALE A) OGNI ELEMENTO DELLA PARTIZIONE ROSSA P: ORDINA GLI ELEMENTI NELLA PARTIZIONE VERDE P: ORDINA GLI ELEMENTI NELLA PARTIZIONE ROSSA } P

66 Quicksort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino66 void quickSort(int[] v, int l, int h) { int m; if ( l < h ) { m = partition(v, l, h); /* P1 */ quickSort(v, l, m); quickSort(v, m+1, h); }

67 Quicksort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino67 int partition ( int[] v, int i, int j ) { SCEGLI COME PERNO UN QUALUNQUE ELEMENTO x DI v while (true) { FINCHÈ v[i] =x */ FINCHÈ v[j] > x DECREMENTA j /* v[j]<=x */ if ( i < j ) SCAMBIA TRA LORO v[i] E v[j] else return j } P1 v i j v[ i ] < x v[ j ] > x

68 Quicksort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino68 int partition(int[] v, int i, int j) { int x,t; x = v[(i+j)/2]; while (true) { while ( v[i] < x ) i++ ; while ( v[j] > x ) j-- ; if ( i < j ) { t = v[i]; v[i] = v[j]; v[j] = t; i++; j--; } else return j; } P1 complessità(partition):  (n)compl_media(quickSort):  (n  log 2 n)

69 Quicksort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino69 public class Quicksort { public static void main(String[] args) { int[] a = {3,2,4,6,3,9,8,7,5}; quickSort(a, 0, a.length-1); for(int i:a) System.out.print(i+" "); } static void quickSort(int[] v, int l, int h) {... } static int partition(int[] v, int i, int j) {... }

70 Mergesort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino70 v l h l + h 2 int[] v;... { P: ORDINA LA PRIMA METÀ DI v P: ORDINA LA SECONDA METÀ DI v P1: FONDI LE DUE METÀ IN UN UNICO INSIEME ORDINATO } P

71 Mergesort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino71 void mergeSort(int[] v, int l, int h) { int m; if ( l < h ) { m = (l+h)/2; mergeSort(v, l, m); mergeSort(v, m+1, h); merge(v, l, h); /* P1 */ }

72 Mergesort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino72 void merge ( int[] v, int l, int h ) { COPIA LA PRIMA METÀ DI v IN aux NELLO STESSO ORDINE COPIA LA SECONDA METÀ DI v IN aux IN ORDINE INVERSO i = l; j = h; for (k = l; k <= h; k++) v[k] = (aux[j] < aux[i])? aux[j--]: aux[i++]; } P1

73 Mergesort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino73 void merge(int[] v, int l, int h) { int i,j,k,m; m = (l+h)/2; for (i = l; i <= m; i++) aux[i] = v[i]; for (j = m+1; j <= h; j++) aux[j] = v[h-j+m+1]; i = l; j = h; for (k = l; k <= h; k++) v[k] = (aux[j] < aux[i])? aux[j--]: aux[i++]; } P1 complessità(merge):  (n) complessità(mergeSort):  (n  log 2 n)

74 Mergesort Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino74 public class Mergesort { static int[] aux; public static void main(String[] args) { int[] a = {3,2,4,6,3,9,8,7,5}; aux = new int[a.length]; mergeSort(a, 0, a.length-1); for(int i:a) System.out.print(i+" "); } static void mergeSort(int[] v, int l, int h) {... } static void merge(int[] v, int l, int h) {... }

75 Algoritmi di ricerca Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino75 v insieme x int[] v; int x;... { if ( x È UN ELEMENTO DI v ) return LA POSIZIONE DI x IN v ; else return -1 ; } P

76 Ricerca in insiemi non ordinati Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino76 int search(int[] v, int x) { int i; int n = v.length; for (i=0; i<n; i++) if (x == v[i]) return i; return -1; } complessità:  (n)

77 Ricerca in insiemi ordinati (crescenti) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino77 int search(int[] v, int x) { int i; int n = v.length; for (i=0; i = v[i]; i++) if (x == v[i]) return i; return -1; } complessità:  (n)

78 Ricerca dicotomica (binaria) in insiemi ordinati (crescenti) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino78 int[] v; int x; int m;... { m = (l+h)/2; if ( x == v[m] ) return m ; else if ( x < v[m] ) P: RICERCA x NELLA PRIMA METÀ DI v; else P: RICERCA x NELLA SECONDA METÀ DI v; } P v l h l + h 2

79 Ricerca binaria (ricorsiva) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino79 int rbsearch(int[] v, int l, int h, int x) { int m; if ( l > h ) return -1; else { m = (l+h)/2; if ( x == v[m] ) return m; if ( x < v[m] ) return rbsearch(v, l, m-1, x); else return rbsearch(v, m+1, h, x); } complessità:  (log 2 n)

80 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino80 Ricerca binaria (iterativa) int ibsearch(int[] v, int l, int h, int x) { int m; while ( l <= h ) { m = (l+h)/2; if ( x == v[m] ) return m; if ( x < v[m] ) h=m-1; else l=m+1; } return -1 } complessità:  (log 2 n)

81 Ricerca indicizzata da chiave Se gli elementi con chiave di ricerca x vengono memorizzati nella posizione x, il tempo di accesso è costante Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 81 … 325 … 673 … 729 … 325 Tuttavia, se l’intervallo dei valori di x è molto più grande del numero di elementi da memorizzare, lo spreco di memoria diventa inaccettabile Es: se 0 < x < 1000 e il numero di elementi è 100, lo spreco è del 90% 673 729 0 x max x = v[x]

82 Tabelle Hash funzione hashUna funzione hash trasforma una chiave x in un indice h(x) minore della dimensione N della tabella Es: h(x) = x % NN = 100 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 82 … 325 … 729 … 673 … 25 29 73 0 99 x = v[ h(x) ] Se h(x 1 ) = h(x 2 ), si verifica una collisione Es: 729%100 = 29 = 29%100 = 129%100 = 229%100 = …

83 Risoluzione delle collisioni (con scansione lineare) Quando si verifica una collisione ( la posizione h(x) è già occupata), l’elemento con chiave x viene inserito nella prima posizione libera successiva Es: N = 100 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 83 … 325 127 528 729 831 232 … 25 27 29 26 30 x = v[ (x%N + i)%N ] 28 31 32 insert(427) posizione k libera: v[k] = -1

84 Tabella Hash a scansione lineare Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino84 int[] v = new int[N]; for(int i=0; i< v.length; i++) v[i]= -1; void insert(int[] v, int x) { int i = x % v.length; while ( v[i] != -1 ) i = (i+1) % v.length; v[i] = x; } int search(int[] v, int x) { int i = x % v.length; while ( v[i] != -1 ) if (v[i] == x) return i; else i = (i+1) % v.length; return -1; }

85 Costo della scansione lineare Nel caso peggiore la scansione lineare ha complessità O(n) ( n = numero di elementi presenti nella tabella ) Il costo (numero di sondaggi) medio di una ricerca è: (ricerca con successo) (ricerca senza successo) dove  = n / N è il fattore di carico La complessità media di una ricerca è pertanto: O( n / (N-n) ) (con successo) O( n 2 / (N-n) 2 ) (senza successo) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino 85 1212 + 1 2(1-  ) 1212 + 1 2(1-  ) 2


Scaricare ppt "Linguaggio Java e Algoritmi ( 09CBIPC, 09CBIMQ ) Corsi di Laurea in Ingegneria del cinema e dei mezzi di comunicazione Matematica per l’Ingegneria Silvano."

Presentazioni simili


Annunci Google