Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
TEHNICI AVANSATE DE
PROGRAMARE
1
1.1.
DESPRE ALGORITMI
Secvena de instruciuni:
a:=1; write (a+f(a))
1. DESPRE ALGORITMI
1.2.
1.3.
1.4.
Corectitudinea algoritmilor
n demonstrarea
importante:
corectitudinii
algoritmilor,
exist
dou
aspecte
1. DESPRE ALGORITMI
(*)
x a; y b; p 0
while x>0
{ xy+p=ab }
if x impar then p p+y
x x div 2; y y+y
write(p)
(*)
y
12
24
48
96
192
384
?
p
0
24
72
264
648
1. DESPRE ALGORITMI
10
1.5.
Optimalitatea algoritmilor
cere
determinarea
valorilor
m=min(a1,a2,...,an)
i
M=max(a1,a2,...,an).
Determinarea succesiv a valorilor m i M necesit timpul T(n)=2(n-1).
11
12
1. DESPRE ALGORITMI
1.6.
13
Existena algoritmilor
Observaii:
faptul c se lucreaz numai cu numere naturale nu este o restricie, deoarece n
memorie exist doar secvene de bii (interpretate n diferite moduri);
nu intereseaz timpul de executare a programului, ci numai existena sa;
14
1. DESPRE ALGORITMI
dac rezultatul dorit const din mai multe valori, vom scrie cte un program
pentru calculul fiecreia dintre aceste valori;
programul vid corespunde calculului funciei identic egal cu 0: pentru orice
x1,x2,... valoarea de ieire a lui y este 0 (cea iniial).
2
2.1.
-
ARBORI
Grafuri
Un subgraf al lui G este un graf G'=(V',M') unde V'V, iar M' este
format din toate muchiile lui G care unesc vrfuri din V'.
Un graf parial al lui G este un graf G'=(V,M') cu M'M.
Numim drum o succesiune de muchii (i1,i2),(i2,i3),...,(ik-1,ik),
notat i prin (i1,i2,...,ik). Dac toate vrfurile drumului sunt distincte,
atunci el se numete drum elementar.
Un ciclu elementar este un drum (i1,i2,...,ik,i1), cu
(i1,i2,...,ik) drum elementar i k3. Un ciclu este un drum
(i1,i2,...,ik,i1) care conine cel puin un ciclu elementar.
1
2
Exemplul 1. n graful alturat:
- (1,2,5,4) este un drum de la 1 la 4;
3
- (5,2,1,4,5) este un ciclu elementar;
- (1,2,1) nu este un ciclu.
5
4
Un graf neorientat se numete conex dac oricare dou vrfuri ale sale sunt
unite printr-un drum.
n cazul unui graf neconex, se pune problema determinrii componentelor
sale conexe; o component conex este un subgraf conex maximal.
Descompunerea n componente conexe determin att o partiie a vrfurilor, ct i
a muchiilor.
Exemplul 2. Graful urmtor are dou componente conexe i anume
subgrafurile determinate de submulimile de vrfuri {1,2,3}, {4}, {5,6}.
2. ARBORI
16
5
4
n cele ce urmeaz vom nota prin n numrul vrfurilor, iar prin m numrul
muchiilor unui graf: n=|V|, m=|M|. n analiza complexitii n timp a
algoritmilor pe grafuri, aceasta va fi msurat n funcie de m+n, adic se va ine
cont att de numrul vrfurilor ct i de cel al muchiilor.
Prin gradul grad(i) al unui vrf i nelegem numrul muchiilor care l au
ca extremitate.
Un graf orientat este tot o pereche G=(V,M), deosebirea fa de grafurile
neorientate constnd n faptul c elementele lui M sunt perechi ordonate de vrfuri
numite arce; altfel spus, orice arc (i,j) are stabilit un sens de parcurgere i
anume de la extremitatea sa iniial i la extremitatea sa final j.
Noiunile de drum, drum elementar, ciclu i ciclu elementar de la grafurile
neorientate se transpun n mod evident la grafurile orientate, cu singura observaie
c n loc de ciclu vom spune circuit.
Pentru un vrf i:
- gradul interior grad-(i) este numrul arcelor ce sosesc n i;
- gradul exterior grad+(i) este numrul arcelor ce pleac din i.
2.2.
Arbori
2.2. Arbori
17
2.3.
Arbori binari
Un arbore binar este un arbore n care orice vrf are cel mult doi
descendeni, cu precizarea c se face distincie ntre descendentul stng i cel
drept. Rezult c un arbore binar nu este propriu-zis un caz particular de arbore.
Primele probleme care se pun pentru arborii binari (ca i pentru arborii
oarecare i pentru grafuri, aa cum vom vedea mai trziu) sunt:
- modul de reprezentare;
- parcurgerea lor.
2. ARBORI
18
2
3
8
5
19
Parcurgerea n preordine
Se parcurg recursiv n ordine: rdcina, subarborele stng, subarborele
drept.
Ilustrm acest mod de parcurgere pentru exemplul de mai sus, figurnd
ngroat rdcinile subarborilor ce trebuie dezvoltai:
1
1, 2, 8
1, 2, 3, 5, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
Concret, se execut apelul preord(rad) pentru procedura:
procedure preord(x)
if x=
then
else vizit(x); preord(st(x)); preord(dr(x))
end
Parcurgerea n inordine
Se parcurg recursiv n ordine: subarborele stng, rdcina, subarborele
drept.
Ilustrm acest mod de parcurgere pentru Exemplul 4:
1
2, 1, 8
3, 2, 5, 1, 8, 9
4, 3, 2, 6, 5, 7, 1, 8, 9
Concret, se execut apelul inord(rad) pentru procedura:
procedure inord(x)
if x=
then
else inord(st(x)); vizit(x); inord(dr(x))
end
Parcurgerea n postordine
2. ARBORI
20
2.4.
binari.
Fie a=(a1,...,an) vectorul care trebuie sortat (ordonat cresctor).
Sortarea cu ansamble
k-2
k-1
21
2i
procedure combin(i,n)
j 2i; b ai
while jn
if j<n & aj<aj+1 then jj+1
if b>aj
then aj/2 b; exit
else aj/2 aj; j 2j
aj/2 b
end
2i+1
ans
ans
n
12
12
11
10
11
12
i
1
j
2
4
5
10
11
22
b
3
a112
a28
a54
a113
7 10
2. ARBORI
22
elemente;
etc.
procedure creare
for i=n/2,1,-1
combin(i,n)
end
procedure sortare
for i=n,2,-1
a1 ai; combin(1,i-1)
end
Arbori de sortare
5
7
17
15
18
Observaie. Parcurgerea n inordine a unui arbore de cutare produce
informaiile ataate vrfurilor n ordine cresctoare.
Fie a=(a1,...an) un vector ce trebuie ordonat cresctor. Conform
observaiei de mai sus, este suficient s crem un arbore de sortare n care
informaiile vrfului s fie tocmai elementele vectorului. Pentru aceasta este
suficient s precizm modul n care, prin adugarea unei noi valori, se obine tot
un arbore de sortare.
23
crem un nou obiect/ o nou nregistrare x n care informaia este info, iar
descendentul stng i cel drept sunt ;
return x
end
Inserarea unei noi valori val (n arborele de rdcin rad) se face prin
apelul adaug(rad,val), unde funcia adaug ntoarce o nregistrare i are
forma:
function adaug(x,val) { se insereaz val n subarborele de rdcin x}
if x=
then return varf_nou(val)
else if val<info(x)
then st(x) adaug(st(x),val)
else dr(x) adaug(dr(x),val)
return x
end
2. ARBORI
24
class elem {
int c; elem st,dr;
elem() { }
elem(int ch) { c=ch; st=null; dr=null; }
elem adaug(elem x, int ch) {
if (x==null) x=new elem(ch);
else if (ch<x.c) x.st=adaug(x.st,ch);
else x.dr=adaug(x.dr,ch);
return x;
}
String parcurg(elem x) {
if (x==null) return("");
else return( parcurg(x.st) + x.c + " " + parcurg(x.dr));
}
}
class Arbsort {
public static void main(String arg[]) {
elem rad=null; double val;
elem Ob = new elem(); val = IO.read();
while ( ! Double.isNaN(val) )
{ rad = Ob.adaug(rad,(int) val); val = IO.read(); }
IO.writeln(Ob.parcurg(rad));
}
}
2.5.
Arbori oarecare
10 11
3
7
12
13
0
1
25
Parcurgerea n preordine
2. ARBORI
26
Parcurgerea n postordine
Parcurgerea pe niveluri
27
C ; C rad
while C
x C; vizit(x);
y fiu(x);
while y
y C ; y frate(y)
3
3.1.
GRAFURI
29
Observaie. Dac dorim doar s determinm dac un graf este conex, vom
nlocui al doilea ciclu for din programul principal prin:
DF(1);
if ndf=n then write(CONEX)
else write(NECONEX);
A ; I ;
for i=1,n
tata(i) 0;
3
1
9
7
L2={1,4};
L5={3,4};
L8={6}
L3={1,5};
L6={8,9};
L9={6,7}
3. GRAFURI
30
9
8
5
7
3
31
procedure DF(i)
ndf ndf+1; nrdf(i) ndf; vizit(i);
for toi jLi
if nrdf(j)=0
then tata(j) i; DF(j)
else if tata(i)j
then k i;
while kj
write(k,tata(k)); k tata(k);
write(j,i); stop
end.
3.2.
Observaii:
dac notm prin nrdesc(i) numrul descendenilor lui i n subarborele
de rdcin i, aceast valoare poate fi calculat plasnd dup ciclul for
din procedura DF instruciunea nrdesc(i)ndf-nrdf(i)+1;
un vrf j este descendent al vrfului i n subarborele DF de rdcin i
nrdf(i)nrdf(j)<nrdf(i)+nrdesc(i).
32
3. GRAFURI
33
procedure preord(i)
for j=1,n
if aij=2
then write(i,j); preord(j);
end
3.3.
Observaii:
1) Operaia este comutativ i asociativ;
2) Dac M1 i M2 reprezint cicluri, atunci M1 M2 este tot un ciclu sau o
reuniune disjunct (n privina muchiilor) de cicluri:
Exemple.
3. GRAFURI
34
8
8
(1,2,4,7,6,1) (2,3,8,7,4,2) = (1,2,3,8,7,6,1)
1
8
5
6
8
7
7
(1,5,6,2,4,3,2,1) (7,8,4,3,2,4,7) = (1,5,6,2,1) (7,8,4,7)
Arborele parial A:
=
1
5
4
35
Demonstraie.
Considerm un ciclu n G, ale crui muchii sunt partiionate n
C={e1,...,ek}{ek+1,...,ej} unde e1,...,ek sunt corzi, iar ek+1,...,ej
sunt muchii din A.
Fie C(e1),...,C(ek) ciclurile fundamentale din care fac parte
e1,...,ek. Fie C=C(e1)... C(ek). Vom demonstra c C=C (sunt formate
din aceleai muchii).
Presupunem c CC. Atunci CC. S observm c att C ct i C
conin corzile e1,...,ek.
Conform unei observaii de mai sus, C i apoi CC sunt cicluri sau
reuniuni disjuncte de cicluri. Cum att C ct i C conin corzile e1,...,ek i n
rest muchii din A, rezult c CC conine numai muchii din A, deci nu poate
conine un ciclu. Contradicie.
Fie un ciclu fundamental care conine coarda e. Fiind singurul ciclu
fundamental ce conine e, el nu se va putea scrie ca sum circular de alte cicluri
fundamentale.
Consecin. Baza format din circuitele fundamentale are ordinul mn+1.
Determinarea mulimii ciclurilor fundamentale
Printr-o parcurgere a arborelui A, putem stabili pentru el legtura tata.
Atunci pentru orice coard (i,j) procedm dup cum urmeaz:
1) Determinm vectorii:
u = (u1=i, u2=tata(u1), ... , unu=tata(unu-1)=rad)
v = (v1=j, v2=tata(v1), ... , vnv=tata(vnv-1)=rad).
2) Parcurgem simultan vectorii u i v de la dreapta la stnga i determinm
cel mai mic indice k cu uk=vk.
3.4.
3. GRAFURI
36
3
1
9
5
4
6
8
8
7
5
1
6
8
7
nrdf(i)
v(i)
1
2
3
4
5
6
7
8
9
1
2
8
9
3
4
5
6
7
1
1
1
1
1
3
3
6
2
37
NU
Pentru a putea lucra mai uor cu condiia 2), vom asocia fiecrui vrf i o
valoare v(i) definit astfel:
v(i) = min { nrdf(k) | k=i sau k legat printr-o muchie de ntoarcere la i sau la
un descendent al lui i }.
k
sau k=i
3. GRAFURI
38
{ }
{ }
{ }
39
for i=1,n
nrdf(i)0;
for i=1,n
if nrdf(i)=0 then Bloc(i);
deoarece din nici un vrf din subarborele de rdcin j nu se urc prin muchii
de ntoarcere mai sus de i.
Dup nlturarea muchiei (i,j) i a celor situate deasupra sa n stiv,
algoritmul se comport ca i cnd blocul nu ar fi existat i deci numrul blocurilor
ar fi fost b-1. Putem aplica acum ipoteza de inducie.
Mai observm c dac notm cu i0 rdcina arborelui DF, atunci pentru
orice fiu j al lui i0 avem v(j)nrdf(i0) deoarece nici o muchie de ntoarcere
cu o extremitate n j nu poate avea cealalt extremitate "mai sus" dect i0. Drept
urmare, dup ce se coboar pe muchia de avansare (i0,j), se continu
parcurgerea DF i se revine n i0, vor fi nlturate din stiv toate muchiile din
3. GRAFURI
40
3.5.
5
2
11
6
7
obinem pdurea:
1
10
2
5
3
6
11
41
Pentru
orice
arc
de
traversare
(i,j)
avem
nrdf(i)>nrdf(j).
3.6.
42
3. GRAFURI
4
4.1.
METODA GREEDY
prel(A)
S
for i=1,n
if p(S{ai})=1
then SS{ai}
Observaii:
n algoritmi nu apare funcia f !!
timpul de calcul este liniar (exceptnd prelucrrile efectuate de procedura
prel i funcia alege);
4. METODA GREEDY
44
4.2.
45
1 n
Tp(k).
n k=1
1 n
(n k + 1)L(pk )
n k=1
(textul de pe poziia k este citit dac vrem s citim unul dintre textele de pe
poziiile k,...,n).
Conform strategiei Greedy, ncepem prin a ordona cresctor vectorul L.
Rezult c n continuare L(i)<L(j), i<j.
Demonstrm c n acest mod am obinut modalitatea optim, adic
permutarea identic minimizeaz funcia de cost T.
Fie pSn optim, adic p minimizeaz funcia T. Dac p este diferit de
permutarea identic, atunci i<j cu L(pi)>L(pj):
p=(
pi
pj
pj
pi
4. METODA GREEDY
46
4.3.
Dac suma greutilor obiectelor este mai mic dect G, atunci vom ncrca
toate obiectele: x=(1,...,1). De aceea presupunem n continuare c
g1+...+gn>G.
Conform strategiei Greedy, ordonm obiectele descresctor dup ctigul
la unitatea de greutate, deci lucrm n ipoteza:
c
c1 c2
... n
gn
g1 g 2
(*)
47
n
giy i = G
Fie y soluia optim: y=(y1,...,yk,...,yn) cu i=1
n
c y maxim
i=1 i i
Dac yx, fie k prima poziie pe care ykxk.
Observaii:
kj: pentru k>j se depete G.
yk<xk:
pentru k<j: evident, deoarece xk=1;
pentru k=j: dac yk>xk se depete G.
Considerm soluia: y=(y1,...,yk-1,xk,yk+1,...,yn) cu <1
(primele k-1 componente coincid cu cele din x). Pstrm greutatea total G, deci:
gkxk+(gk+1yk+1+...+gnyn)=gkyk+gk+1yk+1+...+gnyn. Rezult:
gk(xk-yk)=(1-)(gk+1yk+1+...+gnyn)
(**)
Comparm performana lui y' cu cea a lui y:
f(y)-f(y) = ckxk +ck+1yk+1 +...+ cnyn - (ckyk+ck+1yk+1 +...+cnyn) =
= ck(xk-yk) + (-1)(ck+1yk+1+...+cnyn) =
= ck/gk[gk(xk-yk)+(-1)(gk/ckck+1yk+1+...+gk/ckcnyn)]
Dar -1>0 i gk/ck gs/cs, s>k, conform (*). Atunci:
f(y)-f(y)>ck/gk [gk(xk-yk)+(-1)(gk+1yk+1+...+gnyn)]=0
conform (**), deci f(y')>f(y). Contradicie.
4.4.
4. METODA GREEDY
48
2
5
5
2
3
4
4
1
1
4
1
3
2
2
2
4
5
5
4
5
3
2
2
2
3
4
5
5
49
4. METODA GREEDY
50
mare sau egal dect cel al lui m. Fie P'=P {m}\{m}. P' este tot un
arbore parial de cost minim. Noile instane ale lui P i P sunt P{m} i
P'.
METODA BACKTRACKING
n
2n
3n
n=20
n=40
n=60
1 sec
58 min
12,7 zile
3855 secole
0,2 sec
366 secole
1013 secole
5.1.
5. METODA BACKTRACKING
52
1)
2)
3)
4)
5.2. Exemple
5.2.
53
Exemple
unde vecin(i,k) este true dac i numai dac rile i i k sunt vecine.
2) Problema celor n dame
Se consider un caroiaj de dimensiuni nn. Prin analogie cu o tabl de ah
(n=8), se dorete plasarea a n dame pe ptrelele caroiajului, astfel nct s nu
existe dou dame una n btaia celeilalte (adic s nu existe dou dame pe aceeai
linie, coloan sau diagonal).
Evident, pe fiecare linie vom plasa exact o dam. Fie xk coloana pe care
este plasat dama de pe linia k.
Damele de pe liniile i i k sunt:
- pe aceeai coloan: dac xi=xk ;
- pe aceeai diagonal: dac |xi-xk|=k-i.
function cont(k:integer): boolean;
b true; i 1;
while b and i<k
if |xi-xk|=k-i or xi=xk
then b false
else i i+1;
cont b
end;
5. METODA BACKTRACKING
54
5.3.
55
x1
x2
xk
5.4.
Variante
5. METODA BACKTRACKING
56
5.5.
Abordarea recursiv
Descriem abordarea recursiv pentru X1=...=Xn={1,...,s}.
Apelul iniial este: back(1).
procedure back(k)
if k=n+1
then retsol
else for i=1,s
xki;
if cont(k) then back(k+1);
57
5.6.
Variante:
cum putem ajunge ntr-o poziie (i1,j1) dat?
se cere determinarea componentelor conexe.
5. METODA BACKTRACKING
58
Procedm astfel:
depl =
0 1 0 1
59
void p() {
elem x; int ii,jj;
for (int k=0; k<ndepl; k++) {
ii = i+depl[0][k]; jj = j+depl[1][k];
if (mat[ii][jj] == 1);
else if (mat[ii][jj]==2) IO.writeln(print(prec));
else if (mat[ii][jj]==0) {
mat[i][j] = -1; x = new elem(ii,jj,this);
x.p(); mat[i][j] = 0;
}
}
}
}
class DrumPlan {
public static void main(String[] args) {
new elem();
elem start = new elem(elem.i0,elem.j0,null);
start.p();
}
}
6.1.
Schema general
unde:
- funcia Interm ntoarce un indice n intervalul p..u; de obicei m=(p+u)/2 ;
- funcia Prel este capabil s ntoarc rezultatul subsecvenei p..u, dac
aceasta este suficient de mic;
- funcia Combin ntoarce rezultatul asamblrii rezultatelor pariale r1 i r2.
61
Exemple:
6.2.
Cutarea binar
62
pentru 2 elemente, adic pentru u=p+1: se alege i=p. Dac x<ai, atunci
up-1. Se observ c se iese din ciclul while i ai-1<x<ai=ap;
pentru un element, adic p=u: se alege i=p=u. Dac x<ai atunci up-1, iar
dac x>ai atunci pu+1; n ambele cazuri se prsete ciclul while i se
tiprete un rezultat corect.
6.3.
H(m-1;6-i-j,j)
(*)
cu respectarea condiiei din enun. Deci problema pentru m discuri a fost redus la
dou probleme pentru m-1 discuri, al cror rezultat este asamblat conform (*).
Corespunztor, vom executa apelul Hanoi(n,1,2), unde procedura
Hanoi are forma:
procedure Hanoi(n,i,j)
if n=1
then write(i,j)
else k6-i-j;
Hanoi(n-1,i,k); Hanoi(1,i,j); Hanoi(n-1,k,j)
end
6.4.
63
secvenei analizate.
Programul principal urmeaz ntocmai strategia Divide et Impera, deci se
face apelul SortInter(1,n), unde procedura recursiv SortInter are forma:
procedure SortInter(p,u)
if p=u
then
else m (p+u)/2;
SortInter(p,m); SortInter(m+1,u);
Inter(p,m,u)
end
64
6.5.
Metoda Quicksort
65
procedure QuickSort(p,u)
if pu
then
else k poz(p,u); QuickSort(p,k-1); QuickSort(k+1,u)
end
Observaie. Cazul cel mai defavorabil pentru metoda Quicksort este cel n
care vectorul este deja ordonat cresctor: se compar a1 cu a2,...,an rezultnd
c el se afl pe poziia final, apoi se compar a2 cu a3,...,an rezultnd c el se
afl pe poziia final etc. Timpul n acest caz este de ordinul O(n2).
Trecem la calculul timpului mediu de executare al algoritmului Quicksort.
Vom numra cte comparri se efectueaz (componentele vectorului nu sunt
neaprat numere, ci elemente dintr-o mulime ordonat oarecare). Timpul mediu
este dat de formulele:
1 n
T(1) = T(0) = 0
66
deoarece:
n cazul cel mai defavorabil a1 se compar cu celelalte n-1 elemente;
a1 poate fi poziionat pe oricare dintre poziiile k=1,2,...,n; considerm
aceste cazuri echiprobabile;
T(k-1) este timpul (numrul de comparri) necesar ordonrii elementelor
aflate la stnga poziiei k, iar T(n-k) este timpul necesar ordonrii
elementelor aflate la dreapta poziiei k.
nT(n) = n(n-1)+2[T(0)+T(1)+...+T(n-1)]
(n-1)T(n-1) = (n-1)(n-2)+2[T(0)+...+T(n-2)]
mprim cu n(n+1):
T(n)
T(n 1) 2(n 1)
=
+
n + 1
n
n(n + 1)
1
T(n)
T(n 1)
2
=
+ 2
n
n + 1
T(n)
n + 1
1
T(n 1)
T(n 2)
2
+ 2
=
n 1
n
T(n 1)
n
...........................
f(x)=ln x
1
T(2)
T(1)
2
=
+ 2
3
2
2
3
2 3
n+1
n +1
1
dx = 2lnx|2n+1 2 ln(n+1)
x
(am folosit o inegalitate bazat pe sumele Rieman pentru funcia f(x)=ln x).
Deci T(n)=0(n.log n).
ncheiem cu meniunea c metoda Divide et Impera are o larg
aplicativitate i n calculul paralel.
7.1.
O problem general
68
13
5
4
12
11
2
1
10
Observaii:
-
7.2.
69
Consecine.
ne oprim cu construcia irului cresctor de mulimi la primul k cu Xk=Xk+1
(A este finit!);
- dac aplicm cele de mai sus pentru problema general enunat, aceasta
are soluie dac i numai dac zXk.
-
70
7.3.
Sortarea topologic
Observaii:
problema are soluie dac i numai dac graful este aciclic;
dac exist soluie, ea nu este neaprat unic.
71
7.4.
procedure DivImp(x)
for toi yAx\X
DivImp(y)
calculeaz v(x) conform funciei fx
end;
72
Apare un avantaj: sunt parcurse doar vrfurile din Oz. Dezavantajele sunt
ns decisive pentru renunarea la aceast ncercare:
- algoritmul nu se termin pentru grafuri ciclice;
- valoarea unui vrf poate fi calculat de mai multe ori, ca de exemplu
pentru situaia:
7.5.
-
Soluie final
Etapele sunt urmtoarele:
identificm Gz = subgraful asociat lui Oz ;
aplicm sortarea topologic.
Fie Gz=(Xz,Mz). Iniial Xz=, Mz=.
Pentru a obine graful Gz executm apelul DF(z), unde procedura DF este:
procedure DF(x)
x Xz
for toi yAx
if yXz then (y,x) Mz; DF(y)
end;
73
5
4
4
3
3
1
1
2
Un PD-arbore nu este neaprat un arbore, dar:
- poate fi pus pe niveluri: fiecare vrf x va fi pus pe nivelul egal cu
lungimea celui mai lung
- drum de la x la z, iar sensul arcelor este de la nivelul inferior ctre cel
superior;
- poate fi parcurs (cu mici modificri) n postordine;
Prin parcurgerea n postordine, vrfurile apar sortate topologic.
Algoritmul de parcurgere n postordine folosete un vector parcurs
pentru a ine evidena vrfurilor vizitate. Este iniializat vectorul parcurs i se
ncepe parcurgerea prin apelul postord(z):
for toate vrfurile xA
parcurs(x) xX
postord(z)
74
1
2
. . . .
3
n-2
n-1
n=z
n-1
75
sn,n=an
si,n=ai+si-1,n, i=n-1,n-2,...1.
Arborele binar strict n care fiecare vrf (afar de frunze) are descendenii
(i:k) i (k+1:j) cu k= (i+j)/2 . Prezentm acest arbore pentru n=7:
(1:7)
(1:4)
(3:4)
(1:2)
(1:1)
(2:2)
(5:7)
(3:3)
(4:4)
(5:6)
(5:5)
(6:6)
(7:7)
76
k2
2
k
1
i
1
3
5
7
1
5
9
1
9
a1a1+a2
a3a3+a4
a5a5+a6
a1a1+a3
a5a5+a7
a1a1+a5
77
78
(i,i)
(i,j)
(j,j)
minimul
cost(j,i)k
write cost(1,n)
79
else kcost(u,p)
write('('); sol(p,k); write(',');
sol(k+1,u); write(')')
end;
2)
] = O(n3)
[j(j 1) (j1)(j
2
n
(j i + 1)=
j=2 i =1
j=2
j-k
k
i
i-k
j
(i,j)
80
8
8.1.
Prezentare general
2
6
14
3
7
10
15
4
8
11
12
1
5
9
13
2
6
10
14
3
7
11
15
4
8
12
unde locul liber mai poate fi considerat drept coninnd plcua imaginar cu
eticheta 16.
Observaie. Mutarea unei plcue adiacente locului liber pe acel loc poate
fi gndit i ca mutarea locului liber pe o poziie adiacent.
82
5 1 9
C =
4 8 3
6 2 6
83
(1,2
)
(1,3)
(2,3)
5
(3,4)
11
(1,4)
(2,4)
(3,2)
(4,5)
12
(2,4)
13
(3,4)
(4,2)
(4,2)
(2,3)
14
15
(4,3)
10
(3,2)
16
84
-
Se poate defini o funcie de cost ideal, pentru care c(x) este dat de:
nivelul pe care se afl vrful x dac x este vrf rezultat;
+
dac x este vrf final, diferit de vrf rezultat;
dac x nu este vrf final.
min {c(y) | y fiu al lui x }
Aceast funcie este ideal din dou puncte de vedere:
nu poate fi calculat dac arborele este infinit; n plus, chiar dac arborele este
finit, el trebuie parcurs n ntregime, ceea ce este exact ce dorim s evitm;
dac totui am cunoate aceast funcie, soluia poate fi determinat imediat:
plecm din rdcin i coborm mereu spre un vrf cu acelai cost, pn
ajungem n vrful rezultat.
85
8.2.
86
87
Pentru rdcin:
- reducem liniile n ordine cu 2, 1, 3, 2;
- reducem prima coloan cu 1;
- n acest mod obinem (1)=9
1 5 0
3 0 8
M1 =
0 5 0
3 0 4
Acum min9; L={1}. Este extras vrful 1 i sunt considerai fiii si.
Pentru vrful 2:
0 8
0
Pentru vrful 3:
5
5 0
Pentru vrful 4:
0
5
0 4
Pentru vrful 9:
=
M
9
- nu este necesar vreo reducere;
0
88
DRUMURI N GRAFURI
s=1
9. DRUMURI N GRAFURI
90
Vom cuta s obinem un timp de executare mai bun, inclusiv pentru cazul
n care lungimea arcelor este oarecare (n cele de mai sus s-a presupus implicit c
arcele au lungimea egal cu 1).
n continuare, fiecare arc <i,j> va avea o etichet et(<i,j>) strict
pozitiv, ce reprezint lungimea arcului.
et(< i,j >) dac < i,j > M
Considerm P(i,j)= 0
dac i = j
+
altfel
i irul de matrici:
P0 = P
Observaii:
1) s-a folosit metoda programrii dinamice;
2) Pk(i,i)=0;
3) Pk(i,k)=Pk-1(i,k) i Pk(k,j)=Pk-1(k,j), deci la trecerea de la Pk-1 la
Pk linia k i coloana k rmn neschimbate.
Rezult c putem folosi o singur matrice. Ajungem astfel la algoritmul
Floyd-Warshall:
for k=1,n
for i=i,n
for j=1,n
P(i,j) min {P(i,j),P(i,k)+P(k,j)}
9. DRUMURI N GRAFURI
91
, k 0
9. DRUMURI N GRAFURI
92
(*)
x'
yT