Sunteți pe pagina 1din 41

Utilizarea i Programarea Calculatoarelor

L. A. Fulop

Tehnici de proiectare. Algoritmi II.

Curs 3

Exemplu de algoritm (3)


Problema: Concatenarea a dou iruri ordonate ntr-un singur ir ordonat. 2 1 7 9 13 20 11 12

I. Fr a ine cont de ordonarea existent


Practic metoda din Problema 1. Cautm cel mai mic dintre toate cele opt numere (nu intereseaz c ele sunt pe iruri). l punem pe acesta pe prima poziie n noul ir. Din ce a rmas cautm cel mai mic numr i l punem pe poziia doi al noului ir. Din ce a rmas cautm cel mai mic numr i l punem pe poziia trei al noului ir. ...

II. innd cont de ordonarea existent


tiind c cele dou iruri sunt deja ordonate comparm primele numere din iruri. Pe cel mai mic dintre cele dou l trecem n prima csu a noului ir. Numrul care l-am trecut n noul ir dispare din irul doi iniial. Comparm acum primul numr al celor dou iruri rmase (n al doilea unu a disprut deja) i cel mai mic dintre ele l trecem pe poziia doi din noul ir. ...

Sec. 1: Identificarea celui mai mic numr


Pas 1: Comparm primele dou numere (Min = 1)

2 1 1

7 13 20 9 11 12

Pas 2: Eliminm cel trecut n irul concatenat

7 13 20 9 11 12

Sec. 2: Identificarea celui mai mic numr


Pas 1: Comparm primele dou numere (Min = 2)

2 1

7 13 20 9 11 12 2 7 13 20 9 11 12

Pas 2: Eliminm cel trecut n irul concatenat

Sec. 3: Identificarea celui mai mic numr


Pas 1: Comparm primele dou numere (Min = 7)

7 13 20 9 11 12 1 2 7 13 20 9 11 12

Pas 2: Eliminm cel trecut n irul concatenat

Sec. 3: Identificarea celui mai mic numr


Pas 1: Comparm primele dou numere (Min = 9)

13 20 9 11 12 1 2 7 9 13 20 11 12

Pas 2: Eliminm cel trecut n irul concatenat

Sec. 4: Identificarea celui mai mic numr


Pas 1: Comparm primele dou numere (Min = 11)

13 20 11 12 1 2 7 9 11 13 20 12

Pas 2: Eliminm cel trecut n irul concatenat

Sec. 5: Identificarea celui mai mic numr


Pas 1: Comparm primele dou numere (Min = 12)

13 20 12 1 2 7 9 11 12 13 20

Pas 2: Eliminm cel trecut n irul concatenat

Sec. 6: Identificarea celui mai mic numr


Pas 1: Pentru c nu mai exist numr pe irul doi urmtorul de pe irul unu este minim. (Min = 13)

13 20 1 2 7 9 11 12 13 20

Pas 2: Eliminm cel trecut n irul concatenat

Sec. 6: Identificarea celui mai mic numr


Pas 1: Pentru c nu mai exist numr pe irul doi urmtorul de pe irul unu este minim. (Min = 20)

20 1 2 7 9 11 12 13 20

Pas 2: Eliminm cel trecut n irul concatenat

Cite numere intr-un sir: NR Citit doua siruri de numere: V1[], V2[]

Incepind cu primul numar din V1[] si V2[] i=0, j=0, k=0

Mai exista numere neprelucare? i<2xNR


Da (True) Da (True)

Nu (False)

Este V1[j]<=V2[k]?
Nu( False)

Nu(False)

Da(True)

Mai sunt numere in V1[]?

Da (True)

Mai sunt numere in V2[]?

Nu (False)

V3[i]=V1[j] In V1[] trec la urmatorul: j=j+1

V3[i]=V2[k] In V2[] trec la urmatorul: k=k+1

V3[i]=V2[k] In V2[] trec la urmatorul: k=k+1

V3[i]=V1[j] In V1[] trec la urmatorul: j=j+1

Nu (False)

Am realizat sirul sortat V3[]

Comparaia celor doi algoritmi


Primul algoritm are nevoie de 36 pai. Al doilea algoritm are nevoie de 16 pai (de dou ori numrul total de numere). Deci al doilea algoritm este mai eficient dect primul. Putem discuta de eficiena unui algoritm !!!!

Strategia divide and conquer (1)


Exemplul anterior poate s furnizeze o idee. Dac avem de ordonat un ir de 8 numere cu metoda simpl (Problema 1) avem nevoie de 36 pai. Dac mprim irul n dou iruri de cte 4 numere, ca s ordonm cele dou iruri ne trebuie 10+10=20 pai. Plus pentru concatenat nc 16 pai. n total 36 pai. Nu pare s fie diferen!!!

Strategia divide and conquer (2)


La un ir de 4.000 de numere. Prima metod are nevoie de 8.002.000 (adic opt milioane) de pai s ordoneze un ir.

Strategia divide and conquer (3)


4000 Ordonare 8x125.250=1.002.000 500 500 500 1000 2000 4000 500 1000 2000 500 500 500 500

1000

1000

4x1.000=4.000 pai

2x4.000=8.000 pai

1x4.000=4.000 pai

Strategia divide and conquer (4)


Dac mprim irul n opt iruri de cte 500 numere, pentru ordonarea irurilor avem nevoie de 8x125.250=1.002.000 (un milion) de pai. Pentru concatenarea a cte dou iruri de 500 n iruri de 1000 de numere sunt necesare 4x1.000=4.000 pai. Pentru concatenarea a dou de 1000 n una de 2000 ne sunt necesare 2x4.000=8.000 pai. Pentru concatenarea celor dou de 2000 n cel final de 4000 de numere ordonate, 4.000 pai. Adic n total 1.002.000+4.000+8.000+4.000=1.018.000 pai. DE OPT ORI MAI PUIN!!

Exemplu de algoritm (4)


Problema: Ordonarea cresctoare a unui ir aleator.

Cum ordonm?

Metoda bulelor (Bouble-sort)


S parcurgem numerele. Comparm cte dou numere consecutive. Dac ele sunt n ordinea dorit (primul este mai mic) nu facem cu ele nimic. Dac nu sunt n ordinea dorit (primul este mai mare) schimbm ordinea lor. Repetm parcurgerea de la nceput de attea ori pn toate numerele ajung n ordine cresctoare.

Sec 1: Schimbm toate perechile


Pas 1: Comparm primele dou numere (trebuie schimbate)

8
Reinem primul numr

2 2

4 4 4

9 9 9 9

3 3 3 3

6 6 6 6

8 8
Rezult

Schimbm al doilea cu primul

2 2 8

Sec 1: Schimbm toate perechile


Pas 2: Comparm urmtoarea pereche (trebuie schimbate)

2
Reinem primul numr

4 4

9 9 9

3 3 3 3

6 6 6 6

8 8
Rezult

2 2 2 4 4

Schimbm al doilea cu primul

Sec 1: Schimbm toate perechile


Pas 3: Comparm urmtoarea pereche (nu trebuie schimbate)

Sec 1: Schimbm toate perechile


Pas 4: Comparm urmtoarea pereche (trebuie schimbate)

2
Reinem primul numr

4 4 4 4

8 8 8 8

3 3

6 6 6

9 9
Rezult

2 2 2

Schimbm al doilea cu primul

3 3 9

Sec 1: Schimbm toate perechile


Pas 5: Comparm urmtoarea pereche (trebuie schimbate)

2
Reinem primul numr

4 4 4 4

8 8 8 8

3 3 3 3

6 6

9 9
Rezult

2 2 2

Schimbm al doilea cu primul

6 6 9

Rezultat secvena 1
Dup secvena 1 avem irul:

Sec 2: Schimbm toate perechile


Pas 1: Comparm primele dou numere (nu trebuie schimbate)

Pas 2: Comparm primele dou numere (nu trebuie schimbate)

Sec 2: Schimbm toate perechile


Pas 3: Comparm urmtoarele dou numere (trebuie schimbate)

2
Reinem primul numr

4 4 4 4

3 3

6 6 6

9 9 9 9

8 8
Rezult

2 2 2

Schimbm al doilea cu primul

3 3 8

Sec 2: Schimbm toate perechile


Pas 4: Comparm urmtoarele dou numere (trebuie schimbate)

2
Reinem primul numr

4 4 4 4

3 3 3 3

6 6

9 9 9

8 8
Rezult

2 2 2

Schimbm al doilea cu primul

6 6 8

Sec 2: Schimbm toate perechile


Pas 5: Comparm urmtoarele dou numere (nu trebuie schimbate)

Rezultat secvena 2
Dup secvena 2 avem irul: 2 4 3 6 8 9

Sec 3: Schimbm toate perechile


Pas 1: Comparm primele dou numere (nu trebuie schimbate)

Sec 3: Schimbm toate perechile


Pas 2: Comparm urmtoarele dou numere (nu trebuie schimbate)

2
Reinem primul numr

3 3

6 6 6

8 8 8 8

9 9 9 9

4 4
Rezult

2 2 2 3 3

Schimbm al doilea cu primul

Sec 3: Schimbm toate perechile


Pas 3: Comparm urmtoarele dou numere (nu trebuie schimbate)

2 2 2

3 3 3

4 4 4

6 6 6

8 8 8

9 9 9

Pas 4: Comparm urmtoarele dou numere (nu trebuie schimbate)

Pas 5: Comparm urmtoarele dou numere (nu trebuie schimbate)

Rezultat secvena 3
Dup secvena 3 avem irul:

tim dac irul este ordonat? NU!!!

Sec 4: Schimbm toate perechile


Pas 1: Comparm primele dou numere (nu trebuie schimbate)

2 2 2

3 3 3

4 4 4

6 6 6

8 8 8

9 9 9

Pas 2: Comparm urmtoarele dou numere (nu trebuie schimbate)

Pas 3: Comparm urmtoarele dou numere (nu trebuie schimbate)

Sec 4: Schimbm toate perechile


Pas 4: Comparm primele dou numere (nu trebuie schimbate)

2 2

3 3

4 4

6 6

8 8

9 9

Pas 5: Comparm urmtoarele dou numere (nu trebuie schimbate)

Am parcurs o ecven n care nu am fcut nici o schimbare de poziie! Ce nseamn acest lucru? nseamn c irul a fost deja ordonat!!!

Cite numere in sir: NR Cite numere in sir: NR Citit numerele din sir: v[ ]] Citit numerele din sir: v[ cont=1 Pana cont == 1
True

cont = 0 Incepand cu primul numar din v[ ]: i=0

Nu (False)

Mai exista numere neprelucrate? i<NR-1


Da(True) Nu (False)

Este v[i]>v[i+1]?
Da(True) Nu (False)

temp=v[i] v[i]=v[i+1] v[i+1]=temp cont = 1


Nu (False) Nu (False) Nu (False)

Am realizat sirul sortat v[ ]. Am realizat sirul sortat v[ ].

Performana algoritmului (1)


Numrul de parcurgeri (i de pai) depinde de ordinea iniial a numerelor. Dac numerele au fost n ordine cresctoare o singur parcurgere n NR-1 pai este suficient. Situaia cea mai defavorabil apare cnd numerele au fost aranjate dezcresctor. n acest caz avem nevoie de cei mai muli pai. Putem discuta de eficiena unui algoritm !!!! Dar eficiena nu este constant, ci depinde de ordinea iniial.

Performana algoritmului (2)


Numar parcurgeri in metoda Bulelor
3000

N min = n 1
N max = n (n 1)

Min(Deja sortate)
2500

Max(Sortate invers)

2000

1500

1000

500

0 0 10 20 30 40 50

Concluzie
Este esenial ca la dezvoltarea unui program de calcul (mai ales la unu intensiv din punct de vedere matematic) s studiem eficiena algoritmului utilizat!!!

S-ar putea să vă placă și