Probleme
S se calculeze T(n) pentru algoritmul de sortare prin insertie.
Notatii: A - tabloul de sortat (numere intregi)
n - lungime[A] 10, 7, 5, 2,1
ci - costul instructiunii din linia respectiv (de obicei in unitati de timp)
tj numarul de executii ale testului din linia 4 (pentru fiecare j = 2,3lungime[A]
Procedura sortInsert (A) |
Cost instructiune |
Numǎr executii |
|
pentru j 2, lungime[A] execut |
c1 |
n-1 |
|
Temp A [j] |
c2 |
n-1 |
|
i j -1 |
c3 |
n-1 |
|
catTimp i > 0 si Temp < A [i] execut |
c4 |
|
|
A [i +1] A [i] |
c5 |
|
|
I i - 1 |
c6 |
|
|
sfCatTimp | |||
A [i +1] Temp |
c7 |
n - 1 |
|
sfPentru | |||
sfProcedur |
Atunci:
Pentru a calcula efectiv T(n) vom considera 3 cazuri.
1o. Cazul cel mai favorabil cand A e sortat crescǎtor
Pentru fiecare j = 2,3lungime[A] avem Temp ³ A[i] Þ tj = 1.
Deci
= an + b = W (n)
(o functie liniarǎ de n)
2o. Cazul cel mai nefavorabil cand A e sortat descrescǎtor
Pentru fiecare j = 2,3lungime[A] avem cheie < A[i] Þ tj = j
iar si
Deci:
= an2 + bn+c = O(n2) (o functie polinomiala patratica de n)
3o. Cazul mediu cand
Pentru fiecare j = 2,3lungime[A] avem tj = j/2, adica jumatate din elementele secventei sunt sortate crescator, o presupunere destul de realista
iar si
Deci an2 + bn+c = O (n2) (o functie polinomiala patratica de n)
Concluzie: T(n)=O(n2)
a) Sortarea distributiilor (MathSort), determinarea T(n)=O(n), deci complexitate liniara
b) Sortarea prin evaluarea cifrelor (RadixSort), determinarea T(n)=O(n), deci complexitate liniara
Pt i 1, n executa C1
j i C2
CatTimp j ¹ 0 executa C3
j j div 2 C4
SfCatTimp
SfPt
Cost instructiune |
Numǎr executii |
C1 |
n+1 |
C2 |
n+1 |
C3 |
|
C4 |
|
Avem
Þ T(n) = (c1+c2)n + (c1+c2) + c3(nlog2n + 2n) + c4(nlog2n +n)=
= (c1+c2+2c3+c4) n + (c3+c4) nlog2n + (c1+c2) = O(n *log2n).
Procedura Hanoi(n,A,B,C)
Daca n=1
Atunci @ Se muta discul 1 de pe A pe B
Altfel Hanoi (n-1, A,C,B)
@ Se muta discul n de pe A pe B
Hanoi (n-1,C,B,A)
SfDaca
SfProcedura
Recurenta dedusa este
Rezolvare: iteram si adunam membru cu membru apoi reducem:
T(n) = 2T(n-1) + 1
2T(n-1) = 22T(n-2) + 2
22T(n-2) = 23T(n-3) + 22
2n-2 T(2) = 2n-1 T(1) + 2n-2
__________ ______ ____ _______
T(n)= 1 + 2 + 22 + +2n-2 + 2n-1 =
Reamintim metoda Master
Aceasta metoda se aplica problemelor recursive care au timpul de executie de forma:
Avem 3 cazuri (demonstrate in CORMEN, THOMAS H. LEISERSON, CHARLES
RIVEST, RONALD R.: Introducere in algoritmi. Cluj-Napoca: Editura Computer Libris Agora,
2000).
1o Daca pentru o anumita constanta e Þ
2o Daca Þ
3o Daca , pentru o anumita constanta e > 0, si daca (numita si conditie de regularitate) pentru o constanta c si n suficient de mari, atunci
Observam ca practic se compara f(n) cu si solutia o va da cea mai mare dintre ele; f(n) trebuie sa fie polinomial mai mica (in primul caz) si polinomial mai mare (in cazul 3) decat .
Sa se rezolve:
T(n) = 4T(n/2) +n; T(n) = 4T(n/2) +n2;
T(n) = 4T(n/2) +n3; T(n) = 2T(n/2) +n3;
T(n) = T(9n/10) +n; T(n) = 16T(n/4) +n2;
T(n) = 7T(n/3) +n2; T(n) = 7T(n/2) +n2;
T(n) = 2T(n/4) +; T(n) = 3T(n/2) +nlog2n;
T(n) = 2T(n/2) +n/log2n; T(n) = T(n-1) +n;
T(n) = T() +1 T(n) = T(n-1) +1/n;
T(n) = T(n-1) +log2n; T(n) = T() +n;
T(n) = T(n/2) +Q cautare binara
a) Problema steagului olandez (bile de 3 culori, amestecate la inceput, trebuie puse compact pe culori distincte, parcurgand o singura data secventa de bile)
b) Sa se arate ca parcurgand o singura dat o secventa de n elemente se poate determina atat valoarea minima cat si valoarea maxima efectuand cel mult 3*[n/2] +C comparatii unde C este o constanta ce trebuie determinata.
c) Algoritmi pe o tabla de operatii (asociativitate, comutativitate, elemente neutru, element invers ) cu determinarea complexitatii, se poate da ca si tema de casa;
d) Pentru urmatoarea secventa de pseudocod sa se numere cate atribuiri se fac:
Pentru i ← n-2,-2,-1 executa // n intreg
Pentru j ← i+3,n executa
@ o(una) atribuire
SfPentru
SfPentru
Rezolvare posibila:
Nr(atribuiri) =
Doar pentru n ≥1. Pentru valorile lui n <1 avem nr(atribuiri)=0.
Altfel: vom incerca sa dam valori succesive lui n apoi sa vedem ce multimi parcurg indicii i si j;
Pentru inceput observam ca trebuie ca n-2≥-2, pentru ca sa se intre in primul ciclu deci n≥0. Concluzie pentru valorile lui n I nr(atribuiri)=0.
In tabelul urmator vom da valorile indicilor i si j
n |
i |
j |
atribuiri |
iI jIÆ | |||
iI i=-1 avem jIÆ i=-2 avem jI | |||
iI i=0 avem jIÆ i=-1 avem jI i=-2 avem jI |
total 3 |
||
iI i=1 avem jIÆ i=0 avem jI i=-1 avem jI i=-2 avem jI |
total 6 |
Concluzia nr(atribuiri)=n(n+1)/2, pentru n ≥1.
Primul calculator este un SuperComputer(notat Super) care executa 108 operatii pe secunda, iar al 2-lea este un PC care executa 106 operatii pe secunda.
Pe Super s-a codificat un program de sortare care are T(n) = 2n2, iar pe PC s-a impementat un program cu T(n) = 50nlog2n. Sa vedem ce nevoie de timp are fiecare computer:
Pentru Super:
Pentru PC:
ReMakeHeap - pentru intretinerea proprietatii de heap;
BuildHeap - genereaza un heap dintr-un vector neordonat, furnizat la intrare.
HeapSort - ordoneaza un vector in spatiul alocat acestuia.
Reconstituirea proprietatii de Heap (ReMakeHeap)
-se presupune ca la apel pentru nodul i, subarborii cu radacina STANGA(i) si DREAPTA(i) sunt
heap-uri.
-sarcina procedurii este de a ,"scufunda" in HEAP pe A[i] astfel incat subarborele, care are
radacina valorii A[i] sa devina un heap.
Procedure ReMakeHeap(A,i)
l ← STANGA(i) // l=2i
r ← DREAPTA(i) // l=2i+1
Daca l ≤ DimHeap[A]si A[l] > A[i]
Atunci maxim ← l
Altfel maxim ← i
SfDaca
Daca r ≤ DimHeap[A] si A[r] > A[maxim]
Atunci maxim ← r
SfDaca
Daca maxim ≠ i
Atunci
A[i] ↔ A[maxim]
ReMakeHeap (A,maxim)
SfDaca
SfProcedura.
Complexitate
Dimensiunea unui subarbore binar este cel mult 2n/3, pentru un arbore binar de n noduri.
Deci T(n)≤T(2n∕3)+Θ(1) ══> T(n)=0(log2n)
Suntem in cazul 2 al teoremei master:
a=1, b=3/2, f(n) = Θ(1)
══> T(n)=0(log2n) sau pentru inaltimea h avem O(h).
Dam in continuare procedura de construire a unui heap dintr-un vector:
Procedure BuildHeap(A)
DimHeap[A] ← Lungime[A]
Pentru i ← ,1,-1 executa
ReMakeHeap(A,i)
SfPentru
SfProcedura.
Complexitate
Pentru o inaltime h oarecare (interioara, inaltimea arborelui fiind log2n) a unui arbore binar
aproape complet de n noduri, exista cel mult noduri de inaltime h.
Avem
deoarece:
, aplicand formula , pentru x=1/2.
Dam in continuare procedura de sortare a unui heap:
Procedure HeapSort(A)
BuildHeap(A)
Pentru i ← ,2,-1 executa
A[1] ↔ A[i]
DimHeap[A] ← DimHeap[A]-1
ReMakeHeap(A,1)
SfPentru
SfProcedura.
Complexitatea este evidenta: T(n) = O(n) +O(nlog2n) = O(nlog2n)
Aplicatii la vector (array)
TAD Polinom. Sa se scrie doi algoritmi pt. calculul valoarea unui polinom intr-un punct .si pt suma polinoamelor. Se cere ca unul dintre algoritmi sa aiba complexitatea de ordinul Q(n), iar celalalt - de ordinul: Q(n2).
Discutie despre DS folosita:
Pt pol de gr. N folosesc un array de n+1 elem
Sau folosesc un vector dynamic cu elemente (grad,valoare)
10. Propunere de tema. Se considera problema de a determina daca un sir arbitrar de numere contine cel putin 2 termeni egali. Aratati ca exista un algoritm care rezolva aceasta problema in Q(n log(n)).
|