Documente Academic
Documente Profesional
Documente Cultură
ui Dijkstra Bibl
Proiectarea algoritmilor
Paradigma greedy
Mitică Craus
1/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Cuprins
Paradigma greedy
Descriere
Modelul matematic
Analiza
Arbori binari ponderaţi pe frontieră
Descriere
Lungimea externă ponderată
Compresii de date
Descriere
Coduri Huffman
Interclasarea optimală
Descriere
Algoritm
Problema rucsacului
Descriere
Soluţia I
Soluţia a II-a
Algoritmul lui Dijkstra
Bibliografie
2/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
3/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
4/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
procedure greedy(S, B)
S1 ← S
B ← 0/
while (B este extensibilă) do
alege un optim local x din S1 conform cu (2)
S1 ← S1 \ {x}
B ← B ∪ {x}
end
6/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
• Presupunem că pasul de alegere greedy selectează elemente x ı̂n timpul O(k p ) unde
k = #S1 şi că testarea condiţiei ”B este extensibilă” se face ı̂n timpul O(`q ) cu
` = #B; k + ` ≤ n.
• Presupunem costul operaţiilor S1 \ {x} şi B ∪ {x}. egal cu O(1).
• Deoarece pasul de alegere este executat de n ori rezultă că metoda are
complexitatea timp
7/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
• Considerăm arbori binari cu proprietatea că orice vârf are 0 sau 2 succesori şi vârfurile
de pe frontieră au ca informaţii (etichete, ponderi) numere, notate cu info(v ).
• Convenim să numim aceşti arbori ca fiind ponderaţi pe frontieră.
• Pentru un vârf v din arborele t notăm cu dv lungimea drumului de la rădăcina lui t
la vârful v .
• Lungimea externă ponderată a arborelui t este:
LEP(t) = ∑ dv · info(v )
v pe frontiera lui t
8/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
80 100
10 30 70 10 70 30 70
20 50 20 50
Figura 1: Arbore ponderat pe frontieră, ı̂nainte şi după modificare
9/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Lema (1)
Fie t un arbore binar ponderat pe frontieră.
Atunci
LEP(t) = ∑ info(v )
v intern ı̂n t
Demonstraţie.
Se procedează prin inducţie după n, numărul de vârfuri de pe frontiera lui t.
Baza inducţiei. Presupunem n = 2. Relaţia este evidentă.
Pasul inductiv. Presupunem că t are n + 1 vârfuri pe frontieră. Fie v1 şi v2 două vârfuri
de pe frontieră cu acelaşi predecesor imediat (tată) v3 . Avem dv1 = dv2 = d şi
info(v3 ) = info(v1 ) + info(v2 ). Considerăm arborele t 0 obţinut din t prin eliminarea
vârfurilor v1 şi v2 . Acum vârful v3 se află pe frontiera lui t 0 . Conform ipotezei inductive
avem:
LEP(t 0 ) = ∑ info(v ) (3)
v intern ı̂n t 0
10/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
= ∑ dv · info(v ) + info(v3 )
v pe frontiera lui t 0
= LEP(t 0 ) + info(v3 )
= ∑ info(v ) + info(v3 )
v intern ı̂n t 0
= ∑ info(v )
v intern ı̂n t
S-a ţinut cont de faptul că interiorul lui t este format din interiorul lui t 0 la care se adaugă v3 .
11/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
80 100
10 30 70 10 70 30 70
20 50 20 50
Figura 2: Arbore ponderat pe frontieră, ı̂nainte şi după modificare
• Fie dată x = (x0 , . . . , xn−1 ) o secvenţă (listă liniară) de numere. Problema constă ı̂n
determinarea unui arbore binar ponderat pe frontieră care are ca informaţii ı̂n cele n
vârfuri de pe frontieră numerele x0 , . . . , xn−1 şi cu lungimea externă ponderată
minimă.
• O metodă total ineficientă ar putea fi generarea tuturor arborilor binari cu n vârfuri
pe frontieră etichetate cu elementele secvenţei x şi alegerea unuia cu lungimea
externă ponderată minimă.
13/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
d2 · info(v1 )
= LEP(t) − (d1 − d2 ) · (info(v1 ) − info(v2 ))
< LEP(t)
Contradicţie: s-a obţinut un arbore cu lungime externă ponderată mai mică. Rezultă d1 ≥ d2 .
14/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Lema (3)
Presupunem x0 ≤ x1 ≤ · · · ≤ xn−1 . Există un arbore ı̂n T (x) cu LEP minimă şi ı̂n care
vârfurile etichetate cu x0 şi x1 (vârfurile sunt situate pe frontieră) sunt fraţi.
Demonstraţie.
Fie t un arbore cu LEP minimă. Fie vi vârful etichetat cu xi (info(vi ) = xi ) şi di distanţa
de la rădăcină la vârful vi , i = 0, . . . , n − 1.
Deoarece xi ≤ xi+1 rezultă, conform lemei 2, di ≥ di+1 (ı̂n caz de egalitate xi = xi+1
considerăm pe locul i vârful mai depărtat de rădăcină).
Fie vi vârful frate al vârfului v0 . Avem d1 ≥ di (deoarece x1 ≤ xi ) şi d1 ≤ d0 = di
(deoarece x1 ≥ x0 şi v0 şi vi sunt vârfuri frate) care implică d1 = di .
În arborele t interschimbăm vârfurile v1 şi vi şi obţinem un arbore t 0 care satisface
concluzia lemei.
15/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
.
• Cum t este optim, rezultă LEP(t1) = LEP(t) şi de aici t 0 este optim pentru secvenţa
y.
16/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
• Notaţii: t(xi ) desemnează arborele format dintr-un singur vârf etichetat cu xi iar
rad(t) rădăcina arborelui t.
• Premise: Iniţial se consideră n arbori cu un singur vârf, care memorează numerele
xi , i = 0, . . . , n − 1.
procedure lep(x, n)
1: B ← {t(x0 ), . . . , t(xn−1 )}
2: while (#B > 1) do
3: alege t1, t2 din B cu info(rad(t1)),info(rad(t2)) minime
4: construieşte arborele t ı̂n care subarborii rădăcinii
5: sunt t1, t2 şi info(rad(t))=info(rad(t1))+info(rad(t2))
6: B ← (B \ {t1, t2}) ∪ {t}
end
17/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
n n = n1 + n2
n1 n2
18/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Teorema (1)
Fie t m (x) unicul element din mulţimea calculată de schema procedurală lep. Arborele
t m (x) are proprietatea:
Demonstraţie.
Consecinţă a Lemei 3.
19/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
a) Dacă mulţimea B este implementată printr-o listă liniară, atunci ı̂n cazul cel mai
nefavorabil operaţia 3 este are timpul de execuţie O(n), iar operaţia 6 are timpul de
execuţie O(1).
b) Dacă mulţimea B este implementată printr-o listă liniară ordonată, atunci ı̂n cazul
cel mai nefavorabil operaţia 3 are timpul de execuţie O(1), iar operaţia 6 are timpul
de execuţie O(n).
c) Dacă mulţimea B este implementată printr-un heap, atunci ı̂n cazul cel mai
nefavorabil operaţia 3 are timpul de execuţie O(log n), iar operaţia 6 are timpul de
execuţie O(log n).
Concluzie: heapul este alegerea cea mai bună pentru implementarea mulţimii B.
20/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
21/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
22/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
6 4
0 1
A
0 4 1 0 2 1
2 2 1 1
H U Literă Cod
R B
H 010
A 1
e)
R 000
B 001
U 011
• Presupunem că intrarea este memorată ı̂ntr-un tabel T de structuri cu două câmpuri:
• T[i].mes reprezintă mesajul i;
• T[i].f reprezintă frecvenţa mesajului i.
• Pentru implementare recomandăm reprezentarea arborilor prin tablouri.
• Notăm cu H tabloul ce reprezentă arborele Huffman.
• Semnificaţia câmpului H[i].elt este următoarea:
• dacă i este nod intern, atunci H[i].elt reprezintă informaţia calculată din nod;
• dacă i este pe frontieră (corespunde unui mesaj), atunci H[i].elt este adresa din T a
mesajului corespunzător.
• Notăm cu val(i) funcţia care intoarce informaţia din nodul i, calculată ca mai sus.
• Tabloul H, care ı̂n final va memora arborele Huffman corespunzător codurilor optime,
va memora pe parcursul construcţiei acestuia colecţiile intermediare de arbori.
24/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
• În timpul execuţiei algoritmului de construcţie a arborelui, H este compus din trei
părţi (Figura 6):
Partea I: un min-heap care va conţine rădăcinile arborilor din colecţie;
Partea a II-a: conţine nodurile care nu sunt rădăcini;
Partea a III-a: zonă vidă ı̂n care se poate extinde partea din mijloc.
noduri care nu
heapul rădăcinilor zonă vidă
nu sunt rădăcini
25/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
26/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
27/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
28/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
procedure interclOpt(x, n)
begin
B ← {a0 , . . . , an−1 }
while (#B > 1) do
alege x1, x2 din B cu lungimi minime
intercl2(x1, x2, y)
B ← (B \ {x1, x2}) ∪ {y}
end
29/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
m
150 m
70 m
90 m
130
m
80 m
70 m
40 m
30 m
50 m
40 m
60 m
70
m
20 m
60 m
20 m
30
a) b)
Problema rucsacului
• Se consideră un rucsac de capacitate M şi n obiecte notate cu 0, 1, . . . , n − 1 de
dimensiuni (greutăţi) w0 , w1 , . . . , wn−1 .
• Dacă ı̂n rucsac se pune o parte fracţionară xi din obiectul i, 0 ≤ xi ≤ 1, atunci se
obţine un profit pi · xi (pi > 0).
• Umplerea rucsacului cu fracţiunile (cantităţile) x0 , . . . , xn−1 aduce profitul total
∑n−1
i=0 pi xi .
• Problema constă ı̂n a determina părţile fracţionare x0 , . . . xn−1 care aduc un profit
total maxim.
• Problema poate fi formulată ca o problemă de optim, ı̂n modul următor:
• Funcţia obiectiv:
n−1
max ∑ pi xi
i=0
• Restricţii:
n−1
∑ wi xi ≤ M, 0 ≤ xi ≤ 1, i = 0, . . . , n − 1
i=0
• Dacă ∑n−1
i=0 wi ≤ M, atunci profitul maxim se obţine când xi = 1, 0 ≤ i ≤ n − 1.
n−1
• Vom presupune că ∑i=0 wi > M. Fracţiunile xi nu pot fi toate egale cu 1.
• Rucsacul poate fi umplut exact, i.e., putem alege xi astfel ı̂ncât ∑n−1
i=0 wi xi = M.
31/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
33/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
• La fiecare pas va fi introdus ı̂n rucsac obiectul care aduce profit maxim pe unitatea
p
de capacitate (greutate) utilizată, adică obiecul care maximizează fracţia wi peste
i
mulţimea obiectelor neintroduse ı̂ncă.
• Algoritmul corespunzător acestei strategii se obţine din rucsac 1 prin ı̂nlocuirea
liniei ∗ : cu alege i ∈ S care maximizează profitul pe unitatea de greutate peste S
• Startegia a II-a determină soluţia optimă (cu profit maxim).
34/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Demonstraţie.
p p
Presupunem w0 ≥ · · · ≥ wn−1 . Fie x = (x0 , · · · , xn−1 ) soluţia generată de procedura
0 n−1
Rucsac 2.
Dacă xi = 1, 0 ≤ i < n, atunci este evident că această soluţie este optimă.
Altfel, fie j primul indice pentru care xj 6= 1.
Din algoritm, se observă că xi = 1 pentru orice 0 ≤ i < j şi xi = 0 pentru i > j.
Fie y = (y0 · · · yn−1 ) o soluţie optimă (care maximizează profitul).
n−1
Avem ∑i=0 yi wi = M.
Fie k cel mai mic indice pentru care xk 6= yk .
Există următoarele posibilităţi:
i) k < j. Rezultă xk = 1, iar yk 6= xk implică yk < xk .
ii) k = j. Deoarece ∑ xi · wi = M şi xi = yi , 1 ≤ i < j, rezultă că yk < xk (altfel
∑ yi · wi > M. Contradicţie).
n−1 j
iii) k > j. Rezultă ∑ yi · wi > ∑ xi · wi = M. Contradicţie.
i=0 i=0
35/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
∑ (yi − zi ) · wi = (xk − yk ) · wk
k<i≤n−1
Avem:
n−1 n−1
∑ zi · pi = ∑ yi · pi + ∑ zi · pi + zk · pk + ∑ zi pi − ∑ yi pi − yk · pk −
i=0 i=0 0≤i<k k<i<n 0≤i<k
− ∑ yi pi
k<i<n
n−1
wk − w
= ∑ yi · pi + (zk − yk ) · pk · w
k
∑ (yi − zi ) · pi · wii
i=0 k<i<n
n−1 p p
≥ ∑ yi · pi + (zk − yk ) · wk wk − ∑ (yi − zi ) · wi · wk
i=0 k k<i<n k
n−1
= ∑ yi · pi
i=0
36/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Demonstraţie.
Deoarece y este soluţie optimă, rezultă ∑n−1 n−1
i=0 zi pi = ∑i=0 yi pi .
Soluţia z are următoarele două proprietăţi:
• este optimă, şi
• coincide cu x pe primele k poziţii (y coincidea cu x numai pe primele k − 1
poziţii).
Procedeul de mai sus este repetat (considerând z ı̂n loc de y ) până când se obţine o
soluţie optimă care coincide cu x.
37/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
38/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
• Determină drumurile minime care pleacă dintr-un vârf i0 dat, ı̂ntr-un digraf ponderat
(G , `) = (hV , Ai, `).
• Ponderile `i,j sunt ≥ 0.
• Pentru fiecare vârf i,
• D[i] va fi lungimea drumului minim de la i0 la i şi
• P[i] va fi predecesorul lui i pe drumul minim de la i0 la i.
39/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Dijkstra(G , L, i0 , D, P)
1 for i ← 0 to n − 1
2 do P[i] ← i0
3 D[i] ← `io ,i
4 S ← {i0 }
5 while S 6= V
6 do i ← k pentru care D[k] = min{D[j]/j ∈ V \S}
7 S ← S ∪ {k}
8 for fiecare j ∈ listaDeAdiacenta(i) şi j ∈ V \S
9 do if (D[j] > D[i] + L[i, j])
10 then D[j] ← D[i] + L[i, j]
11 P[j] ← i
40/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl
Bibliografie
Moret, B.M.E.şi Shapiro, H.D. , Algorithms from P to NP: Design and Efficiency, The
Benjamin/Cummings Publishing Company, Inc., 1991.
41/ 41