350 likes | 620 Views
Curs 5 - Agenda. sortare interna “buble sort” sortare prin insertie sortare pri selectie naiva sistematica (“heap sort”) sortare prin interclasare (“merge sort”) sortare rapida (“quick sort”) cautare in liste liniare cautare binara – aspectul dinamic arbori AVL. Problema sortarii.
E N D
Curs 5 - Agenda • sortare interna • “buble sort” • sortare prin insertie • sortare pri selectie • naiva • sistematica (“heap sort”) • sortare prin interclasare (“merge sort”) • sortare rapida (“quick sort”) • cautare • in liste liniare • cautare binara – aspectul dinamic • arbori AVL Algoritmica si programare
Problema sortarii • Forma 1 • Intrare: n, (R0, . . . , Rn-1) cu cheile k0, . . . , kn-1 • Iesire: (R’0, . . . , R’n-1)astfel incit (R’0, . . . , R’n-1)este o permutare a (R0, . . . , Rn-1 ) si R’0.k0 . . . R’n-1.kn-1 • Forma 2 • Intrare: n, (v0, . . . , vn-1) • Iesire: (w0, . . . , wn-1)astfel incit (w0, . . . , wn-1)este o permutare a (v0, . . . , vn-1), si w0 . . . wn-1 • structura de date arraya[0..n-1] a[0] = v0, . . . , a[n-1] = vn-1 Algoritmica si programare
Bubble sort I • idee: (i) 0 i < n-1 a[i] a[i+1] • algoritm procedure bubbleSort (a, n) begin ultim n-1 while ultim > 0 do ntemp ultim – 1 ultim 0 for i 0 to ntemp do if a[i] > a[i+1] then swap(a[i], a[i+1]) ultim i end Algoritmica si programare
Bubble sort II • exemplu • analiza • cazul cel mai nefavorabil a[0] > a[1] > ... > a[n-1] TbubleSort(n) = O(n2) Algoritmica si programare
Sortare prin insertie directa I • idee presupunem a[0..i-1] sortat insereaza a[i] astfel incit a[0..i] devine sortat • algoritm procedure insertSort(a, n) begin for i 1 to n-1 do j i – 1 temp a[i] while ((j 0) and (a[j] > temp)) do a[j+1] a[j] j j – 1 if (a[j+1] temp) then a[j+1] temp end Algoritmica si programare
Sortare prin insertie directa II • exemplu • analiza • cazul cel mai nefavorabil a[0] > a[1] > ... > a[n-1] TinsertSort(n) = O(n2) Algoritmica si programare
Sortare prin selectie • ideea de baza • pasul curent: selecteaza un element si-l duce pe pozitia sa finala din tabloul sortat • repeta pasul curent pana cnd toate elementele ajung pe locurile finale Algoritmica si programare
Sortare prin selectie naiva • idee (i ) 0 i < n a[i] = max{a[0],…,a[i]} • algoritm procedure naivSort(a, n) begin for i n-1 downto 0 do imax i for j i-1 downto 0 do if (a[j] > a[imax]) then imax j if (i imax) then swap(a[i], a[imax]) end • complexitatea timp toate cazurile: TnaivSort(n) = Θ(n2) Algoritmica si programare
"Heap sort" (sortare prin selectie sistematica) • etapa I • organizeaza tabloul ca un max-heap • initial tablou satisface proprietatea max-heap incepand cu n/2 • introduce in max-heap elementele de pe pozitiile n/2-1, n/2 -1, …, 1, 0 • etapa II • selecteaza elementul maxim si-l duce la locul lui prin interschimbare cu ultimul • micsoreaza cu 1 si apoi reface max-heapul • repeta pasii de mai sus pana cand toate elementele ajung pe locul lor Algoritmica si programare
Operatia de introducere in heap al t-lea procedure insereazaAlTlea(a, n, t) begin j t heap false while ((2*j+1 < n) and not heap) do k 2*j+1 if ((k < n-1) and (a[k] < a[k+1])) then k k+1 if (a[j] < a[k]) then swap(a[j], a[k]) j k else heap true end Algoritmica si programare
"Heap sort" (sortare prin selectie sistematica) procedure heapSort(a, n) begin // construieste maxheap-ul for t (n-1)/2 downto 0 do insereazaAlTlea(a, n, t) // elimina r n-1 while (r > 0) do swap(a[0], a[r]) insereazaAlTlea(a, r, 0) r r-1 end Algoritmica si programare
"Heap sort" - complexitate • formarea heap-ului (pp. ) • eliminare din heap si refacere heap • complexitate algoritm de sortare Algoritmica si programare
Timpul de executie empiric • Intel Pentium III 1.00 Ghz Algoritmica si programare
Paradigma divide-et-impera • P(n): problema de dimensiune n • baza • daca n n0 atunci rezolva P prin metode elementare • divide-et-impera • divide P in a probleme P1(n1), ..., Pa(na) cu ni n/b, b > 1 • rezolvaP1(n1), ..., Pa(na) in aceeasi maniera si obtine solutiile S1, ..., Sa • asambleazaS1, ..., Sa pentru a obtine solutia S a problemei P Algoritmica si programare
Paradigma divide-et-impera: algoritm procedure DivideEtImpera(P, n, S) begin if (n <= n0) then determina S prin metode elementare else imparte P in P1, ..., Pa DivideEtImpera(P1, n1, S1) ... DivideEtImpera(Pa, na, Sa) Asambleaza(S1, ..., Sa, S) end Algoritmica si programare
Sortare prin interclasare (Merge sort) • generalizare: a[p..q] • baza: p q • divide-et-impera • divide: m = [(p + q)/2] • subprobleme: a[p..m], a[m+1..q] • asamblare: interclaseaza subsecventele sortate a[p..m]sia[m+1..q] • initial memoreaza rezultatul interclasarii in temp • copie din temp[0..p+q-1] in a[p..q] • complexitate: • timp : T(n) = O(n log n) (T(n) = 2T(n/2)+n) • spatiu suplimentar: O(n) Algoritmica si programare
Interclasarea a doua secvente sortate • problema: • date a[0] a[1] … a[m-1], b[0] b[1] … b[n-1], sa se construiasca c[0] c[1] … c[m+n-1] a.i. ( k)((i)c[k]=a[i]) (j)c[k]=b[j]) • solutia • initial: i 0, j 0, k 0 • pasul curent: • daca a[i] b[j] atunci c[k] a[i], i i+1 • daca a[i] > b[j] atunci c[k] b[j], j j+1 • k k+1 • conditia de terminare: i > m-1 sau j > n-1 • daca e cazul, copie elementele din tabloul neterminat Algoritmica si programare
Sortare rapida (Quick sort) x x x k q p • generalizare: a[p..q] • baza: p q • divide-et-impera • divide: determina k intre p si q prin interschimbari a.i. dupa determinarea lui k avem: • p i k a[i] a[k] • k < j q a[k] a[j] • subprobleme: a[p..k-1], a[k+1..q] • asamblare: nu exista Algoritmica si programare
Quick sort: partitionare • initial: • x a[p] (se poate alege x arbitrar din a[p..q]) • i p+1 ; j q • pasul curent: • daca a[i] xatunci i i+1 • daca a[j] xatunci j j-1 • daca a[i] > x > a[j]si i < j atunci • swap(a[i], a[j]) • i i+1 • j j-1 • terminare: conditiai > j operatii k i-1 swap(a[p], a[k]) Algoritmica si programare
Cautare • in liste liniare • cautare binara – aspectul dinamic • arbori AVL Algoritmica si programare
Problema cautarii • aspectul static U multime univers S U • operatia de cautare: Instanta: a U Intrebare: a S? • aspectul dinamic • operatia de inserare Intrare: x U, S Iesire: S {x} • operatia de stergere Intrare: x U, S Iesire: S {x} Algoritmica si programare
Cautare in liste liniare - complexitate Algoritmica si programare
Cautare binara – aspect static - context • multimea univers este total ordonata: (U, ) • structura de data utilizata: • arrays[0..n-1] • s[0]< ... < s[n-1] Algoritmica si programare
Cautare binara – aspect static - algoritm function Poz(s, n, a) begin p 0; q n-1 m [(p+q)/2] while (s[m] != a && p < q) do if (a < s[m]) then q m-1 else p m+1 m [(p+q)/2] if (s[m] = a) then return m else return -1; end Algoritmica si programare
Arborele binar asociat cautarii binare m T(m+1,q) T(p,m-1) 2 0 4 1 3 5 T(p,q) T = T(0,n-1) n = 6 Algoritmica si programare
Cautare binara: aspect dinamic • arbore binar de cautare • arbore binar cu proprietatea ca pentru orice nod v, valorile memorate in subarborele la stinga lui v < valoarea din v < valorile memorate in subarborele la dreapta lui v. Algoritmica si programare
Cautare binara: aspect dinamic - cautare function Poz(t, a) begin p t while (p != NULL && p->val != a) do if (a < p->val) then p p->stg else p p->drp return p end Algoritmica si programare
Cautare binara: aspect dinamic - inserare procedure insArbBinCautare(t, x) begin if (t = NULL) then t (x) /*(x) e arborele cu 1 nod */ else p t while (p != NULL) do predp p if (x < p->val) then p p->stg else if (x > p->val)then p p->drp else p NULL if (predp->val != x) then if (x < predp->val) then adaugaxca fiu stinga a luipredp else adaugaxca fiu dreapta a lui predp end Algoritmica si programare
Cautare binara: aspect dinamic - eliminare • se cauta pentru x in arborele t; daca-l gaseste se disting cazurile: • cazul 1: nodul p care memoreaza x nu are fii • cazul 2: nodul p care memoreaza x are un singur fiu • cazul 3: nodul p care memoreaza x are ambii fii • determina nodul q care memoreaza cea mai mare valoare y mai mica decit x (coboara din p la stinga si apoi coboara la dreapta cit se poate) • interschimba valorile din p si q • sterge qca in cazul 1 sau 2 Algoritmica si programare
Cautare binara: aspect dinamic - eliminare • cazul 1 sau 2 procedure elimCaz1sau2(t, predp, p) begin if (p = t) then t devine vid sau unicul fiu al lui t devine radacina else if (p->stg = NULL) then inlocuieste in predp pe p cu p->drp else inlocuiesteinpredppepcup->stg end Algoritmica si programare
Cautare binara: aspect dinamic - eliminare procedure elimArbBinCautare(t, x) begin if (t != NULL) then p t while (p != NULL && p->val != x) do predp p if (x < p->val) then p p->stg else p p->drp if (p != NULL) if (p->stg = NULL || p->drp = NULL) then elimCaz1sau2(t, predp, p) else q p->stg; predq p while (q->drp != NULL) predq q; q q->drp p->val q->val elimCaz1sau2(t, predq, q) end Algoritmica si programare
Degenerarea cautarii binare in cautare liniara 20 elimina(10) elimina(50) elimina(0) 20 20 40 0 40 0 40 30 50 30 50 30 10 50 20 insereaza(32) insereaza(35) 20 20 40 40 40 30 30 30 35 35 32 Algoritmica si programare
Arbori AVL • un arbore binar de cautare t este un arbore AVL-echilibrat daca pentru orice virf v, h(vstg) h(vdrp) 1 • Lema t AVL-echilibrat h(t) (log n). Algoritmica si programare
Arbori AVL • Teorema Clasa arborilor AVL-echilibrati este O(log n) stabila. • algoritmul de inserare • nodurile au memorate si factorii de echilibrare ( {1, 0, 1}) • se memoreaza drumul de la radacina la nodul adaugat intr-o stiva (O(log n)) • se parcurge drumul memorat in stiva in sens invers si se reechilibeaza nodurile dezichilibrate cu una dintre operatiile: rotatie stinga/dreapta simpla/dubla (O(log n)). Algoritmica si programare
Rotatii y x y x A C B C A B z y x D z x y A A B C D B C Rotatie dreapta simpla Rotatie dreapta dubla Algoritmica si programare