510 likes | 1.86k Views
Metoda „Divide et Impera”. Aplicaţii de laborator (C++). Probleme rezolvate. 1.Turnurile din Hanoi 2. Algoritmul căutării binare (Binary Search) 3. Calculul radicalului de ordinul 2 4. Rezolvarea unei ecuaţii 5. Exponenţiere rapidă 6. Algoritmul sortării rapide ( QuickSort )
E N D
Metoda „Divide et Impera” Aplicaţii de laborator (C++)
Probleme rezolvate • 1.Turnurile din Hanoi • 2. Algoritmul căutării binare(Binary Search) • 3. Calculul radicalului de ordinul 2 • 4. Rezolvarea unei ecuaţii • 5. Exponenţiere rapidă • 6. Algoritmul sortării rapide (QuickSort) • 7. Algoritmul de sortareprininterclasare (MergeSort)
1. Turnurile din Hanoi Se dau 3 tije simbolizate prin a, b, c. Prin tija a se găsesc discuri de diametre diferite, aşezate în ordine crescătoare a diametrelor privite de jos în sus. Se cere să se mute discurile de pe tija a pe tija b, utilizând ca tijă intermediară tija c, respectând următoarele reguli: - la fiecare pas se mută un singur disc; - nu este permis să se aşeze un disc cu diametrul mai mare peste un disc cu diametrul mai mic. Rezolvare: Dacă n = 1 se face mutarea ab, adică se mută discul de pe tija a pe tija b. Dacă n = 2 se fac mutările ac, ab, cb. În cazul în care n>2 problema se complică. Notăm cu H(n, a, b, c) şirul mutărilor celor n discuri de pe tija a pe tija b, utilizând ca tijă intermediară, tija c. Conform strategiei Divide et impera încercăm să descompunem problema în alte două subprograme de acelaşi tip, urmând apoi combinarea soluţiilor. În acest sens, observăm că mutarea celor n discuri de pe tija a pe tija b, utilizând ca tijă intermediară tija c, este echivalentă cu: - mutarea a n-1 discuri de pe tija a pe tija c, utilizând ca tijă intermediară tija b; - mutarea discului rămas pe tija b; - mutarea a n – 1 discuri de pe tija c pe tija b, utilizând ca tijă intermediară tija a.
Rezolvare Parcurgerea celor trei etape permite definirea recursivă a şirului H(n, a, b, c) astfel: Exemple Pentru n = 2 avem: H(2, a, b, c) = H(1, a, c, b), ab, H(1, c, b, a)== ac, ab, cb. Pentru n = 3 avem: H(3, a, b, c) = H(2, a, c, b), ab, H(2, c, b, a) = H(1, a, b, c) ac, H(1, b, c, a) ab, H(1, c, a, b) cb, H(1, a, b, c) = ab, ac, bc, ab, ca, cb, ab.
Animaţie: pentru n=4 A B C A B C A B C
2. Căutarea binară Se citesc elementele vectorului v ordonate crescător şi x un număr întreg. Verificaţi dacă x apare în vector, şi determinaţi indicele pe care apare sau -1 dacă x nu apare în vector. Rezolvare: Notămcu avectorulsortatcrescătorşi cu xvaloarea de căutat, iar cu sindicele de începutşi cu dindiceleultimului element din secvenţa de elementeîn care căutămvaloareax, adicăa[s],…,a[d]. La fiecarerepetarerenunţăm la jumătate din elementelerămase din vector. Algoritmul căutării binare se aplică astfel: P1. Iniţial, limitele sunt s=1 şi d =n (toate elementele din vector) P2. La fiecare repetare, determinăm indicele elementului median, m=(s+d)/2. Comparăm elementul din mijloc cu valoarea m, adică a[m] <= x Condiţia este Adevărată: continuăm cu jumătatea din dreapta a vectorului, s=m Condiţia este Adevărată: continuăm cu jumătatea din dreapta a vectorului, d=m-1
Exemplu Pentru n=12 şi vectorul 3,10,27,31,42,58,63,75,81,94,101,149
3. Radicalul de ordinul 2 Calculaţi radicalul de ordinul 2 (rădăcina pătrată) cu 4 zecimale exacte, pentru un număr n dat. Rezolvare: Se aplică metoda căutării binare: -ştim că radicalul lui n are o valoare cuprinsă între 1 şi n, 1 r2 n -pentru un interval a,b calculăm valoarea mediană m: a) dacă |m*m-n|, ne oprim estepreciziaurmărită; b) Dacă m*mn continuăm căutarea în intervalul [m,b], altfelcontinuăm cu intervalul [a,m]
4. Rezolvareaunorecuaţii • Metodabisecţiei, numităuneorişimetodadihotomieisau a înjumătăţiriiintervalelor, esteceamaisimplădintremetodele de rezolvare a ecuaţiiloralgebriceşitranscendente. Se considerăcă, printr-un procedeuoarecare, s-a reuşitlocalizarearădăciniiexactex0 a ecuaţieif(x)=0înintervalul [a, b]. Înipotezaîn care funcţiaf(x)estecontinuă, iarradacinax0estesingurulzerou al luif(x)în [a, b], la extremităţileintervaluluifuncţiaiavalori de semnecontrare: f(a) * f(b)<0. Soluţia ecuaţiei este determinată printr-un algoritm asemănător algoritmului căutării binare.
5. Exponenţiere rapidă • Calculul valorii xn poate fi efectuat cu mai puţin de n-1 operaţii de înmulţire • Definim recursiv operaţia de ridicare la puterea n: x10=(x5)2=(x(x2)(x2))2
6. AlgoritmulQuickSort Se citesccele n elemente ale vectorului v=(v[1], v[2], …,v[n]). Ordonaţi crescător elementele vectorului. Rezolvare: Problema ordonării sau sortării este o problemă deosebit de importantă în practică. Algoritmul sortării rapide – QuickSort, foloseşte tehnica Divide et Impera pentru sortare: • se alege o valoare numită pivot, în mod ideal cât mai aproape de valoarea mediană din vector • se interschimbă elemente din vector până când vectorul se partiţionează în două segmente, cu elemente mai mici (în partea stângă) şi elemente mai mari (în partea dreaptă) decât pivotul • se apelează recursiv algoritmul pentru cele două partiţii (vectori) mai mici obţinute
7. Sortareprininterclasare Se consideravectorul a cu n componente nr intregi(saureale).Sa se sortezecrescatorutilizandsortareaprininterclasare Rezolvare: Algoritmulde sortareprininterclasare se bazeazapeurmatoareaidee:pt a sorta un vector cu n elementeilimpartim in doivectoricare,odatasortati,seinterclaseaza.