Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫...

64
1 Antonio Virdis - 2019 Algoritmi e Strutture Dati Lezione 2 Antonio Virdis [email protected] www.iet.unipi.it/a.virdis

Transcript of Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫...

Page 1: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

1Antonio Virdis - 2019

Algoritmi e Strutture Dati

Lezione 2

Antonio Virdis

[email protected]

www.iet.unipi.it/a.virdis

Page 2: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

2Antonio Virdis - 2019

Sommario

⚫ Merge Sort

⚫ Ordinamento STL

⚫ Gestione Liste

⚫ Esercizi

Page 3: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

3Antonio Virdis - 2019

A metà

Size

Size/2 Size/2

Page 4: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

4Antonio Virdis - 2019

A metà

Size

Size/2 Size/2

Page 5: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

5Antonio Virdis - 2019

Unire gli array

Page 6: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

6Antonio Virdis - 2019

1 4 9 12 27 2 3 5 6 8

iSx iDx

Page 7: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

7Antonio Virdis - 2019

combinavoid combina( int arr[] , int start , int mid , int end )

{

// init Variabili di stato + buffer appoggio

while(1)

{

// se arr[iSx] più piccolo

{

// Inserisco arr[iSx]

}

// se arr[iDx] più piccolo

{

// Inserisco arr[iDx]

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Page 8: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

8Antonio Virdis - 2019

combinavoid combina( int arr[] , int start , int mid , int end )

{

int iSx = start , iDx = mid; // stato

std::vector<int> tempResult; // buffer

while(1)

{

if(arr[iSx] < arr[iDx])

{

tempResult.push_back(arr[iSx++]);

// CONDIZIONE USCITA

}

else

{

tempResult.push_back(arr[iDx++]);

// CONDIZIONE USCITA

}

}

// GESTISCO ULTIMI

// RICOPIO da buffer a arr

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Page 9: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

Antonio Virdis - 2019

Page 10: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

10Antonio Virdis - 2019

divideSize

Size/2 Size/2

Size/4 Size/4 Size/4 Size/4

Page 11: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

11Antonio Virdis - 2019

Lista ordinata Triviale

Page 12: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

12Antonio Virdis - 2019

Divide , Conquer , Combine

conquer ( int * arr , int start , int end )

{

int mid;

if( start<end )

{

mid = (start+end)/2; // DIVIDE

conquer( arr , start , mid ); // CONQUER

conquer( arr , mid+1 , end ); // CONQUER

combina( arr , start , mid+1 , end );

}

}

1

2

3

4

5

6

7

8

9

10

11

12

Page 13: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

13Antonio Virdis - 2019

Divide , Conquer , Combine

void mergeSort( int * arr , int start , int end )

{

int mid;

if( start<end )

{

mid = (start+end)/2; // DIVIDE

mergeSort( arr , start , mid ); // CONQUER

mergeSort( arr , mid+1 , end ); // CONQUER

combina( arr , start , mid+1 , end );

}

}

1

2

3

4

5

6

7

8

9

10

11

Page 14: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

14Antonio Virdis - 2019

Complessità mergesort

⚫ elementi

⚫ Livelli

⚫ Costo livello

( )l o g n 1+

n

( )( )n lo g n 1+

n

( )n lo g n n+

Page 15: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

15Antonio Virdis - 2019

Complessità mergesort

( )( )n lo g n

Page 16: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

16Antonio Virdis - 2019

BEST CASE WORST CASE

Worst Case Best Case Average Case

Merge Sort

Insertion Sort ( )2

n ( )2

n( )n

( )n lo g n ( )n lo g n ( )n lo g n

Page 17: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

17Antonio Virdis - 2019

Ibrido

Size

Size/4 Size/4 Size/4 Size/4

Size/2 Size/2

Page 18: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

18

Complessità?

• Tempo di esecuzione: worst vs best vs avg

• Memoria: in-place or not in-place?

Antonio Virdis - 2019

Page 19: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

19Antonio Virdis - 2019

Test

⚫ Insertionsort

⚫ Mergesort

⚫ Casi

⚫ Random

⚫ Ordinata

⚫ Inversa

⚫ Variare quantità linearmente (10 , 40 , 80…)

Page 20: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

20Antonio Virdis - 2019

Where isWally?

Page 21: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

21Antonio Virdis - 2019

Page 22: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

22Antonio Virdis - 2019

Page 23: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

23Antonio Virdis - 2019

Find Bug-Wally[..]

int iSx = start , iDx = mid;

int stop , iRim;

std::vector<int> tempResult;

while(1)

{if(arr[iSx] < arr[iDx]);

{tempResult.push_back(arr[iSx++]);

if(iSx == mid)

{ iRim = iDx;

stop = end;

break;}

continue;

}if(arr[iSx] >= arr[iDx])

{tempResult.push_back(arr[iDx++]);

if(iDx == end+1)

{ iRim = iSx;

stop = mid;

break;

}

[..]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Page 24: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

Antonio Virdis - 2019

Page 25: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

25Antonio Virdis - 2019

Compiler Flags

⚫ g++ -W -o test test.cpp

⚫ g++ -Wall -W -o test test.cpp

Page 26: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

Antonio Virdis - 2019

Warning: suggest braces around empty body in an ‘if’ statement

Page 27: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

27Antonio Virdis - 2019

Find Bug-Wally[..]

int iSx = start , iDx = mid;

int stop , iRim;

std::vector<int> tempResult;

while(1)

{if(arr[iSx] < arr[iDx]);

{tempResult.push_back(arr[iSx++]);

if(iSx == mid)

{ iRim = iDx;

stop = end;

break;}

continue;

}if(arr[iSx] >= arr[iDx])

{tempResult.push_back(arr[iDx++]);

if(iDx == end+1)

{ iRim = iSx;

stop = mid;

break;

}

[..]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Page 28: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

28Antonio Virdis - 2019

Find Bug-Wally[..]

int iSx = start , iDx = mid;

int stop , iRim;

std::vector<int> tempResult;

while(1)

{if(arr[iSx] < arr[iDx]);

{tempResult.push_back(arr[iSx++]);

if(iSx == mid)

{ iRim = iDx;

stop = end;

break;}

continue;

}if(arr[iSx] >= arr[iDx])

{tempResult.push_back(arr[iDx++]);

if(iDx == end+1)

{ iRim = iSx;

stop = mid;

break;

}

[..]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Page 29: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

29Antonio Virdis - 2019

Ordinamenti multi-valore

ID

Priorità

ID

Priorità

vs

⚫ Richieste servite in ordine di ID crescente

⚫ A parità di ID, si serve in ordine di priorità decrescente

Richiesta Richiesta

Page 30: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

30Antonio Virdis - 2019

Richiesta

struct Richiesta

{

int id_;

int prio_;

// costruttore con lista init

Richiesta(int id, int prio):

id_(id) , prio_(prio){}

};

1

2

3

4

5

6

7

8

9

10

11

Page 31: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

31Antonio Virdis - 2019

STL: sort()

sort ( first, last, comparatore );

Estremi del vettore da ordinare Funzione di confronto⚫ True⚫ False

Page 32: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

32Antonio Virdis - 2019

Richiestabool confrontaRichieste( Richiesta r1 , Richiesta r2)

{

// SE ID1 < ID2

// VINCE 1

// SE ID1 == ID2

{

// SE PRIO1 > PRIO2

// VINCE 1

}

// TUTTI GLI ALTRI CASI

// VINCE 2

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Page 33: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

33Antonio Virdis - 2019

Richiestabool confrontaRichieste( Richiesta r1 , Richiesta r2)

{

if( r1.id_<r2.id_ )

return true;

else if(r1.id_ == r2.id_)

{

if(r1.prio_>r2.prio_)

return true;

}

else

return false;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

?

Page 34: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

34Antonio Virdis - 2019

Richiestabool confrontaRichieste( Richiesta r1 , Richiesta r2)

{

if( r1.id_<r2.id_ )

return true;

else if(r1.id_ == r2.id_)

{

if(r1.prio_>r2.prio_)

return true;

else

return false;

}

else

return false;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Page 35: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

35Antonio Virdis - 2019

Tipo Accessi

vs

Page 36: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

36Antonio Virdis - 2019

Tipo Accessi

vs

Page 37: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

37Antonio Virdis - 2019

liste

head

value next value next value next

Page 38: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

38Antonio Virdis - 2019

liste

head tail

value next value next value next

Solo inserimento in coda

Page 39: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

39Antonio Virdis - 2019

Lettura su ListaObj * leggiInput()

{

// LEGGO LUNGHEZZA

// VARIABILI DI APPOGGIO

// PER TUTTA LA LUNGHEZZA

{

// LEGGO VALORE

// CREO E INIZIALIZZO OGGETTO

// AGGIORNO TESTA

}

// RITORNO TESTA

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Page 40: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

40Antonio Virdis - 2019

Lettura su ListaObj * leggiInput()

{

int value , l;

cin >> l;

Obj * head , * newObj;

for( int i = 0 ; i < l ; ++i )

{

cin >> value;

newObj = new Obj();

newObj->next_ = head;

newObj->value_ = value;

head = newObj;

}

return head;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Page 41: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

41Antonio Virdis - 2019

Stampa Lista

void stampaLista( Obj * head )

{

Obj * pointer = head;

while( pointer != NULL )

{

cout << pointer->value_ << endl ;

pointer = pointer->next_;

}

cout << endl;

}

1

2

3

4

5

6

7

8

9

10

11

12

Page 42: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

42Antonio Virdis - 2019

Birra!

Page 43: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

43Antonio Virdis - 2019

Ballmer's Peak

Fonte: https://xkcd.com/323/

Page 44: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

Hello world

Segmentation fault

Antonio Virdis - 2019

Page 45: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

Antonio Virdis - 2019

Page 46: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

46Antonio Virdis - 2019

Valgrind

⚫ Babysitter Memoria

⚫ Controlla accessi

⚫ Conta accessi

Page 47: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

valgrind ./eseguibile

Antonio Virdis - 2019

Page 48: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

g++ -g -o eseguibile eseguibile.cpp

valgrind ./eseguibile

Antonio Virdis - 2019

Page 49: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

Antonio Virdis - 2019

Stampa Lista

void stampaLista( Obj * head )

{

Obj * pointer = head;

while( pointer != NULL )

{

cout << pointer->value_ << endl ;

pointer = pointer->next_;

}

cout << endl;

}

18

19

20

21

22

23

24

25

26

27

28

29

File testList.cpp

Page 50: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

Antonio Virdis - 2019

Lettura su ListaObj * leggiInput()

{

int value , l;

cin >> l;

Obj * head , * newObj;

for( int i = 0 ; i < l ; ++i )

{

cin >> value;

newObj = new Obj();

newObj->next_ = head;

newObj->value_ = value;

head = newObj;

}

return head;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Page 51: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

51Antonio Virdis - 2019

Operazioni su Lista

⚫ Ricerco un elemento e lo sposto in testa

⚫ Scorrere

⚫ Estrazione

⚫ Inserzione testa

⚫ Ricerco un elemento e lo sposto in coda

⚫ Scorrere

⚫ Estrazione

⚫ Inserimento in coda...

Page 52: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

52Antonio Virdis - 2019

Merge Sort Ibrido

Size

Size/2 Size/2

Size/4 Size/4 Size/4 Size/4

Page 53: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

53

ESERCIZI:

Antonio Virdis - 2019

Page 54: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

54Antonio Virdis - 2019

Distinti in Array

1 7 9 1 1 9

⚫ Input:

⚫ Output:

elementi array

array senza duplicati

Page 55: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

55Antonio Virdis - 2019

K interi più frequenti

1 7 9 1 1 9

⚫ Input:

⚫ Output:

elementi array , intero k

primi k valori più frequenti

3

Page 56: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

56Antonio Virdis - 2019

K interi più grandi

1 6 9 3 2 8

⚫ Input:

⚫ Output:

elementi array , intero k

primi k valori ordinati in maniera decrescente

K=2

Page 57: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

57Antonio Virdis - 2019

Somma Massima

3 7 -8 -5 1 10 1 -3

10

⚫ Input: array

⚫ Output: somma massima

⚫ Esempio 3 7 -8 -5 1 10 1 -3

12

Page 58: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

58Antonio Virdis - 2019

Soluzione 1int somme1(int a[] , int size )

{

for(i=0; i<size; i++) // n

{

}

return max;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Page 59: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

59Antonio Virdis - 2019

Soluzione 1int somme1(int a[] , int size )

{

for(i=0; i<size; i++) // n

{

for(j=i; j<size; j++) // n

{

}

}

return max;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Page 60: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

60Antonio Virdis - 2019

Soluzione 1int somme1(int a[] , int size )

{

int somma;

int i,j,k;

int max=a[0];

for(i=0; i<size; i++) // n

{

for(j=i; j<size; j++) // n

{

somma=0;

for(k=i; k<=j; k++) // n

{

somma+=a[k];

}

if(somma > max) max=somma;

}

}

return max;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Page 61: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

61Antonio Virdis - 2019

Soluzione 1int somme1(int a[] , int size )

{

int somma;

int i,j,k;

int max=a[0];

for(i=0; i<size; i++) // n

{

for(j=i; j<size; j++) // n

{

somma=0;

for(k=i; k<=j; k++) // n

{

somma+=a[k];

}

if(somma > max) max=somma;

}

}

return max;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

( )3

n

Page 62: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

62Antonio Virdis - 2019

Soluzione 2int somme2(int a[] , int size )

{

int somma;

int i,j;

int max=a[0];

for(i=0; i<size; i++)

{

somma=0;

for(j=i; j<size; j++)

{

somma+=a[j];

if(somma > max) max=somma;

}

}

return max;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Page 63: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

63Antonio Virdis - 2019

Soluzione 2int somme2(int a[] , int size )

{

int somma;

int i,j;

int max=a[0];

for(i=0; i<size; i++) // n

{

somma=0;

for(j=i; j<size; j++) // n

{

somma+=a[j];

if(somma > max) max=somma;

}

}

return max;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

( )2

n

Page 64: Algoritmi e Strutture Dati - unipi.it · Antonio Virdis - 2019 2 Sommario ⚫ Merge Sort ⚫ Ordinamento STL ⚫ Gestione Liste ⚫ Esercizi

64Antonio Virdis - 2019

Esercizi

⚫ Esperimenti

⚫ Merge vs Insertion sort vs Ibrido

⚫ Soluzioni array somma massima

⚫ Input critici (array inverso, array ordinato)

⚫ Esercizi

⚫ Inserimenti testa/coda liste

⚫ Distinti

⚫ Più frequenti

⚫ Più grandi