Sunteți pe pagina 1din 41

Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui

ui Dijkstra Bibl

Proiectarea algoritmilor

Paradigma greedy

Mitică Craus

Univeristatea Tehnică ”Gheorghe Asachi” din Ias, i

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

Paradigma greedy - descriere

1. Fie S o mulţime de date şi C un tip de date cu proprietăţile:


a) obiectele din C reprezintă submulţimi ale lui S;
b) operaţiile includ inserararea (X ∪ {x}) şi eliminarea (X \ {x}).
2. Clasa de probleme la care se aplică include probleme de optim.
Intrare: S;
Ieşire: O submulţime maximală B din C care optimizează o funcţie f cu valori reale.

3/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Proprietăt, i ale paradigmei greedy

a) Proprietatea de alegere locală. S,


• Soluţia problemei se obţine făcând alegeri optime locale (de aici şi denumirea de
greedy= lacom”).

• O alegere optimă locală poate depinde de alegerile de până atunci, dar nu şi de cele
viitoare.
• Alegerile optime locale nu asigură automat că soluţia finală realizează optimul global,
adică constituie o soluţie a problemei. Trebuie demonstrat acest fapt. De regulă,
aceste demonstraţii nu sunt foarte simple. Acesta este un inconvenient major al
metodei greedy.
• Algoritmii sunt relativ simpli, dar demonstrarea faptului că aceştia rezolvă ı̂ntr-adevăr
problema de optim asociată este deseori dificilă.
b) Proprietatea de substructură optimă:
• Soluţia optimă a problemi conţine soluţiile optime ale subproblemelor.

4/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Modelul matematic al paradigmei greedy


• Fie S o mulţime finită de intrări şi C o colecţie de submulţimi ale lui S. Spunem că
C este accesibilă dacă satisface axioma de accesibilitate:
(∀X ∈ C )X 6= 0/ ⇒ (∃x ∈ X )X \ {x} ∈ C (1)
• Dacă C este accesibilă, atunci perechea (S, C ) se numeşte sistem accesibil.
• O submulţime X ∈ C se numeşte bază dacă este maximală, i.e., nu există x ∈ S \ X
cu X ∪ {x} ∈ C .
• O submulţime X ∈ C care nu este bază se numeşte extensibilă. Cu alte cuvinte,
dacă X este extensibilă, atunci există y ∈ S \ X astfel ı̂ncât X ∪ {y } ∈ C .
• Clasa de probleme pentru care se pot defini algoritmi greedy este definită de
următoarea schemă:
Se consideră date un sistem accesibil (S, C ) şi o funcţie obiectiv f : C → R.
Problema constă ı̂n determinarea unei baze B ∈ C care satisface:
f (B) = optim{f (X ) | X bază ı̂n C }
• În general, prin optim vom ı̂nţelege minim sau maxim.
• Strategia greedy constă ı̂n găsirea unui criteriu de selecţie a elementelor din S care
candidează la formarea bazei optime (care dă optimul pentru funcţia obiectiv),
numit alegere greedy sau alegere a optimului local.
• Formal, optimul local are o următoarea definiţie [2]:
f (X ∪ {x}) = optim{f (X ∪ {y }) | y ∈ S \ X , X ∪ {y } ∈ C } (2)
5/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Prototip algoritm greedy - pseudocod

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

• Din păcate, numai condiţia de accesibilitate nu asigură ı̂ntotdeauna existenţa unui


criteriu de alegere locală care să conducă la determinarea unei baze optime.
• Pentru anumite probleme, putem proiecta algoritmi greedy care nu furnizează soluţia
optimă, ci o bază pentru care funcţia obiectiv poate avea valori apropiate de cea
optimă.

6/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Analiza paradigmei greedy

• 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

T (n) = O(np + 1q ) + · · · + O(1p + nq )


= O(1p + · · · + np + 1q + · · · + nq )
= O(np+1 + nq+1 ) = O(nmax(p+1,q+1) )

• Preprocesarea intrărilor poate conduce la o reducere considerabilă a complexităţii


metodei.

7/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Arbori binari ponderaţi pe frontieră - descriere

• 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

• Modificăm aceşti arbori etichetând vârfurile interne cu numere ce reprezintă suma


etichetelor din cele două vârfuri fii.
• Pentru orice vârf intern v avem info(v ) = info(v1 ) + info(v2 ), unde v1 , v2 sunt fiii lui
v (Figura 2).

8/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Arbori binari ponderaţi pe frontieră - exemplu


 
180
 

   
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

Lungimea externă ponderată

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

Lungimea externă ponderată (continuare)


Demonstraţie.
Utilizăm (3) pentru a calcula lungimea externă ponderată a lui t:
LEP(t) = ∑ dv · info(v )
v pe frontiera lui t

= ∑ dv · info(v ) + d · info(v1 ) + d · info(v2 )


v pe frontiera lui t,v 6=v1 ,v2

= ∑ dv · info(v ) + (d − 1)(info(v1 )+info(v2 ))+info(v1 )+info(v2 )


v pe frontiera lui t,v 6=v1 ,v2

= ∑ dv · info(v ) + (d − 1)info(v3 )+info(v3 )


v pe frontiera lui t,v 6=v1 ,v2

= ∑ 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

Lungimea externă ponderată - exemplu


 
180
 

   
80 100
   
  
10 30 70 10 70 30 70
  
 
20 50 20 50
 
Figura 2: Arbore ponderat pe frontieră, ı̂nainte şi după modificare

• Lungimea externă ponderată a arborelui t este egală cu 80 + 70 + 180 + 100 =


10 · 2 + 20 · 3 + 50 · 3 + 30 · 2 + 70 · 2 = 430.
12/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Lungimea externă ponderată minimă

• 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

Lungimea externă ponderată minimă (continuare)


Notăm cu T (x) mulţimea arborilor binari care au ca informaţii ı̂n vârfurile de pe frontieră
numerele din secvenţa x.
Lema (2)
Fie t un arbore din T (x) cu LEP minimă şi v1 , v2 două vârfuri pe frontiera lui t. Dacă
info(v1 ) < info(v2 ) atunci dv1 ≥ dv2 .
Demonstraţie.
Presupunem dv1 < dv2 . Notăm d1 = dv1 şi d2 = dv2 . Fie t 0 arborele obţinut din t prin
interschimbarea vârfurilor v1 şi v2 . Avem:
LEP(t 0 ) = ∑ dv · info(v )
v pe frontiera lui t 0

= ∑ dv · info(v ) + d1 · info(v2 ) + d2 · info(v1 )


v pe frontiera lui t 0 ,v 6=v1 ,v2

= ∑ dv · info(v ) − d1 · info(v1 ) − d2 · info(v2 ) + d1 · info(v2 )+


v pe frontiera lui t

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

Lungimea externă ponderată minimă (continuare)

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

Algoritm pentru calcularea lungimii externă ponderate minime - descriere

• Ideea algoritmului rezultă direct din Lema 3.


• Presupunem x0 ≤ x1 ≤ · · · ≤ xn−1 .
• Ştim că există un arbore optim t ı̂n care x0 şi x1 sunt memorate ı̂n vârfuri frate.
Tatăl celor două vârfuri va memora x0 + x1 .
• Prin ştergerea celor două vârfuri ce memorează x0 şi x1 se obţine un arbore t 0 .
• Fie t10 un arbore optim pentru secvenţa y = (x0 + x1 , x2 , . . . , xn−1 ) şi t1 arborele
obţinut din t10 prin agăţarea” a două vârfuri cu informaţiile x0 şi x1 de vârful ce

memorează x0 + x1 .
• Avem LEP(t10 ) ≤ LEP(t 0 ) ce implică

LEP(t1) = LEP(t10 ) + x0 + x1 ≤ LEP(t 0 ) + x0 + x1 = LEP(t)

.
• 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

Algoritm pentru calcularea lungimii externă ponderate minime - pseudocod

• Considerăm ı̂n loc de secvenţe de numere secvenţe de arbori.

• 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

Analiza algoritmui pentru calcularea lungimii externă ponderate minime

• Pasul de alegere greedy constă ı̂n


1. selectarea a doi arbori cu etichetele din rădăcină minime şi
2. construirea unui nou arbore ce va avea rădăcina etichetată cu suma etichetelor din
rădăcinile celor doi arbori şi pe cei doi arbori ca subarbori ai rădăcinii (figura 3).


n n = n1 + n2

 
n1 n2
 

Figura 3: Pasul de alegere greedy

18/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Analiza algoritmui pentru calcularea lungimii externă ponderate minime

Teorema (1)
Fie t m (x) unicul element din mulţimea calculată de schema procedurală lep. Arborele
t m (x) are proprietatea:

LEP(t m (x)) = min{LEP(t)|t ∈ T (x)} (4)

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

Implementarea algoritmui pentru calcularea lungimii externă ponderate


minime

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

Codificare de lungimea medie minimă.


• Fie n mesaje M0 , . . . , Mn−1 recepţionate cu frecvenţele f0 , . . . , fn−1 .
• Mesajele sunt codificate cu şiruri (cuvinte) construite peste alfabetul {0, 1} cu
proprietatea că pentru orice i 6= j, codul mesajului Mi nu este un prefix al codului lui
Mj . O astfel de codificare se numeşte independentă de prefix ( prefix-free”).

• Notăm cu di lungimea codului mesajului Mi . Lungimea medie a codului este
∑n−1
i=0 fi · di .
• Problema constă ı̂n determinarea unei codificări cu lungimea medie minimă.
• Unei codificări ı̂i putem asocia un arbore binar cu proprietăţile următoare:
• Mesajele corespund nodurilor de pe frontieră.
• Muchiile (tata, fiu-stânga) sunt etichetate cu 0;
• Muchiile (tata, fiu-dreapta) sunt etichetate cu 1.
• Nodurile de pe frontiera arborelui sunt etichetate cu frecvenţele mesajelor
corespunzătoare.
• Drumul de la rădăcină la un nod de pe frontieră descrie codul mesajului asociat
acestui nod.
• Determinarea unui cod optim coincide cu determinarea unui arbore ponderat pe
frontieră optim.

21/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Coduri Huffman - exemplu

• Codurile Huffman pot fi utilizate la scrierea comprimată a textelor.


• Considerăm textul HARABABURA.
• Mesajele sunt literele din text, iar frecvenţele sunt date de numărul de apariţii ale
fiecărei litere ı̂n text (Figura 4a).

Literă Frecvenţă Literă Cod


H 1 H 010
A 4 A 1
R 2 R 000
B 3 B 001
U 1 U 011
a) b)
Figura 4: Codificarea caracterelor din textul HARABABURA

22/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Construcţia arborelui Huffman - exemplu


1 4 2 2 1 2 4 2 2
H A R B U A R B
1 1
H U
a) b)
4
6
4 A
2 4
A 4 2
2 2 1 1
R B H U 1 1
2 2
R B H U
c) d)
1
0 1

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

Figura 5: Construcţia arborelui Huffman pentru HARABABURA


23/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Algoritm de construcţie a arborelui Huffman optim - descriere

• 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

Algoritm de construcţie a arborelui Huffman optim - descriere (continuare)

• Î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

Figura 6: Organizarea tabloului H

25/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Algoritm de construcţie a arborelui Huffman optim (continuare)


Un pas al algoritmului de construcţie ce realizează selecţia greedy presupune parcurgerea
următoarelor etape:
1. Mutarea rădăcinii cu informaţia cea mai mică pe prima poziţie liberă din zona a
treia, să zicem k. Aceasta este realizată de următoarele operaţii:
a) copierea rădăcinii de pe prima poziţie din heap pe poziţia k:
H[k] ← H[1]
k← k + 1
b) mutarea ultimului element din heap pe prima poziţie:
H[1] ← H[m]
m← m - 1
c) refacerea min-heapului.
2. Mutarea rădăcinii cu informaţia cea mai mică pe prima poziţie liberă din zona a
treia, fără a o elimina din min-heap:
H[k] ← H[1]
k← k + 1
3. Construirea noii rădăcini şi memorarea acesteia pe prima poziţie ı̂n min-heap (ı̂n
locul celei mutate mai sus).
4. Refacerea min-heapului.
• Algoritmul rezultat are timpul de execuţie O(n log n).

26/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Interclasarea optimală a unei mulţimi de secvenţe sortate - descriere

• Se consideră m secvenţe sortate a0 , . . . , am−1 care conţin n0 , . . . , nm−1 , respectiv,


elemente dintr-o mulţime total ordonată.
• Interclasarea celor m secvenţe constă ı̂n execuţia repetată a următorului proces:
• Se extrag din mulţime două secvenţe şi se pune ı̂n locul lor secvenţa obţinută prin
interclasarea acestora.
• Procesul se continuă până când se obţine o singură secvenţe sortată cu cele
n0 + · · · + nm−1 elemente.
• Problema constă ı̂n determinarea unei alegeri pentru care numărul total de
transferuri de elemente să fie minim.
• Un exemplu este este dat de sortarea externă
• Presupunem că avem de sortat un volum mare de date ce nu poate fi ı̂ncărcat ı̂n
memoria internă.
• Se partiţionează colecţia de date ı̂n ı̂n mai multe secvenţe ce pot fi ordonate cu unul
dintre algoritmii de sortare internă.
• Secvenţele sortate sunt memorate ı̂n fişiere pe suport extern.
• Sortarea ı̂ntregii colecţii se face prin interclasarea fişierelor ce memorează secvenţele
sortate.

27/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Interclasarea optimală a unei mulţimi de secvenţe sortate - descriere


(continuare)
• Considerăm problema interclasării a două secvenţe sortate:
Fie date două secvenţe sortate x = (x0 , . . . , xm−1 ) şi y = (y0 , . . . , yn−1 ) ce conţin
elemente dintr-o mulţime total ordonată. Să se construiască o secvenţă sortată
z = (z0 , . . . , zn+m−1 ) care să conţină cele m + n elemente ce apar ı̂n x şi y .
• Utilizăm notaţia z = merge(x, y ) pentru a nota faptul că z este rezultatul
interclasării secvenţelor x şi y .
• Numărul de comparaţii executate de algoritm este cel mult m + n − 1, iar numărul de
elemente transferate este m + n.
• Revenim la problema interclasării a m secvenţe.
• Considerăm un exemplu: Fie m = 5, n0 = 20, n1 = 60, n2 = 70, n3 = 40, n4 = 30.
• Un mod de alegere a secvenţelor pentru interclasare este următorul:
b0 = merge(a0 , a1 )
b1 = merge(b0 , a2 )
b2 = merge(a3 , a4 )
b = merge(b1 , b2 )
• Numărul de transferuri al acestei soluţii este
(20 + 60) + (80 + 70) + (40 + 30) + (150 + 70) = 80 + 150 + 70 + 220 = 520.
• Există alegeri mai bune?
• Răspunsul este afirmativ!!

28/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Interclasarea optimală a unei mulţimi de secvenţe sortate - algoritm

• Unei alegeri i se poate ataşa un arbore binar ı̂n modul următor:


• informaţiile din vârfuri sunt lungimi de secvenţe;
• vârfurile de pe frontieră corespund secvenţelor iniţiale a0 , . . . , am−1 ;
• vârfurile interne corespund secvenţelor intermediare.
• Se observă uşor că aceştia sunt arbori ponderaţi pe frontieră şi numărul de transferuri
de elemente corespunzător unei alegeri este egală cu LEP a arborelui asociat.
• Aşadar, alegerea optimă corespunde arborelui cu LEP minimă.

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

Interclasarea optimală a unei mulţimi de secvenţe sortate - exemplu


• Pentru exemplul anterior (m = 5, n0 = 20, n1 = 60, n2 = 70, n3 = 40, n4 = 30.), soluţia
optimă dată de algoritmul greedy este:
b0 = merge(a0 , a4 )
b1 = merge(a3 , b0 )
b2 = merge(a1 , a2 )
b = merge(b1 , b2 )
• Numărul de comparaţii este 50 + 90 + 130 + 220 = 490.
m
220 m
220

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)

Figura 7: Arbori asociaţi algoritmilor de interclasare


30/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

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

Problema rucsacului - soluţia I


• În fiecare pas se introduce ı̂n rucsac obiectul care aduce profit maxim.
• În ultimul pas, dacă obiectul nu ı̂ncape ı̂n totalitate, se introduce numai acea parte
fracţionară a sa, care umple exact rucsacul.

procedure rucsac 1(w, p, x, n)


S ← {0, . . . , n − 1}
for i ← 0 to n-1 do
x[i] ← 0
C← 0
while ((C < M) and (S 6= 0)) / do
∗: alege i ∈ S care maximizează profitul peste S
S ← S \ {i}
if (C + w[i] ≤ M)
then C ← C + w[i]
x[i] ← 1
else C ← M
x[i] ← M − C
w[i]
end
32/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Problema rucsacului - soluţia I (continuare)

• Procedura rucsac 1 are dezavantajul că nu determină ı̂ntodeauna optimul.


• Presupunem n = 3, M = 10, iar dimensiunile şi profiturile obiectelor date de
următorul tabel:
0 1 2
wi 6 4 8
pi 3 4 6
• Algoritmul rucsac 1 va determina soluţia x = (0, 1 , 1) care produce profitul
2
∑ pi xi = 12 · 4 + 1 · 6 = 8.
• Se observă că vectorul x 0 = (0, 1, 3 ) produce un profit mai bun:
4
∑ pi xi0 = 1 · 4 + 34 · 6 = 17 > 8.
2

33/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Problema rucsacului - soluţia a II-a

• 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

Problema rucsacului - corectitudinea soluţiei II


Teorema (2)
Procedura rucsac 2 determină soluţia optimă (cu profit maxim).

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

Problema rucsacului - corectitudinea soluţiei II (continuare)


Demonstraţie.
Toate situaţiile conduc la concluzia yk < xk şi k ≤ j.
Mărim yk cu diferenţa până la xk şi scoatem această diferenţă din secvenţa
(yk+1 , . . . , yn−1 ), astfel ı̂ncât capacitatea utilizată să rămı̂nă tot M.
Rezultă o nouă soluţie z = (z0 , . . . , zn−1 ) care satisface:
zi = xi , 0 ≤ i ≤ k

∑ (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

Problema rucsacului - corectitudinea soluţiei II (continuare)

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

Problema rucsacului - complexitatea

• Timpul de execuţie al algoritmului rucsac 2 este O(n log n).


p p
• Dacă intrările satisfac w0 ≥ · · · ≥ wn−1 , atunci algoritmul rucsac 2 necesită timpul
0 n−1
O(n).
• Timpul de preprocesare (ordonare) este O(n log n).

38/ 41
Cuprins Paradigma greedy Arbori binari ponderaţi pe frontieră Compresii de date Interclasarea optimală Problema rucsacului Algoritmul lui Dijkstra Bibl

Algoritmul lui Dijkstra - descriere

• 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

Algoritmul lui Dijkstra - pseudocod


Notaţii:
• (G , `) = (hV , Ai, `) este un digraf ponderat.
• D[0..n − 1] şi P[0..n − 1] sunt vectori de dimensiune n.
• L[0..n − 1, 0..n − 1] este un tablou bidimensional de marime nxn.
• S este mulţimea vârfurilor selectate; iniţial S = 0.
/
Premise: 
`i,j , dacă (i, j) ∈ A

• Init, ial, L[i, j] = 0, dacă i = j

∞, altfel.

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

Lucanu, D. şi Craus, M., Proiectarea algoritmilor, Editura Polirom, 2008.

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