Sunteți pe pagina 1din 55

Denumirea temei lit pag

Subprograme. Funcii. Proceduri. Sintaxa declaraiilor i apelurilor de subprograme. 1 144


Subprograme. Funcii. Proceduri. 1 144
Domeniul de vizibilitate. 1 158
omunicarea prin variabile globale. 1 1!1
"#ecte colaterale. 1 1!$
Proceduri recursive. 1 1!%
&ariabile dinamice. 1 1%!
'ipul re#erin(. 1 1%!
Structuri de date. 1 18)
*iste unidirecionale. Prelucrarea lor. 1 181
Stiva. 1 1+%
,rbori binari. 1 -)!
Parcurgerea arborilor binari. 1 -1$
,naliza algoritmilor. $ 1-+
.terativitate sau recursivitate. $ 54
/etoda trierii 0te1nica Greedy). $ 1$+
/etoda relu(rii 0te1nica backtracking2. 4 1-$
/etoda desparte i st(p3nete 0te1nica divide et impera2. $ +%
Programarea modular(. 1 -$8
'estarea i depanarea programelor. 1 -45
/etodele de realizare a programelor mari. 1 -4+
1. 4remalsc1i ,.5 /ocanu .u.5 Spinei .on. .n#ormatica. *imba6ul de programare P,S,*. /anual pentru clasele .787..5 9tiina5
1iin(u5 -)))
-. erc1ez "manuela5 9erban /arinel. .n#ormatica. /anual pentru clasa a 78a. Filiera teoretic(5 pro#ilul matematic(8in#ormatic(.
.ai: "ditura P;*.<;/5 -))). = 1++ p.
$. Sorin '. 'e1nici de programare. >ucureti "ditura 'eora. = 1++!.
1
,?,*.@, './PA*A. D" ,*A* ?""S,<
,*4;<.'/.*;<
?oiuni generale
?e propunem s( l(murim modul Bn care se estimeaz( timpul de calcul necesar unui program pentru a
#umiza rezultatul.
S( consider(m una din cele mai simple probleme. Se d( un vector cu n componente. Se cere s( se
calculeze maximul dintre componentele sale.
<eamintim5 pe scurt5 algoritmul:
C o variabil( 0numit( /,72 va lua valoarea primei componenteD
C #iecare din cele n81 componente r(mase5 se compar( pe r3nd cu valoarea variabilei /,75 iar Bn
cazul Bn care coninutul este mai mare dec3t al variabilei /,75 valabilei /,7 i se atribuie valoarea acelei
componente.
'impul de calcul depinde5 Bn primul r3nd5 de lungimea 0m(rimea2 datelor de intrare5 pe care o vom
nota E n.
"xemple:
FG pentru a#larea maximului 0minimului2 n reprezint( num(rul de componente al vectoruluiD
FG pentru sortare5 n reprezint( num(rul valorilor care se sorteaz(D
FG pentru generarea permut(rilor5 n reprezint( num(rul de elemente ale
mulimii pentru care se genereaz( permut(rileD
FG pentru testul unui num(r natural dac( este prim 0sau nu2 n este c1iar
num(rulD
FG pentru problema color(rii 1(rilor5 n este num(rul arilor.
Pentru a calcula timpul de calcul ar trebui sa inventariem toate instruciunile programului i s( tim
de c3te ori se execut( #iecare din ele 0Bn #uncie de n2. /ai mult5 ar trebui s( cunoatem c3t dureaz(
execuia #iec(rui tip de instruciune.
;bservaie 1.
FG nu Bntotdeauna putem ti de c3te ori se execut( o instruciune. c1iar dac( cunoatem valoarea lui n.
"xemplu. Pentru calculul maximului5 nu putem ti de c3te ori se execut( atribuirea max:FvHiI . u
toate acestea5 putem considera ca exist( o proporionalitate Bntre valoarea n i num(rul de execuii.
;bservaie -.
FG &iteza de execuie a unei instruciuni este dependent( de calculatorul utilizat.
Datorit( acestor considerente vom proceda alt#el.
Se alege o operaie numit( operaie de baz(5 i se vede de c3te ori se execut( aceasta. erina pentru
operaia de baz( este ca aceasta s( se execute de un num(r de ori5 num(r care se poate calcula de la Bnceput
pornind de la n.
"xemple.
FG Pentru problema a#l(rii maximului5 operaia de baza va #i comparaia 0#iind dat n se #ac n81
comparaii pentru calculul maximului2.
FG Pentru generarea permut(rilor5 alegerea operaiei de baz( este greu de #(cut. De exemplu5 dac(
aceasta este comparaia5 este greu de calculat num(rul comparaiilor e#ectuate pentru a genera toate
permut(rile. Din acest motiv putem considera ca operaie de baz( generarea unei permut(rii. &om avea
ast#el nJ operaii de baz( 0un num(r #oarte mare2. Pentru generarea permut(rilor exist( #oarte muli
-
algoritmi. ,legerea ca operaie de baz( a comparaiei permite ca acetia sa #ie comparai Bntre ei5 dar
alegerea ca operaie de baz( a gener(rii unei permut(ri nu permite aceasta.
Kn ast#el de cazuri 0c3nd avem de ales Bntre mai multe operaii de baz(25 vom alege acea operaie care
corespunde c3t mai bine scopului propus.
,st#el5 dac( analiz(m un algoritm de generare a permut(rilor5 comparativ cu altele de aceeai natur(
vom alege ca operaie de baz( comparaia. Kn cazul Bn care analiz(m un algoritm oarecare5 Bn care soluia
este sub #orm( de permutare5 putem considera ca operaie de baz( permutarea. Problema se pune Bn #elul
urm(tor: daca c(ut(m soluia printre toate permut(rile pe care se pot genera vom avea nJ c(ut(ri 0un num(r
imens25 oare nu se poate alt#elL "xemple de probleme la care se #olosete un ast#el de raionament:
problema comis voia6orului5 problema celor n dame.
'impul estimat de calcul se trece sub #orm( aproximativ( ast#el:
; 0num(r estimat de execuii ale operaiei de baz(2.
"xemplu de exprimare a timpului.
Dac( un algoritm e#ectueaz( $n
-
M%nM5 operaii de baz(5 vom spune c( acesta este un algoritm cu
;0n
-
2.
"xemple.
FG Pentru a#larea maximului dintre n valori timpul estimat de calcul este ;0n2.
Kn cazul de #a(5 operaia aleas( este cea de comparare. Pentru un vector cu n componente se #ac n81
comparaii. ,ceasta Bnseamn( c( dac( vectorul are 1)) de componente se #ac ++ de comparaii .a.m.d.. Se
poate demonstra #aptul c( un algoritm mai bun nu exist(.
FG Pentru generarea permut(rilor 0Bn cazul Bn care se consider( ca operaie de baz( generarea unei
permut(ri2 timpul estimat de calcul este ;0nJ2.
Kn anumite cazuri nu putem preciza nici m(car num(rul de execuii ale operaiei da baza.
"xemplu. Sortarea prin intersc1imbare 0vezi !.-.12. Kn cazul Bn care vectorul este sortat se exercit(
n81 comparaii 0se parcurge vectorul o singur( dat(2. Dac( vectorul este sortat invers se execut( n0n812N-
operaii de baz( 0se parcurge vectorul de n ori2.
Kn ast#el de cazuri se poate considera:
C timp minim de calcul:
C timp mediu de calculD
C timp maxim de calcul.
De #iecare dat( c3nd se trece timpul estimat se precizeaz( despre care este vorba 0minim mediu5
maxim2. 1n practic(5 prezint( interes timpul mediu i maxim.
Dac( timpul estimat este sub #orma ;0n
O
25 O?5 spunem c( algoritmul este Bn timp polinomial.
"xemplu. Sortarea prin intersc1imbare are timpul 0mediu5 maxim2 polinomial si anume ;0n
-
2.
An algoritm Bn ;0n2 se numete algoritm liniar.
Dac( un algoritm are un timp estimat ;0-
n
25 ;0$
n
2 spunem c( algoritmul este Bn timp exponenial.
An algoritm Bn timp ;0nJ2 este asimilat unui algoritm Bn timp exponenial.
nJF1x-x...nP-x-x..x-F-
n81
.
$
Kn practic( nu sunt admii dec3t algoritmii Bn timp polinomial5 dei nu este deloc indi#erent gradul
polinomului.
9i totui pentru ce tot acest e#ort de estimare a timpului de calculL ;are viteza de lucru a. unui
calculator nu este at3t de mare5 Bnc3t abstracie #(c3nd de c3teva minute de calcul5 Bn plus sau Bn minus5 sa
renun(m la estimarea luiL <(spunsul la aceasta Bntrebare este categoric negativ. /ai mult5 timpul de calcul
este esenial5 dac( este prea mare algoritmul nu are nici un #el de valoare practic(. S( ne imagin(m un
algoritm care are un timp de calcul ;0-
n
2. Dac( n este 1)5 calculatorul va e#ectua aproximativ 1)-4 operaii
elementare. Dac( n este 1)) acesta va trebui s( e#ectueze 1)-4Q1)-4Q..8Q1)-4 operaii elementare5 adic(
un num(r mai mare dec3t 1)))Q1)))Q...Q1))) adic( 1))))))...)))) 0de treizeci de ori2. ,cesta este un
num(r imens. Dar dac( n este 1)))L Pentru un n nu #oarte mare5 nici cel mai modern calculator din lume nu
scoate rezultatul dec3t Bn sute sau mii de ani2. De alt#el ce Bnseamn( Bn asemenea cazuri un calculator
modernL Sa presupunem c( un sistem P"?'.A/ are p vitez( de circa -5 de ori mai mare dec3t a unul
sistem 7'. S( presupunem c( avem un program care are un timp de calcul de ordinul ;0-
n
2. Se cere s(
rezolv(m o problem( pentru nF$). Fie t timpul necesar rul(rii acestei probleme pe un 7'. ,ceeai
problem( va #i rulat( pe P"?'.A/ Bn timpul tN-5. Dorim s( rezolv(m problema pe P"?'.A/ pentru nF$5
0n a crescut numai cu 52. Dar -
$5
F-
$)
Q-
5
F$-Q-
$)
. Deci dac( n a crescut cu 55 vom avea nevoie de mai mult
timp de lucru sa rezolv(m problema pe P"?'.A/ dec3t timpul pentru rezolvarea ei pentru nF$) pe 7'.
&( dai seama ce Bnseamn( un timp de calcul de ordinul ;0-
n
2L Sporul lui n cu o singur( unitate
duce la dublarea timpului de calcul.
e concluzie tragem de aiciL De c3te ori avem de rezolvat o problem( c(ut(m pentru aceasta un
algoritm Bn timp polinomial 0polinomul va avea gradul minim2. /ai mult5 c(ut(m un algoritm care s(
rezolve problema Bn timp polinomial de grad minim.
"xemple
Sortarea prin intersc1imbare
Se consider( un vector cu n componente. Se cere s( se estimeze timpul de calcul al algoritmului de
sortare prin interclasare.
Pe scurt5 algoritmul este urm(torul:
C se #ace o parcurgere a vectorului5 Bn care se inverseaz( elementele al(turate care nu Bndeplinesc
relaia de ordine considerat(D
C dac( Bn parcurgerea e#ectuat( se #ace cel puin o inversare5 algoritmul se reia de la punctul
anterior5 alt#el s8a obinut rezultatul dorit.
Kn cazul Bn care dorim s( estim(m timpul de calcul necesar acestui algoritm i consider(m ca
operaie de baza comparaia5 a6ungem la o dilem(:
C dac( vectorul este gata sortat #acem o singur( parcurgere a acestuia i n81 comparaii 0 c1iar dac(
au #ost inutile2D
C Bn cazul cel mai de#avorabil5 corespunz(tor situaiei Bn care vectorul este iniial sortat descresc(tor5
se #ac n81 parcurgeri ale sale Bn care se #ac invers(ri i una #(r( invers(ri5 deci se #ac n parcurgeri5 iar pentru
#iecare parcurgere se #ac n81 comparaii. Kn concluzie se #ac n0n812 comparaii.
.at( c( i datele de intrare in#lueneaz( Bn multe cazuri timpul de calcul i aceasta Bn mod
semni#icativ.
&om avea : timp minim ;0n25 timp mediu sau maxim ;0n
-
2. Datorit( aproximailor se consider( c(
timpul mediu este egal cu cel maxim.
4
Problema sumei divizibile cu n
&om reveni la o problem( prezentat( Bn manualul de clasa a noua. Se consider( un vector cu n
numere naturale. Se cere s( se listeze c3teva din acestea5 a c(rui sum( se divide cu n 0dup( cum va rezulta
din demonstraie. acestea exist( BntotdeaunaJ2.
; analiz( super#icial( a problemei va conduce la un ast#el de algoritm:
C consider(m toate submulimile mulimii celor n numere naturaleD
C pentru #iecare din ele test(m dac( suma elementelor se divide la n5 iar c3nd am g(sit o ast#el de
submulime5 algoritmul se oprete.
ategoric5 aceasta este o rezolvare. /ai mult5 este o rezolvare corect(. ineva care analizeaz( Bns(
timpul de rezolvare al problemei va observa c( avem -
n
submulimi ale unei mulimi considerate. Pentru
toate acestea se #ace testul dac( suma elementelor se divide prin n. 'impul de calcul este de ordinul ;0-
n
2.
,pare ca #ireasc( urm(toarea Bntrebare: dar daca g(sim o ast#el de submulime printre primele generateL
Bntr8adev(r exist( i aceast( posibilitate5 dar exist( i ansa ca o ast#el de submulime s( #ie printre ultimele
generate i atunci nu obinem un rezultat Bn timp util.
,a cum a #ost ar(tat5 o abordare serioas( a acestei probleme const( Bn a #orma pe r3nd sumele:
S1Fx1D
S-Fx1Mx-D
RRRRR
SnFx1Mx-MRMxn.
Dac( suma Si se Bmparte la n5 atunci numerele c(utate sunt x15 x-5 .... xi. Dac( nici una nu se Bmparte
la n5 in3nd cont de #aptul c( restul acestor sume prin Bmp(rirea la n aparine mulimii {15..5nS5 0avem n81
posibilit(i de rest25 rezult( c( exist( dou( sume care dau acelai rest prin Bmp(rirea la n. Di#erena acestor
doua sume se va divide prin n. Fie Si i S6 aceste sume 0i2.
SiF x1Mx-MRMxiD
S6F x1Mx-MRMx6D
RRRRR
Si8S6FxiM1MRMx6.
um estim(m timpul de calcul Bn ast#el de situaiiL onsider(m ca operaie de baz(
comparaia 0a dou( resturi2.
<evenim la problem(. Dispunem de n resturi. (ut(m un rest nul. Pentru aceasta se #ac cel mult n
comparaii. Presupunem c( nici un rest nu este nul. Armeaz( s( identi#ic(m dou( resturi egale. Pentru
aceasta se compar( primul rest cu resturile - ... n 0n81 comparaii25 al doilea cu resturile $ ... n 0n8-
comparaii25 ... penultimul rest cu ultimul 0o singura comparaie2. Kn concluzie5 se e#ectueaz( cel mult
n0n812N- comparaii5 Bn total s8au e#ectuat nMn0nM12N- comparaii. ,vem un algoritm cu ;0n
-
2 timp maxim
de calcul.
"ste recomandabil s( realizai acest program Bn ambele variante i s( comparai timpul de calcul
pentru nF$) 0 o valoare mic( pentru n2.
Probleme pentru care nu se cunosc algoritmi polinomiali de rezolvare
Fiind dat( o anumit( problem(5 se pune Bntrebarea: exist( un algoritm de rezolvare al ei polinomialL
*a aceast( Bntrebare se poate r(spunde Bn #elul urm(tor exist( probleme pentru care nu se cunosc
algoritmi de rezolvare Bn timp polinomial. /atematicienii5 oamenii #oarte serioi5 nu au avut cura6ul s( #ac(
o a#irmaie de genul Tnu exist( algoritmi polinomiali de rezolvare a acestei problemeU pentru c( o ast#el de
a#irmaie presupune o demonstraie5 care nu s8a #(cut. Faptul c( nu s8a g(sit un algoritm polinomial nu
Bnseamn( c( el nu exist(. S( analiz(m o ast#el de problem(.
Problema satis#acerii 0problema problemelor2.
5
Se consider( o #uncie boolean( cu n variabile 0x15 x-5Rxn25 dat( Bn #orm( canonic( con6unctiv(. Se
cere un sistem de valori x15 x-5Rxn ast#el Bnc3t5 pentru acest sistem #uncia s( ia valoarea '<A".
;ric3t ne str(duim s( procedam alt#el5 trebuie s( Bncerc(m toate sistemele de valori pentru a vedea
ce valoarea ia #uncia5 dar avem -
n
ast#el de sisteme. Kn concluzie5 pentru aceast( problem( avem timpul de
calcul ;0-
n
2. /ai mult5 se demonstreaz( c( alte probleme se reduc la aceasta 0exist( algoritmi Bn timp
polinomiali care trans#orm( o alt( problem( Bn P<;>*"/, S,'.SF,"<..2. Dac( am #i capabili s( rezolv(m
aceasta problem( Bn timp polinomial5 am rezolva Bn timp polinomial o Bntreag( clas( de probleme care se
reduc la aceasta.
"xemple de probleme care se reduc la problema satis#acerii:
C problema color(rii 1(rilorD
C problema comis voia6oruluiD
C problema celor n dameD
C problema rucsacului cazul discret 0o vom studia2.
; mulime de probleme cerute de practic( se reduc la problema satis#acerii 0de aici i numele de
problem( a problemelor2.
&( dai seama ce semni#icaie au cele prezentateL Knseamn( c( nu se poate 0pe moment cel puin2
rezolva orice cu a6utorul calculatorului electronic. /ai mult5 per#ecion(rile te1nologice aduse acestor
maini5 oric3t de spectaculoase vor #i5 nu vor rezolva aceast( problem(.
e se poate #ace5 Bn absena unei rezolv(ri Bn timp polinomial5 pentru aceast( categorie de problemeL
Kn multe cazuri se renun( la optimalitatea unei soluii 0obin o soluie bun(5 dar nu cea mai bun(2 cu
condiia ca acestea s( #ie obinute Bn timp polinomial. ,st#el de metode se numesc "A<.S'." i vor #i
prezentate Bn cadrul acestui manual. ?u este deloc uor s( se imagineze ast#el de metode. /ai ales5 este
#oarte di#icil de ar(tat c3t de departe de soluia optim( este soluia g(sit(.
,u ap(rut metode noi de cercetare5 pentru obinerea unor soluii c3t mai bune5 c1iar dac( nu optime:
4reedV euristic5 algoritmi genetici5 algoritmi neuronali5 algoritmi de tip c(lire etc. ,st#el de probleme sunt
de cea mai mare actualitate Bn in#ormatica teoretic( pe plan mondial. ; parte dintre ele le vom aborda c1iar
Bn aceasta lucrare.
'impul de calcul necesar te1nicii >acOtracOing.
'e1nica >,W'<,W.?4 pleac( de la o premiz( de bun sim si anume: dac( la un moment dat5 nu
mai am anse s( a6ung la soluia c(utat(5 renun sa continui c(utarea cu o valoarea pentru care tiu c( nu
a6ung la rezultat.
S( presupunem c( #iecare nivel al stivei ia valori Bntre 1 si n. S( presupunem5 de asemenea5 c( stiva
are n nivele. ; explorare sistematic( presupune a investiga n
n
posibilit(i. /ecanismul te1nicii evit( 0c3t
poate2 investigarea tuturor soluiilor. Dar de aici nu se poate trage concluzia ca timpul de calcul mediu nu
este exponenial.
Dei este di#icil de demonstrat timpul de calcul necesar te1nicii >acOtracOing este asimilat timpului
exponenial.
Kn cazul Bn care problema nu are soluie5 se exploreaz( toate posibilit(ile5 caz Bn care se a6unge la un
timp de calcul exponenial. ?u este exclus ca prin aceasta te1nic( s( se a6ung( imediat la soluie5 dar pentru
aceasta trebuie s( avem Xans(U. ;ricum5 timpul maxim cerut de aceasta te1nic( este exponenial. Din acest
motiv5 se va evita #olosirea ei Bn rezolvarea problemelor.
Kn situaia Bn care se cere soluia optim( la o problem( pentru care nu se cunosc algoritmi
polinomiali5 i nu se renun( sub o nici o #orm( la optimalitate 0Bn #avoarea unei soluii su#icient de bune2
putem #olosi te1nica >acOtracOing5 alt#el aceasta nu se va #olosi.
!
'impul de calcul necesar te1nicii Divide et impera
'e1nica D.&.D" "' ./P"<, conduce5 Bn general la un timp de calcul polinomial.
Se tie din studiul acestei te1nici ca5 la #iecare descompunere se obin probleme cu un grad de
complexitate mai mic 0n scade cu o unitate5 Bn cazul cel mai ne#avorabil2. Kntruc3t multe din aceste
probleme 0vezi problema c(ut(rii binare5 problema sort(rii prin interclasare2 se Bmpart Bn doua probleme de
aceeai TlungimeU 0nN-25 vom studia acest din urm( caz.
Dac( notam cu '0n2 timpul necesar rezolv(rii unei ast#el de probleme cu n cunoscute5 acesta se
poate calcula ast#el:

> +
=
=
. 1 5 2 - N 0 -
D 1 5
2 0
n daca b n T
n daca a
n T
n
e semni#icaie are aceast( relaieL
Kn cazul Bn care nF1 problema necesita un timp de calcul a. Kn caz contrar5 avem de rezolvat dou(
probleme de XlungimeX nN-. De asemenea5 timpul necesar combin(rii soluiilor celor dou( probleme Bl vom
nota cu bn 0Bn de#initiv5 atunci c3nd se combin( rezultatele avem rezolvat( o problem( de XlungimeX n2.
S( aplic(m acest rezultat sort(rii prin interclasare. "stim(m timpul necesar interclas(rii. S(
presupunem c( cei doi vectori care trebuiesc interclasai cu m si n componente. on#orm algoritmului de
interclasare5 la #iecare pas Bn urma unei comparaii5 coninutul uneia din componente era trecut Bn vectorul
rezultat . Se proceda Bn acest #el5 p3n( c3nd unul din vectori este trecut Bn Bntregime Bn . <ezult( de aici
#aptul c( Bn cazul interclas(rii se #ac cel mult mMnM1 comparaii. Dac( vectorul are p componente5 rezult(
c( putem estima timpul de calcul prin ;0p2. .at( c( algoritmul de interclasare este unul liniar 0extrem de
per#ormant2. um va #i atunci sortarea prin interclasareL
Pentru simpli#icarea calcului5 s( presupunem c( n este de #orma -
O
0Bn caz contrar m(rim pe n p3n(
a6ungem la o valoare de aceasta #orm(2.
Kn cazul Bn care nu se obin descompunerile 0descompunem #iecare problem( p3n( la nF12:
,cest arbore are O niveluri 0OFlog-0n22. 'impul de calcul va
#i:
'082F-'042Mb8F-0-'0-2Mb42Mb8F4'0-2M-b4Mb8F40-'012Mb-2M-b4Mb8
F8'012M4b-M-b4Mb8F8aM4b-M-b4Mb8.
Dup( cum am v(zut5 bO reprezint( timpul unei interclas(ri Bn care vectorul rezultat are O
componente. Kn acest caz5 aproxim3nd superior5 putem consider( bOFO. <ezult(:
'082F8aM8M8M8F8aM8Q$F8aM8log-082.
%
4eneraliz3nd problema 0propunem demonstraie ca exerciiu2 vom avea:
'0n2FnaMnxlog-0n2.
<ezult( c( algoritmul de sortare prin interclasare necesit( un timp de calcul ;0nxlog-0n22. *a algebr(
am Bnv(at c( log-0n2Pn5 aceast( inegalitate se demonstreaz( prin inducie.
Kn cadrul acestui capitol s8a ar(tat #aptul c(5 sortarea prin intersc1imbare 0metoda bulelor2 necesit(
un timp de calcul ;0n
-
2. Yin3nd cont de ultima inegalitate5 rezult( ca algoritmul de sortare prin interclasare
este mai bun.
/ai mult5 se demonstreaz( i #aptul c( timpul cerut de acest algoritm este cel mai mic timp necesar
unei operaii de sortare care au acelai timp estimat de calcul.
P3n( acum am prezentat modul Bn care se estimeaz( timpul de calcul al unui algoritm elaborat cu
a6utorul te1nicii D.&.D" "' ./P"<,5 Bntr8un caz simplu. De multe ori5 problemele nu se descompun Bn alte
dou( probleme cu aceeai XlungimeX ca aici5 ci Bn trei5 patru .a.m.d. Kn acest caz nu dispunem de un
mecanism general de estimare a timpului5 se studiaz( #iecare caz Bn parte.
oncluzii
"stimarea timpului necesar unui algoritm nu este simplu de realizat. S( ne g3ndim la #aptul ca i
datele de intrare pot ap(rea cu o anumit( probabilitate. um pentru un set de date se poate obine5 un
anumit timp 0de multe ori in#erior timpului estimat25 rezult( c( timpul estimat trebuie 6udecat si prin prisma
'";<.". P<;>,>.*.'ZY.*;< i S','.S'... /,'"/,'.". 'oate acestea dep(esc cu mult
nivelul de cunotine cerut Bn licee sau Bn ma6oritatea #acult(ilor.
'e1nicile care urmeaz( s( le Bnv((m 0P<;4<,/,<" D.?,/.Z i 4<""D[2 conduc5 Bn
general la un timp polinomial5 iar te1nica >ranc1 and >ound la unul exponenial.
Probleme propuse
1. "stimai timpul de calcul necesar a#l(rii valorii maxime i a celei minime dintr8un vector cu n
componente numere reale 0numerele nu sunt sortate2.
-. "stimai timpul de calcul necesar problemei c(ut(rii binare unui anumit num(r natural Bntr8un
vector cu n componente5 ce conin numere naturale ordonate. omparai timpul de calcul cu metoda clasic
0parcurgerea sistematic( a vectorului2.
$. "stimai timpul de calcul necesar gener(rii produsului cartezian a n mulimi #inite.
4. "stimai timpul de calcul necesar pentru obinerea recursiv( a lui #ib0n2 unde: #ib0n2F#ib0n8
12M#ib0n8-2 #ib0)2FaD #ib012Fb. omparai acest timp cu cel estimat pentru aceeai problem(5 Bn cazul
rezolv(rii iterative.
/"';D, >,W'<,W.?4
Descrierea general( a metodei
Deseori Bn practic( apar probleme care implic( alegerea unor soluii optime dintr8un spaiu extrem de vast
de soluii posibile.
An teoretician \purX ar r(spunde : \nici o problem(J construim toate soluiile posibile si le alegem apoi
pe cele optime J X. Dar este realist( o ast#el de abordare L
S( analiz(m un caz #oarte simplu: s( presupunem c( problema noastr( implic( selectarea unei mulimi
de n elemente care trebuie s( Bndeplineasc( anumite condiii. Pentru #iecare element i presupunem c( exist(
pi posibilit(i de alegere. , genera toate soluiile posibile Bnseamn( de #apt a genera toate elementele
produsului cartezian ]15-5 . . . 5 p1S x ]l5 - 5 . . . 5 p-S x . . . x ]l5 - 5 . . . 5 pnS. ,cest produs cartezian are
p1xp-x . . . xpn elemente. 1iar dac( vom considera c( piF-5 pentru orice i F l5 n tot obinem -
n
soluii
posibile. " multL S( evalu(m cu aproximaie timpul de execuie a unui program bazat pe un ast#el de
8
algoritm5 presupun3nd c( dispunem de un calculator care execut( un miliard de operaii pe secund( 01)
+
operaii2.
n 'imp de execuie
4) 1)+ secunde
5) $1 ore
1)) 4.1)
1$
ani
" puin probabil s( putem atepta at3tJ
Prin urmare trebuie s( abord(m Bn alt mod ast#el de probleme J ) idee ar #i s( proced(m ca Bn multe situaii
din viaa de zi cu zi. S( ne g3ndim la modul Bn care un copil rezolv( un puzzle. opilul nu #ace toate
combinaiile posibile de piese pentru ca apoi s( le compare cu modelul pe care vrea s( Bl obin(. "l va lua
mai Bnt3i o pies(. &a c(uta apoi Bn mulimea de piese r(mase una care s( se potriveasc( la cea pe care o are5
apoi Bnc( una .a.m.d. Dac( la un moment dat \se bloc1eaz(X 0nu mai g(sete nici o pies( Bn cele r3mase
care s( se potriveasc(25 el nu distruge tot ce a construit ca s( o ia de la Bnceput. &a Bndep(rta mai Bnt3i
ultima pies( pe care a pus8o i va c(uta o \alternativ(X 0o alt( pies( care s8ar potrivi Bn locul ei2. Dac(
g(sete5 continu( construcia cu noua pies( aleas(. Dac( nu g(sete5 se mai Bntoarce un pas i Bndep(rteaz(
i penultima pies( pe care a pus8o5 c(ut3nd apoi o alt( variant(. Procedeul continu( p3n( c3nd obine
modelul dorit.
;bservai c( pe parcursul construciei5 copilul #ace anumite veri#ic(ri 0se potrivete piesa aiciL m( poate
conduce la modelul doritL25 elimin3nd ast#el #oarte multe dintre soluiile posibile. u alte cuvinte5 c(utarea
nu este ex1austiv(.
An alt aspect semni#icativ este #aptul c( se #ac reveniri. Dac( la un moment dat nu mai poate continua
construcia5 copilul revine la pasul precedent5 Bndep(rteaz( piesa utilizat( i Bncearc( s( o Bnlocuiasc(5 dac(
este posibil. Dac( nu este posibil5 #ace reveniri succesive5 p3n( c3nd g(sete o pies( pe care o poate Bnlocui
i apoi continu( construcia. ,cest mod de abordare se bazeaz( pe principiul \Bncerc aa5 dac( nu merge m(
Bntorc i Bncerc o alt( variant( J X
F(r( s( tie5 copilul din exemplu a aplicat metoda bacOtracOing. ?umele metodei este semni#icativ i s8
ar putea traduce prin \a o lua Bnapoi pe urmeX sau5 cu aproximaie5 prin \c(utare cu revenireX
S( descriem acum Bntr8un mod mai general metoda bacOtracOing. Kn variant( elementar(5 consider(m c(
soluia problemei pe care trebuie s( o rezolv(m se poate reprezenta ca un vector
x F 0x15x-5...xn2 . Fiecare component( xi a vectorului poate lua valori Bntr8o anumit( mulime Si 0iFl 5
- 5...5 n2. Produsul cartezian S1xS-x . . . xSn se numete spaiul soluiilor posibile.
Problemele care se rezolv( prin bacOtracOing nu impun generarea tuturor soluiilor posibile 0generare
ex1austiv(25 ci doar generarea acelor soluii care Bndeplinesc anumite condiii5 speci#ice problemei5
denumite condiii interne. Soluiile posibile care respect( condiiile interne sunt denumite soluii rezultat.
Anele probleme impun obinerea unei singure soluii rezultat5 i anume cea care Bndeplinete o anumit(
condiie de optim. ,ceasta este denumit( soluie optim(.
Pentru a evita generarea tuturor soluiilor posibile5 metoda bacOtracOing atribuie pe r3nd valori elementelor
vectorului x. /ai exact5 componenta xO primete o valoare numai Bn cazul Bn care componentele x15x-5 . . .
xO81 au primit de6a valori. Kn acest caz5 componentei xO i se atribuie pe r3nd acele valori posibile 0valori din
mulimea SO2 care Bndeplinesc condiiile de continuare. ondiiile de continuare sunt condiii derivate din
condiiile interne5 care stabilesc dac( pentru o anumit( valoare pentru xO are sau nu sens s( continu(m
construcia soluiei. Spunem c( o anumit( valoare pentru xO nu Bndeplinete condiiile interne dac( oricum
am atribui valori componentelor xOM1 5 . . . 5 xn nu obinem o soluie rezultat 0soluie care s( respecte
condiiile interne2.
Dup( atribuirea unei valori posibile care respect( condiiile interne componentei xi se poate continua
construcia soluiei Bn mod recursiv 0de data aceasta sunt #ixate O poziii2.
Pentru a descrie #ormatul general al procedurii bacOtracOing vom utiliza o procedur( >W'. onsider(m
c( n5 num(rul de componente ale vectorului5 i vectorul x sunt variabile globale.
procedure >W' 0O: integer2D
]c3nd apelam procedura >W' cu parametrul O presupunem ca2
+
]poziiile 15-5...5O8l din vectorul x sunt #ixateS
var /: /ulime "lementeD a: 'ip"lementD
]tipul elementelor vectorului depinde de problema concret(S
begin
i# O81 F n t1en ]soluia este completaS Prelucrare^Solutie
else begin
andidat0/5 O2D
]procedura andidat memoreaz( in mulimea / elementeleS
]din mulimea SO care respecta condiiile de continuare2
E1ile / nu este vid do
begin ]nu am epuizat candidaii pentru poziia O2
xHOI:F "xtrage0/2D ]extrag un candidat din /S
>W'0O M 12 ]apel recursivS
endD
end
endD
Din descrierea general( a metodei bacOtracOing nu reiese explicit unde intervine revenirea. Pentru
aceasta trebuie s( ne g3ndim la modul de realizare a recursivit(ii.
*a #iecare apel recursiv se memoreaz( pe stiv( valorile variabilelor locale i valoarea parametrului. *a
Bnc1eierea unui apel recursiv5 se elibereaz( zona de memorie alocat( pe stiv( i se revine la apelul
precedent.
Pentru a Bnelege mai bine modul de #uncionare a acestei metode s( analiz(m urm(toarea problem(.
Problema reginelor
S( se plaseze n regine pe o tabl( de a1 de dimensiune nxn ast#el Bnc3t oricare dou( regine s( nu se atace.
<eprezentarea in#ormaiilor
Pentru ca dou( regine s( nu se atace5 ele nu trebuie s( #ie situate pe aceeai linie5 pe aceeai coloan( sau
pe aceeai diagonal(. um num(rul de regine este egal cu dimensiunea tablei de a15 deducem c( pe #iecare
linie trebuie plasat( o regin(. Deci5 pentru ca poziia reginelor s( #ie complet determinat(5 este su#icient s(
reinem pentru #iecare linie coloana Bn care este plasat( regina. Pentru aceasta vom utiliza un vector 5 cu n
componente av3nd urm(toarea semni#icaie:
H i I reprezint( coloana Bn care este plasat( regina de pe linia i.
ondiii interne
1. HiI aparine ]l5-5...5nS5 pentru . aparine ]l5-...5nS 0elementele vectorului sunt indici de linii2
-.HiI di#erit H6I5 i di#erit 65 i5 6 aparine ]l5-5...5nS 0dou( regine nu pot #i plasate pe aceeai coloan(2
$. _HiI8H6I _ di#erit _ i86 _ 5 &i di#erit 65 i5 6 aparine ]l5-5...5nS 0dou( regine nu pot #i plasate pe aceeai
diagonal(2.
program <egineD
1)
const ?r/ax<egine F $)D
tVpe .ndice F ) .. ?r/ax<egineD
Solutie F arraVH.ndiceI o# )..?r/ax<egineD
var : SolutieD n: .ndiceD ?rSol: EordD
procedure ,#isareD
var i5 6: .ndiceD
begin
inc0?rSol2D Eriteln0`Solutia nr. `5 ?rSol2D
#or i :F 1 to n do
begin
#or 6 :F 1 to n do
i# 6 F HiI t1en Erite0` Q `2
else Erite0` o `2D
Eriteln
endD
EritelnD readlnD
endD
procedure Plaseaza^<egina0O: .ndice2D
]cand apelam procedura Plaseaza^^<egina cu parametrul O am
plasat de6a regine pe liniile 15 -5 ...5O8lS
var i5 6: .ndiceD oO: booleanD
begin
i# O81 F n t1en ]am obtinut o solutieS
,#isare ]prelucrarea solutiei consta in a#isareS
else
]trebuie sa mai plasam regine pe liniile O5OMl5...5nS
#or i :F 1 to n do ]determin multimea / a candidatilor pentru pozitia OS
11
begin oO :F trueD ]veri#ic daca pot plasa regina de pe linia O in coloana iS
#or 6 :F 1 to O81 do
i# 0H6IFi2 or 0abs0H6I8i2F0O8622 t1en oO :F #alseD
]regina s8ar gasi pe aceeasi coloana sau aceeasi diagonala cu o regina de6a plasataS
i# oO t1en ]valoarea i respecta conditiile interneS begin
HOI :F iD]i este un candidat5 il extrag imediatS Plaseaza^<egina0OM12 D
endD endD endD
begin ]program principalS
Erite0`nF `2D readln0n2D
Plaseaza^<egina012D end.
;bservai c( am marcat poziiile libere cu ` o`5 iar poziiile pe care sunt plasate regine cu ` Q `.
S( analiz(m modul Bn care programul genereaz( aceste soluii. Pentru aceasta vom urm(ri execuia
programului pas cu pas.
1-
1$
14
15
Partiiile unei mulimi
Fie n aparine ?Q. Scriei un program recursiv care s( genereze toate partiiile mulimii ]15-.....nS.
De#iniie
Fie / o mulime nevid(. SF ]S15 S-5...5 SnS constituie o partiie a mulimii / dac( si numai dac( sunt
Bndeplinite urm(toarele condiii:
0clasele partiiei sunt nevide2 0clasele partiiei sunt dis6uncte2 0reuniunea claselor este egal( cu Bntreaga
mulime2.
1!
De exemplu5 pentru nF$ programul va a#ia:
<eprezentarea in#ormaiilor
&om reprezenta o partiie printr8un vector P5 de dimensiune n5 Bn care pentru #iecare element din
mulimea ]15-5...5nS rein indicele clasei din care #ace parte. ,ceast( reprezentare asigur( respectarea
tuturor condiiilor din de#iniia partiiei.
program PartitiiD
const ?/ax F -)D
tVpe "lement F 1..?/axD
lasa F 1..?/axD
Partitie F arraVH"lementI o# lasaD
var ?: "lementD ]numarul de elemente din multimeS
?: lasaD ]numarul de claseS
P: PartitieD ?rP: EordD ]numarul de partitiiS
procedure ,#isareD
var i: "lementD 6: lasaD
begin inc0?rP2D Erite0`Partitia `5 ?rP5 `: `2D
#or 6 :F 1 to ? do begin ]a#isez clasa nr. 6S Erite0` ]`2D
#or i :F 1 to ? do
i# PHiIF6 t1en Erite0i5 ` `2D
Erite0a8`S `2D
endD EritelnD endD
procedure 4enPartitie0O: "lement2D
]cand apelam 4enPartitie0O25 in vectorul P pe primele O81 pozitii se
a#la o partitie a multimii 15-5...5O8l #ormata din ? claseS
var 6: lasaD
begin
i# OF?M1 t1en ,#isare ]partitia este complet construitaS
else begin ]plasam elementul O in una din clasele existenteS
#or 6 :F 1 to ? do begin PHOI :F 6D 4enPartitie0O M 12D endD
]sau elementul O reprezinta o clasa separataS
inc0?2 D ]maresc numarul de claseS
PHOI :F ?D
4enPartitie0OM12D dec0?2D ]restaurez numarul de claseS endD endD
begin ]program principalS
Erite0`nF `2D readln0n2D 4enPartitie012D end.
Partiile unui num(r natural
Fie n aparine ?Q. Scriei un program care s( a#ieze Bn #iierul de ieire ` partnr. out` toate partiiile
num(rului natural n.
De#iniie
?umim partiie a unui num(r natural nenul n un sistem de numere naturale nenule ]p15p-5 . . . 5pOS
ast#el Bnc3t p1Mp-M. . . MpOFn De exemplu5 pentru nF5 programul va a#ia:
5F1 M1M1M1M1
5F1 M1M1M-
1%
5F1 M1M$
5F1 M-M-
5F1 M 4
5F- M $
5F5
<eprezentarea in#ormaiilor
&om reprezenta o partiie printr8un vector p cu maxim n componente5 Bn care vom reine elementele
partiiei. Pentru a nu genera de dou( ori o aceeai partiie 0de exemplu5 5F1M4 i 5F4M125 convenim s(
memoram Bn vectorul p elementele partiiei Bn ordine cresc(toare.
ondiii interne
0elementele partiiei sunt numere naturale nenule5 cel mult egale cu n2
0elementele partiiei sunt Bn ordine cresc(toare2D
0suma elementelor partiiei trebuie s( #ie egala cu n2.
&om utiliza o variabil( global( &alP Bn care vom reine permanent suma valorilor elementelor #ixate Bn
partiie. *a ad(ugarea unui element Bn partiie5 valoarea acestuia va #i ad(ugat( la &alP5 respectiv la
eliminarea unui element din partiie5 valoarea acestuia va #i sc(zut( din &alP.
on#orm condiiei interne -5 candidaii pentru o poziie O din partiie sunt numerele naturale cel puin
egale cu ultimul element plasat Bn partiie 0p H O81 I2. Pentru ca aceast( relaie s( #ie valabil( pentru orice O
0inclusiv pentru OFl25 vom utiliza o poziie suplimentar( Bn vectorul p5 poziia )5 pe care vom plasa iniial
valoarea 1 0p H ) I F12. on#orm condiiei interne $5 candidaii pentru o poziie O trebuie s( #ie numere
naturale care5 ad(ugate la suma valorilor #ixate de6a Bn partiie5 s( nu dep(easc( pe n5 deci trebuie s( #ie cel
mult egale cu n8&alP. Atiliz3nd aceste dou( observaii5 deducem c( mulimea candidailor posibili pentru
poziia O este ]p HO81 I5...5 n8&alPS.
program Partitii^?umar^?aturalD
const ?/ax F 1))D
tVpe "lement F ) .. ?/axD
Partitie F arraVH"lementI o# "lementD
var n5 &alP: "lementD ]&alP 8 reprezinta suma valorilor elementelor partitieiS
p: PartitieD #out: textD
procedure ,#isare0lg: "lement2 D
var i: "lementD
begin
Erite0]#out5S n5 `F `2D
#or i :F1 to lg81 do Erite0]#out5S pHiI5 ` M `2D Eriteln0]#out5S pHlgI2D
endD
procedure onstrPart0O: "lement2D ]cand apelam onstrPart0O2 am #ixat pH1I5pH-I5...5pHO81IS
var i: "lementD
begin
i# &alPFn t1en ,#isare0O812 ]am obtinut o solutie5 o a#isezS
else #or i :F pHO81I to n8&alP do begin pHOI :F iD
18
inc0&alP5i2D ]maresc &alP cu valoarea noului elementS
onstrPart 0OM12 D ]apel recursivS
dec0&alP5 i2D ]restaurez valoarea variabilei &alPS endD
endD
begin
Erite0`nF `2D readln0n2D assign0#out5 `partnr.out`2D
reErite0#out2D pH)I :F 1D
onstrPart012D close0#out2D end.
,plicaii
Plata unei sume cu monede de valori date.
,v3nd la dispoziie n s(culee cu monede5 #iecare s(cule conin3nd monede de aceeai valoare5 s( se
a#ieze toate modalit(ile de a pl(ti o sum( dat( S #olosind numai monedele din s(culee.
De exemplu5 s( presupunem c( trebuie s( ac1it(m suma SF1)) i avem nF$ s(culee de monede. Kn primul
s(cule se g(sesc ! monede cu valoarea $5 Bn al doilea s(cule se g(sesc 4 monede cu valoarea %5 iar Bn
ultimul s(cule sunt 14 monede cu valoarea 5. Programul va a#ia Bn #iierul de ieire 0denumit ` suma. out`2
cele dou( soluii posibile de plat( ast#el:
Soluia nr. 1
$ monede cu valoarea $
$ monede cu valoarea %
14 monede cu valoarea 5
Soluia nr. -
4 monede cu valoarea $
4 monede cu valoarea %
1- monede cu valoarea 5
<eprezentarea in#ormaiilor
&om reine Bntr8un vector & cu n componente valorile monedelor din cei n s(culee5 iar Bntr8un alt vector
/ vom reine multiplicit(ile5 adic( num(rul de monede din #iecare s(cule Bn parte.
program Plata^SumaD
const ?r/ax/onede F -)D
tVpe /oneda F )..?r/ax/onedeD
&alori F arraVH/onedaI o# EordD
/ultiplicitati F arraVH/onedaI o# bVteD
var n: /onedaD
1+
&: &aloriD
/5 P: /ultiplicitatiD
S5 Sum5 ?rSol: EordD #out: textD
procedure itireD
]citesc datele de intrare din #isierul suma.inS
var #in: textD i: /onedaD
begin
]assign0#in5`c:btpbbinbsuma.in`2D reset0#in2DS
readln0]#in5S n2D readln0]#in5S S2D
#or i :F 1 to n do readln0]#in5S &HiI5 /HiI2D ] close0#in2DS endD
procedure ,#isareD ]a#isez o solutie in #isierul de iesireS
var i: /onedaD
begin
inc0?rSol2D Eriteln0]#out5S `Solutia nr. `5 ?rSol2D
#or i :F 1 to n do i# PHiIPG) t1en
Eriteln0]#out5S PHiI5 ` monede cu valoarea `5 &HiI2D
Eriteln]0#out2SD
endD
procedure Plata0O: /oneda2D
]cand apelam procedura Plata cu parametrul O am selectat de6a monede din saculetii 15-5...5O8lS
var 6: /onedaD
begin
i# OFnM1 t1en ]am selectat monede de toate tipurileS
i# Sum F S t1en ,#isare ]Sum 8 valoarea monedelor selectate este egala cu SS
else else ]mai selectam monede din saculetii O5OMl5...5nS
#or 6 :F ) to /HOI do begin PHOI :F 6D ]selectez 6 monede din saculetul OS
i# SumM6Q&HOIPFS t1en
]valoarea monedelor selectate din saculetul O adaugata la valoarea monedelor de6a selectateS
]nu depaseste S5 suma care trebuie platitaS
begin inc0Sum5 6Q&HOI2D ]adaug valoarea monedelor selectate din saculetul OS
]la valoarea totala a monedelor selectate memorata in SumS
Plata0OM12D ]apel recursivS
dec0Sum5 6 Q &HOI2D ]restaurez dupa apel valoarea variabilei globale SumS
end else breaO ]valoarea curenta a monedelor selectate depaseste suma SS
]iesire #ortata din #or5 deoarece nu are sens sa selectez mai multe monede din saculetul O5 oricum am
depasit de6a SS
endD endD
begin ]program principalS
itireD
assign0#out5 `suma.out`2D reErite0#out2D Plata012D close0#out2D
end.
;bservai c(5 i Bn acest program am utilizat te1nica variabilei globale:
-)
pentru a nu calcula la #iecare pas valoarea total( a monedelor de6a selectate5 am reinut aceast( valoare Bn
variabila global( Sum. De #iecare dat( c3nd select(m monede dintr8un s(cule5 ad(ug(m valoarea
monedelor selectate la Sum5 apoi apel(m recursiv procedura Plata care selecteaz( Bn continuare monede din
ceilali s(culee pentru plata sumei. 3nd revenim din apelul recursiv5 trebuie s( restaur(m valoarea
variabilei globale Sum 0deci trebuie s( sc(dem din Sum valoarea monedelor selectate la pasul precedent din
s(culeul O5 pentru a putea ad(uga ulterior5 dac( este cazul5 valoarea corespunz(toare monedelor selectate
din s(culeul O la pasul urm(tor2.
;bservai5 de asemenea5 c( am optimizat programul: dac( la un moment dat valoarea monedelor de6a
selectate dep(ete suma S care trebuie pl(tit(5 nu continu(m generarea.
Paranteze
Fie ? aparine ?Q5 ? num(r par. S( se scrie un program care s( genereze toate irurile de n paranteze
rotunde care se Bnc1id corect. De exemplu5 pentru ?F45 programul a#ieaz(:
0022 0202
<eprezentarea in#ormaiilor
&om memora un ir de paranteze Bntr8un vector s cu ? componente care pot avea doar valorile ` 0 ` sau ` 2 `.
*a #iecare moment vom reine num(rul total de paranteze desc1ise 0Bn variabila global( ?D2 i num(rul
total de paranteze Bnc1ise 0Bn variabila global( ?.2.
ondiii interne Bn #inal: ?DF?.
?um(rul total de paranteze Bnc1ise trebuie s( #ie egal cu num(rul total de paranteze desc1ise i egal cu
? div -.
,ceast( condiie nu este su#icient(. Dac( am considera numai aceast( condiie5 irul 2 2 0 0 ar trebui s(
#ie corect i nu eJ Pentru ca parantezele s( se Bnc1id( corect5 trebuie ca la #iecare moment num(rul de
paranteze desc1ise s( #ie cel puin egal cu num(rul de paranteze Bnc1ise.
Pe parcurs : ?DGF?..
program ParantezeD
const ?/ax F -)D
tVpe .ndice F 1..?/axD Sir F arraVH.ndiceI o# c1arD
var s: SirD ?5 ?D5 ?.: .ndiceD
]?D 8 numarul total de paranteze desc1iseS ]?. 8 numarul total de paranteze inc1iseS #out: textD
procedure ,#isareD
var i: .ndiceD
begin
#or i :F 1 to ? do Erite0]#out5S sHiI2D Eriteln]0#out2S endD
procedure onstructie0O: .ndice2D
]cand apelam onstructie0O25 am #ixat in sir O8l parantezeS
begin
i# O81 F ? t1en ]sirul de paranteze este completS
,#isare else begin
i# ?D P ? div - t1en ]se mai pot desc1ide parantezeS
begin
sHOI:F`0`D inc0?D2D onstructie0OM12D dec0?D2D endD
i# ?. P ?D t1en ]se poate inc1ide o parantezaS
begin sHOI :F `2` D inc0?.2D onstructie0OM12D dec0?.2D
end end endD
begin ]program principalS
Erite0`?F `2D readln0?2D
-1
assign0#out5 `sir.out`2D reErite0#out2D onstructie012D close0#out2D end.
omis8voia6or
An comis8voia6or plec( din oraul Bn care locuiete 0s381 not(m 12 s( prezinte produsele unei #irme Bn toate
cele n orae din regiunea sa. "l are la dispoziie 1arta regiunii5 pe care sunt marcate leg(turile directe dintre
orae i distanele dintre acestea. Scriei un program care s( determine un traseu c3t mai scurt5 ast#el Bnc3t
comis8voia6orul s( viziteze toate oraele din regiune5 s( nu treac( de mai multe ori prin acelai ora i s( se
Bntoarc( Bn oraul Bn care locuieteJ
De exemplu5 s( presupunem c( exist( nF5 orae5 numerotate de la 1 la 5. S( presupunem c( 1arta
regiunii indic( urm(toarele leg(turi directe :
Pentru acest exemplu5 programul va a#ia:
'raseul cel mai scurt are lungimea 815.)) 'raseul este 15$545-5551
<eprezentarea in#ormaiilor
&om reprezenta 1arta regiunii printr8o matrice p(tratic( ,5 cu nxn componente av3nd semni#icaia: , H i5
6 I F )5 dac( Bntre oraele i i 6 nu exista leg(tur( direct(5 respectiv distana dintre oraele i i 65 dac( Bntre i i
6 exist( leg(tur( direct(.
'raseul5 mai exact ordinea Bn care comis8voia6orul viziteaz( cele n orae5 Bl vom reine Bntr8un vector '5
cu n componente.
Pentru a nu trece de mai multe ori prin acelai ora5 vom mai utiliza un vector v5 cu n componente5 Bn
care pentru #iecare ora vom reine dac( a #ost sau nu vizitat: v H i I F 1 dac( oraul i a #ost vizitat i ) Bn caz
contrar.
3nd obinem un traseu soluie nu Bl a#i(m5 ci Bl compar(m cu traseul de lungime minim( obinut p3n(
la momentul respectiv. Prin urmare5 vom utiliza '/in5 un vector cu n componente5 Bn care reinem un
traseu de lungime minim( i o variabil( global( *g/in Bn care reinem lungimea acestui traseu.
Pentru a optimiza procedura de generare a traseelor5 vom utiliza o variabil( global( *g m care reinem
lungimea traseului curent. ,st#el5 nu va mai #i nevoie s( calcul(m la #iecare pas lungimea traseului curent:
c3nd ne deplas(m Bn alt ora adun(m distana p3n( la oraul respectiv la *g. 3nd elimin(m un ora de pe
traseu5 sc(dem distana p3n( la acesta din *g. Dac( la un moment dat
--
program omis^&oia6orD
const ?/ax;rase F -)D
tVpe ;ras F 1 .. ?/ax;raseD
carta F arraVHoras5 ;rasI o# realD 'raseu F arraVHorasI o# ;rasD
var ,: cartaD n: ;rasD '5 '/in: 'raseuD *g5 *g/in: realD v: arraVHorasI o# )..1D
procedure itireD
var i5 6: ;rasD #: textD d: realD
begin
assign0#5 `comis.in`2D reset0#2D readln0#5 n2D E1ile not seeOeo#0#2 do
begin ]de pe #iecare linie citesc doua orase intre care exista legatura directa5 precum si distanta dintre eleS
readln0#5 i5 65 d2 D ,Hi56I :F dD ,H65iI :F dD endD close0#2 endD
#unction .n#init: realD ]intoarce un numar
su#icient de mare5 pentru a putea #i utilizat ca
valoare de initializare pentru *g/inS
var s: realD i5 6: ;rasD
begin s :F )D #or i :F 1 to n do #or 6 :F 1 to n do s:FsM,Hi56ID .n#init :F sM1D
endD
procedure ,#isareD
var i: ;rasD
begin
i# *g/in F .n#init t1en Eriteln0`?u exista solutii`2 else begin
Eriteln0`'raseul cel mai scurt are lungimea `5*g/in:1):-2DEritelnD
Erite0`'raseul este `2D
#or i :F 1 to n do Erite 0'/inHiI 5 `5`2D
Eriteln0'/inH1I2DEritelnD endD
readlnD endD
procedure onstr'raseu0O: ;ras2D
var i: ;rasD
begin
i# O81 F n t1en ]traseul este completS
-$
i# ,H15 'HnII PG ) t1en ]poate reveni in orasul 1S
i# *gM,H15'HnIIP*g/in t1en begin ]am obtinut un traseu mai scurtS
'/in :F 'D *g/in :F *gM,H15'HnIID
end else else else ]construiesc in continuare traseulS
#or i :F - to n do ]veri#ic daca se poate deplasa in orasul iS
i# 0,Hi5 'HO81II PG )2 and 0vHiI F )2 t1en begin
'HOI :F iD vHiI :F 1D *g :F *gM,Hi5'HO81I I D
i# *g PF *g/in t1en onstr'raseu0OM12D vHiI :F )D *g :F *g8,Hi5'HO81IID end endD
begin ]program principalS
itireD 'H1I :F 1D vH1I :F 1D *g/in :F .n#initD onstr'raseu 0-2D ,#isareD end.
>acOtracOing in plan
Kn variant( elementar(5 aplic(m metoda bacOtracOing pentru rezolvarea problemelor Bn care soluia era
reprezentat( ca vector. Putem generaliza ideea c(ut(rii cu revenire i pentru probleme Bn care c(utarea se
#ace \Bn planX. Pentru noi5 planul va #i reprezentat ca un tablou bidimensional.
Pentru a intui modul de #uncionare a metodei bacOtracOing Bn plan5 s( ne imagin(m explorarea unei
peteri. Speologul pornete de la intrarea Bn peter( i trebuie s( exploreze Bn mod sistematic toate culoarele
peterii. e Bnseamn( \Bn mod sistematicX L Bn primul r3nd5 Bi stabilete o ordine pentru toate direciile
posibile de micare 0de exemplu5 ?5 ?"5 "5 S"5 S5 S&5 &5 ?&2 i Bntotdeauna c3nd se g(sete Bntr8un punct
din care are mai multe culoare de explorat5 alege direciile de deplasare Bn ordinea prestabilit(. Kn al doilea
r3nd5 speologul va plasa marca6e pe culoarele pe care le8a explorat5 pentru ca nu cumva s( se r(t(ceasc( i
s( parcurg( de mai multe ori acelai culoar 0ceea ce ar conduce la determinarea eronat( a lungimii peterii2.
Bn ce const( explorarea L Speologul exploreaz( un culoar p3n( c3nd Bnt3lnete o intersecie sau p3n(
c3nd culoarul se Bn#und(. Dac( a a6uns la o intersecie5 exploreaz( succesiv toate culoarele care pornesc din
intersecia respectiv(5 Bn ordinea prestabilit( a direciilor. 3nd un culoar se Bn#und(5 revine la intersecia
precedent( i alege un alt culoar5 de pe urm(toarea direcie 0dac( exist(D dac( nu exist(5 revine la intersecia
precedent( .a.m.d.2.
S( descriem Bntr8o #orm( mai general( aceast( metod(.
&om nota prin ?rDirectii o constant( care reprezint( num(rul de direcii de deplasare5 iar dx5 respectiv dV
sunt doi vectori constani care reprezint( deplas(rile relative pe direcia ;x5 respectiv pe direcia ;V5
urm3nd Bn ordine cele ?rDirectii de deplasare.
procedure >Ot^Plan0x5V: integer2D
0x5 V reprezinta coordonatele pozitiei curenteS
begin
"xplorare0x5V2D ]exploram pozitia curentaS
i# "Pinal0x5V2 t1en Prelucrare^Solutie ]pozitia x5V este un punct #inalS
else ]continuam cautareaS
#or i : F 1 to ?rDirectii do ]ma deplasez succesiv pe directiile posibile de miscareS
i# ?evizitat0xMdxHiI5 VMdVHiI2 t1en ]nu am mai trecut prin aceasta pozitieS
>Ot^Plan0xMdxHiI5 VMdVHiI2D endD
*abirint
Kntr8un labirint5 reprezentat ca o matrice *5 cu n linii i m coloane5 cu componente ) sau 1 01 semni#ic3nd
perete5 ) culoar25 se g(sete o bucat( de br3nz( pe poziia 0xb5 Vb2 i un oricel pe poziia 0xs5 Vs2. ,#iai
toate posibilit(ile oricelului de a a6unge la br3nz(5 tiind c( el se poate deplasa numai pe culoar5 iar
direciile posibile de micare sunt ?5 ?"5 "5 S"5 S5 S&5 &5 ?&.
De exemplu5 pentru un labirint cu 4 linii i 4 coloane de #orma urm(toare5 Bn care oricelul se g(sete pe
poziia 1 15 iar br3nza pe poziia 4 4
) 1 1 1
-4
) 1 1 1
) 1 ) )
1 ) 1 )
programul va a#ia:
Soluia nr. 1
Q111
Q111
Q1QQ
1Q1Q
Soluia nr. -
Q111
Q111
Q1Q)
1Q1Q
<eprezentarea in#ormaiilor
*abirintul este reprezentat ca o matrice *5 cu nxm elemente. "lementele labirintului sunt iniial )
0semni#ic3nd culoar2 i 1 0semni#ic3nd perete2. Pentru ca oricelul s( nu treac( de mai multe ori prin
aceeai poziie5 exist3nd riscul de a intra Bn bucl(5 vom marca Bn labirint poziiile prin care trece oricelul cu
-.
Pentru a determina poziiile Bn care se poate deplasa oricelul5 vom utiliza dou( constante cu tip Dx i
DV5 pe care le iniializ(m cu deplas(rile pe linie5 respectiv pe coloan( pentru toate cele 8 direcii posibile de
micare.
Pentru a nu veri#ica permanent daca oricelul nu a a6uns cumva la marginea labirintului5 bord(m
labirintul cu perete 0dou( linii i dou( coloane cu valoarea 12.
ondiii interne
Din poziia 0x5 V2 oricelul se poate deplasa pe direcia dir5 deci Bn poziia 0xMDxHdirI 5 VMDVHdirI 2 dac( i
numai dac(
*HxMDxHdirI5VMDxHdirIIF) 0aceast( poziie reprezint( un culoar prin care oricelul nu a mai trecut2.
program autare^in^*abirintD
const Dim/ax F -)D ]dimensiunea maxima a labirintuluiS Dx: arraVH1..8I o# integer F 0815815)5151515)58
1 2D
-5
DV: arraVH1..8I o# integer F 0)515 1515)5815815812D
tVpe .ndice F ) .. Dim/ax M1D *abirint F arraVH.ndice5 .ndiceI o# ) .. -D
var *: *abirintD n5 m5 xs5 Vs5 xb5 Vb: .ndiceD #out: textD ?rSol: EordD
procedure itireD
var #: textD i5 6: .ndiceD
begin
assign 0#5 `labirint.in`2D reset0#2D
readln0#5 n5 m2D readln0#5 xs5 Vs5 xb5 Vb2D
#or i :F 1 to n do begin
#or 6 :F 1 to m do read 0#5 * H i5 6 I 2 D readln0#2 endD close0#2D
endD
procedure >ordareD ]bordam labirintul cu cate un pereteS var i: .ndiceD
begin #or i :F ) to nM1 do ]perete la stanga si la dreaptaS
begin *Hi5 )I :F 1D *Hi5 mM1I :F 1 endD
#or i :F ) to m M1 do ]perete sus si 6osS
begin *H)5 iI :F 1D *HnM15 iI :F 1 end endD
#unction Final0x5 V: .ndice2: booleanD ]intoarce true daca in pozitia x V se a#la branzaS begin
Final :F #alseD
i# 0x F xb2 and 0V F Vb2 t1en Final :F true endD
procedure ,#isareD
var i5 6: .ndiceD
begin inc0?rSol2D Eriteln0#out5 `Solutia nr. `5 ?rSol2D
#or i :F 1 to n do begin #or 6 :F 1 to m do
i# *Hi5 6I F - t1en Erite0#out5 `Q`2
else Erite0#out5 *Hi5 6I2D Eriteln0#out2D endD
endD
procedure auta0x5 V: .ndice2D
var dir: 1..8D
begin
*Hx5VI :F -D ]marc1ez pozitia x VS
i# Final0x5 V2 t1en ,#isare else #or dir :F 1 to 8 do
-!
i# *HxMDxHdirI5 VMDVHdirIIF) t1en ]culoar nevizitatS auta0xMDxHdirI5 VMDVHdirI2D
*Hx5 VI :F )D ]la intoarcere sterg marca6ul5 pentru a putea exploraS
]acest culoar si in alta variantaS endD
begin ]program principalS
itireD >ordareD
assign0#out5 `labirint.out`2D reErite0#out2D
auta0xs5 Vs2D
i# ?rSol F ) t1en Eriteln0#out5 `?u exista solutiiJ`2D
close0#out2Dend.
Fotogra#ie
Fotogra#ia alb8negru a unui obiect este reprezentat( sub #orma unei matrice cu n linii i m coloane5 ale c(rei
elemente sunt ) sau 1. "lementele egale cu 1 reprezint( punctele ce aparin unui obiect. Dou( elemente de
valoare 1 #ac parte din acelai obiect dac( sunt adiacente pe linie sau pe coloan(. Se cere s( se determine
num(rul obiectelor din #otogra#ie.
De exemplu5 pentru matricea:
Soluie
Pentru a num(ra obiectele din #otogra#ie5 vom parcurge matricea care reprezint( #otogra#ia5 c(ut3nd un
element cu valoarea 15 deci care aparine unui obiect. &om num(ra noul obiect depistat5 apoi vom \tergeX
obiectul din #otogra#ie5 color3ndu81 Bn culoarea de #ond 0valoarea ) Bn matrice2. Pentru a \tergeX un obiect
vom #olosi procedura recursiv( Sterge^)biect 0x5 V25 care Bn cazul Bn care punctul de coordonate 0x5 V2
aparine obiectului 0a Hx5 V6 F125 Bl terge 0a Hx5VI F)25 apoi se apeleaz( recursiv procedura pentru toate
punctele adiacente cu 0x5V2 0pe linie sau pe coloan(2.
Pentru a nu testa permanent dac( Bn timpul c(ut(rii am dep(it marginile #otogra#iei5 am bordat matricea
care reprezint( #otogra#ia cu c3te o linie i o coloan( sus5 6os5 st3nga5 dreapta iniializate cu valoarea ) 0am
\Bnr(matX #otogra#ia2.
C ;bservaie
,cest tip de algoritm5 prin care plec3nd de la un element sunt \atinseX succesiv toate elementele care au
o leg(tur( 0direct( sau indirect(2 cu elementul respectiv5 poart( numele de algoritm de#Bll 0umplere2.
program Fotogra#ieD
const Dim/ax F 5)D Dx: arraVHl .. 4I o# integerF0815)515)2D DV: arraVHl .. 4I o# integerF0)515)5812D
-%
tVpe .ndice F ) .. Dim/axM1D
var a: arraVH.ndice5 .ndiceI o# ) .. 1D m5 n5 i5 65 ?r;biecte: .ndiceD
procedure itireD
var #in: textD
begin assign0#in5 `#oto.in`2D reset0#in2D readln0#in5 n5 m2 D
#or i : F 1 to n do begin #or 6 :F 1 to m do read0#in5 aHi5 6I2D readln0#in2D endD
close0#in2D endD
procedure Sterge^)biect0x 5V: .ndice2D
var dir: 1 .. 4D
begin i# aHx5 VI F 1 t1en begin aHx5 VI :F )D ]sterg acest element de imagineS
]cautarea continua in cele 4 directii posibileS
#or dir:F 1 to 4 do Sterge^)biect0xMDxHdirI5 VMDVHdirI2D endD endD
begin
itireD
#or i : F 1 to n do #or 6 : F 1 to m do i# aHi5 6I F 1 t1en ]am depistat un obiectS
begin inc0?r;biecte2D Sterge^)biect0i5 62D endD
Eriteln0`?r. obiecte F `5 ?r;biecte2D readln end.
onsideraii #inale asupra metodei bacOtracOing
, existat o perioad( Bn evoluia g3ndirii algoritmice c3nd metoda bacOtracOing era considerat( un panaceu.
?u tim s( rezolv(m o problem(L ?u8i nimicJ ,plic(m un bacOtracOingJ Sigur c( aceast( metod( are
avanta6e indiscutabile. Dup( cum spuneam la Bnceputul capitolului5 metoda evit( generarea tuturor
soluiilor posibile5 urmat( de veri#icarea condiiilor problemei pentru #iecare soluie posibil( 0adic( se poate
i mai r(u2. Kn plus5 rezolvarea unei probleme prin bacOtracOing garanteaz( obinerea soluiei. ?umai c(
timpul de execuie este #oarte mare5 datorit( revenirilor speci#ice metodei. Aneori timpul de execuie este
at3t de mare5 Bnc3t pentru dimensiuni mari ale datelor de intrare obinerea unei soluii este practic
imposibil(.
Kn concluzie5 atunci c3nd trebuie s( rezolv(m o problem( Bncerc(m Bn primul r3nd s( elabor(m un
algoritm care nu se bazeaz( pe bacOtracOing. Dac( nu reuim s( elabor(m un ast#el de algoritm sau un
ast#el de algoritm nu exist(5 analiz(m datele de intrare. Dac( datele de intrare au dimensiuni rezonabil de
mici5 ast#el Bnc3t un algoritm bacOtracOing s( #urnizeze soluii Bn timp util5 abord(m problema Bn aceast(
manier(.
Dac( Bns( datele de intrare au dimensiuni mari5 ceea ce Bn practic( este inevitabil5 o abordare bacOtracOing
este inacceptabil(. Principiul de baz( poate #i rezumat ast#el: dec3t un algoritm teoretic per#ect5 dar care s(
nu #urnizeze soluii Bn timpul disponibil5 mai bine un algoritm bun5 care s( o#ere soluii \aproapeX optime Bn
timp scurt. An ast#el de algoritm este denumit algoritm euristic. Studiul algoritmilor euristici este o
problem( \#ierbinteX Bn in#ormatic( la ora actual(.
4enerarea elementelor combinatorice
,naliza combinatorica este o ramur( a matematicii care studiaz( di#erite posibilit(i de ordonare sau de
combinare a unor elemente. De exemplu5 \Bn c3te moduri putem aran6a 4 litere di#erite L X sau \c3te
posibilit(i exist( de a construi o ec1ip( #ormat( din 5 #ete si $ b(iei dintr8o clas( cu -) de #ete i 11
b(iei L X.
*a matematic( am studiat c3teva elemente de combinatoric( 0permut(ri5 combin(ri5 aran6amente2. Kn
acest capitol vom descrie algoritmi recursivi de generare a acestor elemente combinatorice.
-8
4enerarea permut(rilor.
Fie ne ?Q. Scriei un program recursiv de generare a permut(rilor de ordin n. De exemplu5 pentru nF$
programul va genera:
1 - $
1 $ -
- 1 $
- $ 1
$ 1 -
$ - 1
Soluie <eprezentarea in#ormaiilor
Permut(rile de ordin n reprezint( toate posibilit(ile de a aran6a elementele unei mulimi de n elemente.
De#inite riguros5 permut(rile de ordin n sunt #uncii bi6ective de #orma:
p:]15-5...5nS8G]15-5...5nS.
<eprezent(m o ast#el de #uncie printr8un vector p5 cu n componente5 av3nd semni#icaia: p H i I este
elementul asociat prin intermediul #unciei p elementului i 0i aparine ]15 - 5...5 nS2.
ondiii interne
1. pHiI aparine ]15-5...5nS pentru i aparine ]15-5...5nS
0domeniul de valori este ]15-5...5nS2
-. p H i I di#erit p H 6 I 5 pentru i di#erit 6 5 i5 6 aparine ]15 - 5...5 nS 0#uncia este in6ectiv(2.
program PermutariD
const ?/ax F -)D
tVpe .ndice F 1 .. ?/axD Permutare F arraVH.ndiceI o# .ndiceD
var n: .ndiceD p: PermutareD .mF: set o# .ndiceD ]imaginea #unctieiS #out: textD ]#isierul de iesireS
procedure ,#isareD
var i: .ndiceD
begin
#or i :F 1 to n do Erite0#out5 pHiI5 ` `2D Eriteln0#out2D endD
procedure 4enPermutari0O: .ndice2D ]cand apelam procedura 4enPermutari cu parametrul O2
]pozitiile 15-5...5O81 din vectorul p sunt #ixateS
var i: .ndiceD
begin
i# O81 F n t1en ]solutia este completaS ,#isare ]prelucrarea solutiei consta in a#isareS
else ]continuam generareaS
#or i:F1 to n do ]determin candidatii pentru pozitia OS
i# not 0i in .m#2 t1en begin ]i este un candidat5 deoarece nu este imaginea nici unui alt element #ixatS
pHOI :F iD .m# :F .m# M H iID ]i este imaginea lui O5 deci il retin in .m#S
4enPermutari 0O M 12D ]apel recursivS
.m# :F .m#8HiID ]restaurez valoarea variabilei .m# dinaintea apeluluiS endD
endD
begin
Erite0` n F `2D readln0n2D assign0#out5 `perm.out`2D reErite0#out2D
4enPermutari012D close0#out2D end.
;bservatie
Pentru generarea permut(rilor am utilizat o te1nic( interesant(.
Kn loc sa veri#icam pentru #iecare element i daca este sau nu un candidat
pentru pozitia OS
procedure 4en,ran6amente0O: .ndice2D
var i: .ndiceD
begin
i# O8lFm t1en ]numarul de elemente din vector este mS ,#isare
else #or i : F 1 to n do i# not 0i in .m#2 t1en begin
-+
.m# :F .m# M HiID #HOI :F iD 4en,ran6amente0OM12 D
.m# :F .m# 8 HiID endD
endD
4enerarea combin(rilor.
Fie n?Q i m?5 mPn. Scriei un program recursiv care s( genereze combin(rile de n elemente luate c3te
m.
De exemplu5 pentru nF4 i mF-5 programul va genera:
l -
l $
l 4
- $
- 4
$ 4
Soluie
ombin(rile de n elemente luate c3te m reprezint( toate submulimile de m elemente ale unei mulimi cu
n elemente. ;bservai c(5 spre deosebire de aran6amente5 ordinea elementelor din submulime nu conteaz(.
Din acest motiv5 pentru a nu genera de mai multe ori aceeai submulime 0de exemplu5 1 - i - 12 vom
stabili o ordine convenabil( pentru elementele submulimii 8 ordinea cresc(toare.
<eprezentarea in#ormaiilor
<eprezent(m o submulime printr8un vector 5 care conine cele m elemente ale submulimii5 ordonate
cresc(tor.
ondiii interne
0elementele aparin mulimii ]15-5 ... 5nS2
0elementele sunt ordonate cresc(tor2.
on#orm celei de a doua condiii interne pe poziia O putem plasa doar elemente mai mari dec3t elementul
plasat pe poziia O81 0HO8lI2. Deci5 valoarea minim( care poate #i plasat( pe poziia O este HO81I M1.
Pentru ca aceast( #ormul( s( #ie valabil( pentru orice poziie O 0inclusiv pentru OFl2 vom declara indicii
vectorului care reprezint( submulimea Bncep3nd de la ) i vom considera H ) I F ).
Deoarece dup( HOI trebuie plasate Bnc( m8O elemente mai mari dec3t HOI5 s( determin(m valoarea
maxim( care poate #i plasat( pe poziia O.
&aloarea maxim( care poate #i plasat( pe poziia m este n5 pe poziia m81 este n81 .a.m.d. ;bserv(m
c(5 daca poziia scade cu 15 i valoarea maxim( care poate #i plasat( pe poziia respectiv( scade cu 1. Prin
urmare5 di#erena dintre poziie i valoarea maxim( care poate #i plasat( pe poziia respectiv( este constant(
0m8n2. Deducem c( valoarea maxim( care poate #i plasat( pe poziia O este n8mMO. Prin urmare5 mulimea
candidailor pentru poziia O este ]HO8lIMl5...5n8mMOS.
program ombinariD
const ?/ax F $)D
tVpe .ndice F )..?/axD
$)
Submultime F arraVH.ndiceI o# .ndiceD
var : SubmultimeD m5 n: .ndiceD
procedure ,#isareD
var i : .ndiceD
begin #or i :F 1 to m do Erite0HiI5` `2D EritelnD endD
procedure 4enombinari0O : .ndice2D
var i : .ndiceD
begin i# O81Fm t1en ,#isare
else #or i :F HO81IM1 to n8mMO do begin HOI :F iD 4enombinari0OM12D endD
endD
begin
Erite0`n F `2D readln0n2D Erite0`m F `2D readln0m2D 4enombinari012D end.
Divide et .mpera
Prezentare generala
Divide et .mpera este o te1nic( special( prin care se pot rezolva anumite probleme. a i
bacOtracOing5 divide et impera se bazeaz( pe un principiu extrem de simplu: descompunem problema Bn
dou( sau mai multe subprobleme 0mai uoare25 care se rezolv(5 iar soluia pentru problema iniial( se
obine combin3nd soluiile problemelor Bn care a #ost descompus(. Se presupune c( #iecare din problemele
Bn care a #ost descompus( problema iniial(5 se poate descompune Bn alte subprobleme5 la #el cum a #ost
descompus( problema iniial(. Procedeul se reia p3n( c3nd 0Bn urma descompunerilor repetate2 se a6unge la
probleme care admit rezolvare imediat(.
"vident5 nu toate problemele pot #i rezolvate prin utilizarea acestei te1nici. F(r( teama de a grei5
putem a#irma c( num(rul lor este relativ mic5 tocmai datorit( cerinei ca problema s( admit( o
descompunere repetat(.
Divide et impera este o te1nic( ce admite o implementare recursiv(. ,m Bnv(at principiul general
prin care se elaboreaz( algoritmii recursivi: ce se Bnt3mpl( la un nivel5 se Bnt3mpl( la orice nivel 0av3nd
gri6( s( asigur(m condiiile de terminare2. 'ot aa5 se elaboreaz( un algoritm prin divide et impera: la un
anumit nivel avem dou( posibilit(i:
12 am a6uns la o problem( care admite o rezolvare imediat(5 caz Bn care se rezolv( i se revine din
apel 0condiia de terminare2D
-2 nu am a6uns Bn situaia de la punctul 15 caz Bn care descompunem problema Bn dou( sau mai multe
subprobleme5 pentru #iecare din ele reapel(m procedura 0#uncia25 combin(m rezultatele si revenim din
apel.
/axim dintr8un vector
Se citete un vector cu n componente numere naturale. Se cere s( se tip(reasc( valoarea maxim(.
Problema de mai sus este binecunoscut(. um o rezolv(m utiliz3nd divide et imperaL
'rebuie tip(rita valoarea maxima dintre numerele reinute Bn vector de la i la 6 0iniial iF15 6Fn25
Pentru aceasta proced(m ast#el:
C dac( iF65 valoarea maxim( va #i v H i ID
C contrar vom Bmp(ri vectorul Bn doi vectori 0primul vector va conine componentele de la i la
0iM62 div -5 al doilea va conine componentele de la 0iM62 div -M1 la 65 rezolv(m subproblemele 0a#l(m
$1
maximul pentru #iecare din ele2 iar soluia problemei va #i data de valoarea maxima dintre rezultatele
celor dou( subprobleme.
program maximD
var v:arraVH1..1)I o# integerD
n5i:integerD
#unction max 0i56 :integer2: integerD
var a5b:integerD
begin
i# iF6 t1en max:FvHiI else begin a:Fmax0i5 0iM62div -2D b:Fmax00iM62 div -M1562D
i# aGb t1en max:Fa else max:FbD endD
endD
begin
Erite0`nF`2Dreadln0n2D
#or i:F1 to n do begin Erite 0`vH`5i5 `IF`2D readln 0vHiI 2 endD
Eriteln 0`maxF`5 max 015n22
end.
,lgoritmul prezentat este exclusiv didactic5 Bn practic( se pre#er( algoritmul clasic.
(utare binar(
Se citete un vector cu n componente numere Bntregi5 unde numerele se presupun ordonate
cresc(tor i o valoare Bntreag( 0nr2. S( se decid( dac( nr se g(sete sau nu printre numerele citite5 iar Bn
caz a#irmativ s( se tip(reasc( indicele componentei care conine acea valoare.
; rezolvare Bn care nr se compar( pe r3nd cu cele n valori5 este lipsit( de valoare 0nu exploateaz(
#aptul c( cele n valori sunt Bn secven( cresc(toare2. ,lgoritmul care va #i propus este mult mai per#ormant
i #ace parte din algoritmii clasici.
program acOermannD
tVpe stivaFarraV H1..1))51..-I o# integerD
var st: stivaD m5n5O:integerD
begin
Erite 0`mF`2 D readln 0m2D Erite 0`nF`2D readln 0n2D
O:F1D stHO51I:FmD stHO5-I:FnD
E1ile OG) do i# 0stHO51IPG)2 and 0stHO5-IPG)2 t1en begin
O:FOM1D stHO51I:F stHO815 1ID stHO5-I:FstHO815-I81 end
else i# stHO5-IF) t1en
$-
begin stHO51I:FstHO51I81D stHO5-I:F1 end
else begin O:FO81D i# OG) t1en
begin stHO51I:FstHO51I81D stHO5-I:FstHOM15-IM1 end
endD Eriteln0`ac0`5m5 `5 `5n5`2F`5stH15-IM12
end.
] mF-5 nF$S
a i la problema anterioar(5 este interesant de urm(rit modul Bn care a #ost ridicat( recursivitatea
din de#iniie. ele dou( variante sunt ec1ivalente din punct de vedere al timpului de calcul5 dar cea
recursiv( este de pre#erat pentru simplitatea cu care a #ost scris programul.
Erite0`nrF`2D readln0nr2D caut015n2D end.
'urnurile din canoi
Se dau $ ti6e simbolice prin a5 b5 c. Pe ti6a a se g(sesc discuri de diametre di#erite5 aezate Bn ordine
descresc(toare a diametrelor privite de 6os Bn sus. Se cere s( se mute discurile respect3nd urm(toarele
reguli:
C la #iecare pas se mut( un singur disc:
C nu este permis s( se aeze un disc cu diametrul mai mare peste un disc cu diametrul mai mic.
<ezolvare:
Dac( nF1 se #ace mutarea ab5 adic( se mut( discul de pe ti6a a pe ti6a b. Dac( nF- se #ac mut(rile
ac5 ab5 cb.
Kn cazul Bn care nG- problema se complic(. ?ot(m cu c0n5a5b5c2 irul mut(rilor celor n discuri de
pe ti6a a pe ti6a b5 utiliz3nd ca ti6a intermediar(5 ti6a c.
on#orm strategiei D.&.D" "' ./P"<, Bncerc(m s( descompunem problema Bn alte dou(
subprobleme de acelai tip5 urm3nd apoi combinarea soluiilor. Kn acest sens5 observ(m c( mutarea celor
n discuri de pe ti6a a pe ti6a b5 utiliz3nd ca ti6( intermediar( ti6a c5 este ec1ivalent( cu:
C mutarea a n81 discuri de pe ti6a a pe ti6a c5 utiliz3nd ca ti6( intermediar( ti6a bD
C mutarea discului r(mas pe ti6a bD
C mutarea a n81 discuri de pe ti6a c pe ti6a b5 utiliz3nd ca ti6( intermediar( ti6a a.
Parcurgerea celor trei etape permite de#inirea recursiv( a irului c0n5a5b5c2 ast#el:

>
=
=
1 2 5 5 5 1 0 5 25 5 5 5 1 0
1 5
2 5 5 5 0
n daca a b c n H ab b c a n H
n daca ab
c b a n H
"xemple:
Pentru nF- avem:
c0-5a5b5c2Fc015a5c5b25ab5c015c5b5a2Fac5ab5cb.
Pentru nF$ avem:
c0$5a5b5c2Fc0-5a5c5b25ab5c0-5c5b5a2F
$$
c015a5b5c25ac5c015b5c5a25ab5c015c5a5b25cb5c015a5b5c2Fab5ac5bc5ab5ca5ab.
program 1anoiD
var a5b5c:c1arD n:integerD
procedure 1an 0n:integerDa5b5c:c1ar2D
begin
i# nFl t1en Eriteln 0a5b2
else begin 1an0n8l5a5c5b2D Eriteln0a5b2D 1an0n8l5c5b5a2 end D
endD
begin Erite0`?F`2Dreadln0n2D a:F`a`D b:F`b`Dc:F`c`D 1an0n5a5b5c2
end.
Sortare rapid(
Fie vectorul a cu n componente numere Bntregi 0sau reale2. Se cere ca vectorul s( #ie sortat
cresc(tor.
Pentru rezolvare este necesar( o procedur( P;@ care trateaz( o poriune din vector cuprins( Bntre
indicii dai de li 0limita in#erioar(2 i ls 0limita superioar(2. <olul acestei proceduri este de a poziiona
prima component( aHliI pe o poziie O cuprinsa Bntre li i ls5 ast#el Bnc3t toate componentele vectorului
cuprinse Bntre li i O81 s( #ie mai mic sau egale dec3t aHOI si toate componentele vectorului cuprinse Bntre
1M1 i ls s( #ie mai mari sau egale dec3t aHOI.
Kn aceast( procedur( exist( dou( moduri de lucru:
a2 i r(m3ne constant5 6 scade cu 1D
b2 i creste cu 15 6 r(m3ne constant.
Procedura este conceput( ast#el:
C iniial5 i va lua valoarea li5 iar 6 va lua valoarea ls 0elementul care iniial se a#la pe poziia li se
va g(si mereu pe o poziie dat( de i sau de 62D
C se trece Bn modul de lucru a2D
C at3t timp c3t iP6 se execut(:
C dac( aHdI este strict mai mare dec3t aH6I5 atunci se inverseaz( cele dou( numere si se sc1imb(
modul de lucruD
C i i 6 se modi#ic( corespunz(tor modului de lucru Bn care se a#l( programul:
C O ia valoarea comun( a lui i i 6.
"xemplu: aF0!5+5$515-25 liF15 lsF5D modul de lucru a2D
C iF156F5D
C aH1IGaH5I5 deci se inverseaz( elementele a#late pe poziiile 1 si 55 deci aF0-5+5$515!2 i
programul trece la modul de lucru b2D
C iF-5 6F5D
C aH-IGaH5I5 deci aF0-5!5$515+2 i se revine la modul de lucru a2D
C 1F-5 6F4D
C aH-IGaH4I5 deci aF0-515$5!5+2D se trece la modul de lucru b2D
C iF$5 6F4:
C procedura se Bnc1eie5 elementul a#lat iniial pe poziia 1 se g(sete acum pe poziia 45 toate
elementele din st3nga lui #iind mai mici dec3t el5 totodat( toate elementele din dreapta lui #iind mai
mari dec3t el 0OF42.
$4
,lternana modurilor de lucru se explica prin #aptul c( elementul care trebuie poziional se compar(
cu un element a#lat Bn dreapta sau Bn st3nga lui5 ceea ce impune o modi#icare corespunz(toare a indicilor i i
6.
;bservaie. Dup( aplicarea procedurii P;@5 este evident c( elementul care se a#l( iniial Bn poziia li
va a6unge pe o poziie O i va r(m3ne pe acea poziie Bn cadrul vectorului de6a sortat5 #apt care reprezint(
esena algoritmului.
Procedura eA.W are parametrii li i ls 0limita in#erioar( i limita superioar(2. Kn cadrul ei se
utilizeaz( metoda D.&.D" "' ./P"<,5 dup( cum urmeaz(:
C se apeleaz( P;@D
C se apeleaz( eA.W pentru li i O81D
C se apeleaz( eA.W pentru OM1 i ls.
program fuicOlD
tVpe vectorFarraVH1..1))I o# integerD
var i5n5O:integerD
a:vectorD
procedure poz 0li5ls:integerDvar O:integerDvar a:vector2D
var i565c5i1561:integerD
begin
i1:F)D61:F81D i:FliD6:FlsD
E1ile iP6 do
begin i# aHiIGaH6I t1en begin
c:FaH6ID aH6I:FaHiID aHiI:FcD c:Fi1D i1:F861D 61:F8cD endD
i:FiMi1D 6:F6M61D endD
O:Fi D endD
procedure fuicO 0li5ls:integer2D
begin
i# liPls t1en begin poz0li5ls5O5a2D fuicO0li5O812D fuicO0OM15ls2 endD endD
begin
Erite0`nF`2Dreadln0n2D #or i:F1 to n do
begin Erite0`aH`5i5`IF`2D readln0aHiI2D endD
fuicO015n2D #or i:F1 to n do Eriteln 0aHiI2
end.
Sortare prin interclasare
Se consider( vectorul a cu n componente numere Bntregi 0sau reale2. S( sorteze cresc(tor5 utiliz3nd
sortarea prin interclasare.
Prezentam pe scurt problema interclas(rii a doi vectori.
Se dau doi vectori a si b cu m i n componente numere reale5 sortai cresc(tor 0descresc(tor2.
Pentru rezolvare5 simboliz(m cu i indicele elementului la care s8a a6uns Bn primul vector5 cu 6
indicele la care s8a a6uns Bn al doilea vector i cu O indicele elementului care urmeaz( a #i scris Bn cel de8al
treilea vector.
,t3t timp c3t i este mai mic sau egal cu m i 6 este mai mic sau egal cu n5 compar(m aHiI cu bH6I i Bn
#uncie de rezultat proced(m ast#el:
C dac( aHiIGbH6I5 atunci cHOI va lua valoarea lui aHiI5 iar valorile variabilelor i i O vor crete cu 1D
C alt#el5 cHOI va lua valoarea lui bH6I5 Bn timp ce valorile variabilelor 6 i O vor creste cu 1.
Dup( ce unul din cei doi vectori a #ost Bn totalitate parcurs i scris Bn c5 vectorul r(mas se va copia Bn c.
"xemplu: aF015$555+25 bF0-542:
$5
C iF156F15OF1D.
C aH1IPbH1I5 deci cH1IF15 iF-5 OF-D
C aH-IGbH1I5 deci cH-IF-5 6F-5 OF$D
aH-IPbH-I5 deci cH$IF$5 iF$5 OF4D
C aH$IGbH-I5 deci cH4IF45 6F$5 OF5D
C vectorul b a #ost trecut Bn c Bn Bntregime5 Bn continuare urm3nd a se copia ceea ce a r(mas neparcurs
din vectorul a Bn vectorul . cH5IF55 cH!IF+.
Propunem ca exerciiu scrierea acestui program.
Kn cele ce urmeaz( vom utiliza algoritmul de interclasare Bn vederea sort(rii
unui vector prin interclasare.
;bservaie:
C un vector cu o singur( component( este un vector sortatD
C pentru a sorta 0cresc(tor2 un vector cu dou( componente5 acestea se compara Bntre ele i5 daca
prima este mai mare dec3t cea de8a doua5 locurile lor se inverseaz(.
,lgoritmul de sortare prin interclasare se bazeaz( pe urm(toarea idee:
pentru a sorta un vector cu n elemente Bl Bmp(rim Bn doi vectori care5 odat( sortai5 se interclaseaz(.
on#orm strategiei generale D.&.D" "' ./P"<.,5 problema este descompus( Bn alte dou( subprobleme
de acelai tip i5 dup( rezolvarea lor5 rezultatele se combin( 0Bn particular se interclaseaz(2. Descompunerea
unui vector Bn ali doi vectori care urmeaz( a #i sortai are loc p3n( c3nd avem de sortat vectori de una sau
dou( componente Bn aplicaie5 procedura S;<' sorteaz( un vector de maxim dou( elementeD
.?'"< interclaseaz( rezultateleD D.&./P implementeaz( strategia general( a metodei studiate.
program sinterD
tVpe vectorFarraV H1..1)I o# integerD
var a:vectorD n5i:integerD
procedure sort 0p5f:integerDvar a:vector2D
var m:integerD
begin
i# aHpIGaHfI t1en begin m:FaHpID aHpI:FaHfID aHfI:Fm endD endD
procedure interc 0p5f5m:integerDvar a:vector2D
var b:vectorD
i565O:integerD
begin
i:FpD 6:FmM1D O:F1D
E1ile 0iPFm2 and 06PFf2 do
i# aHiIPFaH6I t1en begin bHOI:FaHiID i:FiM1D O:FOM1 end
else begin bHOI:FaH6ID 6:F6M1D O:FOM1 endD
$!
i# iPFm t1en #or 6:Fi to f do begin bHOI:FaH6ID O:FOM1 end
else #or i:F6 to f do begin bHOI:FaHiID O:FOM1 endD
O:F1D #or i:Fp to f do begin aHiI:FbHOID O:FOM1 endD endD
procedure divimp 0p5f:integerDvar a:vector2D
var m:integerD
begin
i# 0f8p2PF1 t1en sort0p5f5a2 else begin m:F0pMf2 div -D divimp 0p5m5a2D divimp0mM15f5a2D
interc0p5f5m5a2D end D endD
begin Erite0`nF`2Dreadln0n2D
#or i:F1 to n do begin Erite0`aH`5i5`IF`2D readln0aHiI2 endD divimp015n5a2D
#or i:F1 to n do Eriteln 0aHiI2D
end.
Problema t(ieturilor
Se d( o bucat( dreptung1iular( de tabl( cu lungimea . i Bn(limea 15 av3nd pe supra#aa ei n g(uri
de coordonare numere Bntregi. Se cere sa se decupeze din ea o bucat( de arie maxim( care nu prezint(
g(uri. Sunt permise numai t(ieturi verticale i orizontale.
oordonatele g(urilor sunt reinute Bn doi vectori 7& si [&. Dreptung1iul iniial5 precum i
dreptung1iurile care apar Bn procesul t(ierii sunt memorate Bn program prin coordonatele colului din
st3nga8sus 075[25 prin lungime l Bn(lime 0*5c2. Pentru un dreptung1i 0iniial pornim cu toat( bucata de
tabl(25 veri#ic(m dac( avem sau nu o gaur( Bn el 0se caut( practic prima din cele n g(uri2. Kn situaia c3nd
acesta prezint( o gaur(5 problema se descompune Bn alte patru probleme de acelai tip. Dac( bucata nu
prezint( g(uri5 se compar( arta ei cu aria unei alte buc(i #(r( gaur(5 g(sit( Bn #azele precedente. /enion(m
c( dreptung1iul de arie maxim( #(r( g(uri este reinut prin aceiai parametri ca i dreptung1iul cu g(uri. Kn
zonele 7F5 [F5 *F5 cF 0variabile transmise prin re#erin( de la o #az( la alta2. Kn concluzie5 problema
iniial( am descompus8o Bn alte patru probleme de acelai tip5 mai uoare5 Bntruc3t #iecare nou dreptung1i
are cel mult n81 g(uri5 dac( dreptung1iul iniial avea n g(uri. *a aceast( problem( compararea soluiilor
const( Bn a reine dreptung1iul cu aria maxim( dintre cele #(r( g(uri. Fie dreptung1iul cu o gaur(:
Pentru a se a#la Bn interiorul dreptung1iului5 gaura trebuie sa Bndeplineasc( simultan condiiile:
12 xv0i2Gx:
-2 xv0i2PxMlD
$2 Vv0i2GV:
42 Vv0t2PVM1.
Dac( #acem o t(ietur( vertical( prin aceast( gaur(5 obinem dou( dreptung1iuri:
12 x5 V5 xv0i28x5 1D C .
-2 xv0i25 V5 lMx8xv0i25 1.
Kn urma unei t(ieturi pe orizontal( se obin cele dou( dreptung1iuri:
12 x5 V 5t 5Vv0i28VD
-2 x5 Vv0i25 .5 1MV8Vv0i2.
$%
program taiD
tVpe vectFarraV H1..+I o# integerD
var l515i5n5x#5V#5l#51#:integerD
xv5Vv:vectD
procedure dimp 0x5V5l51:integerDvar x#5V#5l#51#:integerD
var xv5Vv:vect2D
var gasit:booleanD i:integerD
begin
i:FlD gasit:F#alseD
E1ile 0iPFn2 and 0not gasit2 do
i# 0xvHiIGx2 and 0xvHiIPl2 and 0VvHiIGV2 and 0VvHiIPVM12 t1en gasit:Ftrue
else i:FiM1D i# gasit t1en begin
dimp0x5V5xvHiI8x515x#5V#5l#51#5xv5Vv2D
dimp0xvHiI 5V5lMx8xvHiI 515x#5V#5l#51#5xv5Vv2D
dimp0x5V5l5VvHiI8V5x#5V#5l#51#5xv5Vv2D
dimp0x5VvHiI5l51MV8VvHiI5x#5V#5l#51#5xv5Vv2D end
else i# 0lQ12G0l#Q1#2 t1en begin x#:FxD V#:FVD l#:FlD1#:F1 endD endD
begin
Erite0`nF`2D readln0n2D
#or i:F1 to n do begin Erite0`xH`5i5`IF`2Dreadln0xvHiI2D Erite0`VH`5i5`IF`2Dreadln0VvHiI2D endD
Erite0`lF`2Dreadln0l2D Erite 0`1F`2 D readln012D
l#:F)D 1#:F)D dimp0)5)5l515x#5V#5l#51#5xv5Vv2D
Eriteln0`xF`5x#5` VF`5V#5` lF`5l#5` 1F`51#2 end.
Probleme propuse
12 Scriei un program Bn care calculatorul sa g1iceasc( un num(r natural ascuns de dumneavoastr(
0num(rul este cuprins Bntre 1 si $))))2. ,tunci c3nd calculatorul propune un num(r i se va r(spunde prin:
15 dac( num(rul este prea mareD
-5 dac( num(rul este prea micD
)5 dac( num(rul a #ost g1icit.
-2 Se consider( un vector cu o componente5 numere naturale. De#inim plierea vectorului 5ca #iind
suprapunerea unei 6um(t(i5 numit( donatoare5 peste o alta5 numit( receptoare. Kn cazul Bn care vectorul are
un num(r impar de componente5 cea din mi6loc este eliminata. .n acest #el se a6unge la un vector ale c(rui
elemente au numerotarea 6um(t(ii receptoare. "xemplu: vectorul 15-5$5455 se poate plia Bn dou( moduri 15-
si 455. Plierea se aplic( Bn mod repetat p3n( se a6unge la un vector cu o singur( component(5 iar coninutul
ei se numete element #inal. S( se precizeze care sunt elementele #inale i care este irul de plieri prin care
se poate a6unge la ele. ;.?... 1++- 0enun modi#icat2.
$2 Se da un vector cu n componente la Bnceput nule. ; seciune pe poziia W va incrementa toate
elementele a#late Bntre o alt( zon( de secionare anterioara i W. "xemplu:
))))))) se secioneaz( pe poziia 4:
1111))) se secioneaz( pe poziia 1D
-111))) se secioneaz( pe poziia $D
---1))) etc.
Sa se determine o ordine de secionare a unui vector cu n elemente ast#el Bnc3t suma elementelor
sale s( #ie S. Se citesc ? i S.
$8
'e1nica 4reedV
Prezentare general(
u toate c( este practic imposibil s( #ie dat( #orma general( a unei probleme rezolvabil( cu te1nica
4reedV5 vom Bncerca totui.
S( consider(m o mulime , cu n elemente. Se cere o submulime a sa cu m elemente 0Bn cazul mFn este
important( ordinea alegerii elementelor25 ast#el Bnc3t s( #ie Bndeplinite anumite condiii 0acestea di#er( de la
o problem( la alta2.
"xemplu: se consider( o mulime de n numere reale. Se cere o submulime a sa5 ast#el Bnc3t suma
elementelor sale s( #ie maxim(.
Pentru rezolvare5 vom alege un prim element al mulimii de numere reale. Dac( este posibil5 acesta va #i
ad(ugat soluiei5 iniial vide. Posibilitatea ca acesta s( #ie ad(ugat este dat( de semnul num(rului 0acesta
trebuie s( #ie mai mare ca ;2. Se alege un al doilea num(r5 cu care se procedeaz( Bn mod asem(n(tor.
,lgoritmul se Bnc1eie c3nd au #ost alese l eventual ad(ugate toate elementele mulimii.
Pentru a rezolva o problem( cu 4reedV5 soluia se construiete5 dup( regula:
Pentru #iecare element care urmeaz( s( #ie ad(ugat soluiei #inale5 se e#ectueaz( o alegere a sa din
elementele mulimii , 0dup( un mecanism speci#ic #iec(rei probleme Bn parte25 iar dac( este posibil5 acesta
este ad(ugat. ,lgoritmul se termin( #ie c3nd a #ost g(sit( soluia cerut(5 #ie c3nd s8a constatat inexistena
acesteia.
.ntuitiv5 alegem un element5 al doilea5....p3n( c3nd obinem ce dorim sau p3n( c3nd au #ost testate toate
elementele mulimii. De aici provine si numele metodei 0greedVFlacom2.
4reedV pare at3t de simpl( Bnc3t5 la Bnceput5 ne mir( #aptul c( a #ost evideniat( ca te1nic(. *a o analiz(
atent(5 vom observa c( lucrurile nu stau c1iar aa. "xemplul prezentat este didactic 0Bl rezolvam i #(r( s(
tim c( exist( aceast( te1nic(25 el nu are alt rol dec3t de a evidenia caracteristicile te1nicii.
Tehnica Greedy poate fi privita ca o particularizare a tehnicii Backtracking, n care se renuna la
mecanismul de !ntoarcere.
S( analiz(m Bn paralel5 cele dou( te1nici5 pentru a putea stabili asem(n(rile i di#erenele existente Bntre
ele:
"# ambele te1nici o#er( soluii sub #orm( de vectorD
"# te1nica >acOtracOing poate o#eri toate soluiile problemei5 Bn timp ce
te1nica 4reedV o#er( o singur( soluie FG te1nica 4reedV nu dispune de mecanismul Bntoarcerii5
speci#ic te1nicii bacOtracOing. :
,ceasta este di#erena esenial( dintre cele doua te1nici5 di#eren( care are consecine uriae Bn ce privete
aplicabilitatea lor.
onsecina 1.
$ste necesar ca cel care elaboreaz% un algoritm Greedy s% &tie faptul ca, proced'nd n modul ales de el,
a(unge la rezultatul dorit. )entru fiecare problem% n parte, dup% ce se identifica un algoritm, este
$+
obligatoriu s% se demonstreze c% acesta conduce la soluia optima. *emonstraia faptului ca se a(unge la
soluia optim% este specific% fiec%rei probleme n parte.
onsecina -. Tehnica Greedy conduce la timp de calcul polinomial.
/otivul care conduce la acest timp de calcul5 tine de mecanismul te1nicii. S( presupunem c( mulimea din
care se #ace alegerea are n elemente si c( soluia are tot n elemente 0caz maxim2. Se #ac n alegeri5 la #iecare
alegere se #ac n teste5 rezulta un algoritm cu timp ;0n
-
2.
De multe ori5 este necesar ca elementele mulimii. , s( #ie sortate5 pentru ca apoi s( alegem din acestea5
iar sortarea necesita un timp minim ;0n x log-n2. .ns( sortarea se e#ectueaz( la Bnceput. Prin urmare5 acest
timp se adun(5 deci nu in#lueneaz( rezultatul.
) Bntrebare #ireasc(: fiind dat% o problem%, e+ist% ntotdeauna un algoritm de tip Greedy care g%se&te
soluia optim%, "vident5 ?A. "xist( probleme pentru care nu se cunosc ast#el de algoritmi. /ai mult5
pentru cele mai multe probleme nu se cunosc algoritmi 4reedV.
,vanta6ul timpului polinomial5 conduce la necesitatea utiliz(rii te1nicii 4reedV. Din alt punct de vedere5 nu
tuturor problemelor li se pot aplica algoritmi de acest tip. e este de #(cutL
FG )entru problemele pentru care nu se cunosc algoritmi care necesit% timp polinomial, se caut% soluii,
chiar dac% nu obine, dar apropiate de acestea, dar care au fost obinute n timp util. -ulte din aceste
soluii sunt obinute cu Greedy.
,st#el de algoritmi se numesc algoritmi euristici.
Kn continuare5 vom da mai multe exemple de probleme care se rezolv( cu 4reedV.
Probleme pentru care 4reedV obine soluia optim(
Problema spectacolelor.
!ntr.o sal%, ntr.o zi, trebuie planificate n spectacole. )entru fiecare spectacol se cunoa&te intervalul n
care se desf%&oar%/ 0st, sf1. 2e cere s% se planifice un num%r ma+im de spectacole astfel nc't sa nu se
suprapun%.
<ezolvare.
Fie o plani#icare optim( a spectacolelor 0un num(r maxim O de spectacole i15 i-...iO. unde i15 i-5... iO
aparine ]15-5...? S i spectacolul i65 are loc Bnaintea spectacolului i6M1. ; ast#el de plani#icare Bndeplinete
condiia: spectacolul i6M1 Bncepe dup( terminarea spectacolului i6.
FG ) consecin( imediat( a condiiei de mai sus este: spectacolul i5 ia s#3rit Bnaintea termin(rii
spectacolului t6M1 0consecina nu implica un e#ort de g3ndire deosebit2.
&om construi o soluie dup( urm(torul algoritm:
P1 sort(m spectacolele dup( ora termin(rii lorD
P- primul spectacol programat este cel care se termin( cel mai devremeD
P$ alegem primul spectacol dintre cele care urmeaz( Bn sir ultimului spectacol programat care Bndeplinete
condiia c( Bncepe dup( ce s8a terminat ultimul spectacol programatD
P4 dac( tentativa de mai sus a euat 0nu am g(sit un ast#el de spectacol2 algoritmul se termin(5 alt#el se
programeaz( spectacolul g(sit i algoritmul se reia de la pasul $.
4)
*em(. 3lgoritmul de mai sus conduce la soluie optim% 0num(r maxim de spectacole programate2.
Demonstraie. Fie s15 s-5...si spectacolele ordonate ca mai sus si o soluie optim( i15 i-5 R5 iO.
FG Dac( lFO rezult( c( solutia g(sit( este optim( f.e.d. FG Daca lGO rezult( ca soluia i15 i-5... iO5 nu este
optim( 0se contrazice ipoteza2D
FG Dac( lPO proced(m ca mai 6os.
Presupunem c( i1 di#erit s1. .n acest caz putem Bnlocui i15 0Bn cadrul soluiei optime2 cu s15 0s1 este primul
spectacol care se termina si daca ar #igura pe alt( poziie Bn cadrul soluiei optime5 se contrazice ipoteza25 .n
concluzie5 solutia
s15 i-5... iO, r(m3ne optim(.
Fie t mai mic sau egal l primul indice pentru care si diferit it. Soluia s15 s-5...st8i it... este optim(. Knlocuim
it cu st. Knlocuirea este posibil( pentru c(:
FG st5 nu #igureaz( in cadrul soluiei optime Bntre primele t81 componenteD
FG st5 nu #igureaz( Bntre ultimile poziii ale soluiei optime 0Bncep3nd de la poziia tM12 pentru c( in acest
caz Bnseamn( c( st Bncepe dup( terminarea lui it5 caz in care se contrazice modul Bn care a #ost obinut de
algoritm alegerea lui st.
Proced3nd ast#el5 la un moment dat soluia optima este de #orma: s15 s-5...
si..iO.
,ceasta Bnseamn( c( dup( si a mai #ost posibil sa ad(ug(m alte
spectacole. Se contrazice modul de obinere al soluiei de c(tre algoritm
0acesta se oprete atunci c3nd nu se mai poate programa nici un spectacol2
De aici5 rezult( OFl si c( algoritmul obine soluia optim( f.e.d.
,cest program se Bncadreaz( in te1nica 4reedV pentru c(: la un pas se alege un spectacol 0cu ora de
terminare mai mare dec3t ora de terminare a ultimului spectacol programat iar dac( este posibil 0dac( are
ora de Bnceput dup( ora de s#3rit a ultimului spectacol programat2 este ad(ugat soluiei. ;dat( ad(ugat
0programat2 un spectacol5 acesta r(m3ne in cadrul soluiei.
program SP"'D
tVpe spectacolFarraVH1..-51..1)I o# integerD
ordineFarraVH1..1)I o# integerD
var s:spectacolD o:ordineD n5i5115m151-5m-:integerD
procedure sortareD
var gata:booleanD m5i :integerD
begin repeat gata:FtrueD
#or i:F1 to n81 do i# sH-5oHiIIGsH-5oHiM1II t1en begin m:FoHiID
oHiI:FoHiM1ID oHiM1I:FmD gata:F#alse end until gataD endD
begin Erite 0`nF`2 D readln 0n2D
#or i:F1 to n do begin oHiI:FiD Erite0`ora de inceput pentru .spectacolul `5i5 ` 011 min2F`2 D
readln0115m12D sH15iI :F11Q!)Mm1D Erite0`ora de s#irsit pentru spectacolul `5 i 5 ` 011 min F`2 D
41
readln01-5m-2D sH-5iI:F1-Q!)Mm-D endD
sortareD ] 4reedV S Eriteln0`ordinea spectacolelor este`2D
Eriteln0oH i I 2 D #or i:F- to n do i# sH15oHiIIGFsH-5oHi81II t1en Eriteln 0oHiI2D end.
Problema rucsacului
4 persoan% are un rucsac cu care poate transporta o greutate ma+im% G. )ersoana are la dispoziie n
obiecte si cunoa&te pentru fiecare obiect greutatea si c'&tigul care se obine n urma transportului s%u la
destinaie. 2e cere s% se precizeze ce obiecte trebuie s% transporte persoana n a&a fel nc't c'&tigul sa fie
ma+im.
; precizare Bn plus trans#orm( aceast( problema Bn alte dou( probleme distincte. ,ceast( precizare se
re#er( la #aptul c( obiectele pot #i sau nu t(iate pentru transportul la destinaie. .n prima situaie5 problema
poart( numele de problema continu% a rucsacului, iar Bn a doua avem problema discreta a rucsacului.
,ceste dou( probleme se rezolv( di#erit5 motiv pentru care ele sunt prezentate separat. &arianta continu( a
problemei rucsacului este tratat( Bn acest paragra# iar cea discret( va #i tratat( cu a6utorul program(rii
dinamice.
)roblema continu% a rucsacului, n care persoana are posibilitatea s% taie obiectele. Kn acest #el5 se poate
obine o Bnc(rcare mai e#icient( a rucsacului.
,lgoritmul este urm(torul:
C se calculeaz(5 pentru #iecare obiect Bn parte5 e#iciena de transport rezultat( prin Bmp(rirea c3tigului la
greutate 0de #apt5 acesta reprezint( c3tigul obtinut prin transportul unit(ii de greutate2D
C obiectele se sorteaz( Bn ordine descresc(toare a e#icienei de transport si se preiau Bn calcul Bn aceast(
ordineD
C c3tigul iniial va #i )5 iar greutatea r(mas( de Bnc(rcat va #i greutatea rucsaculuiD
C at3t timp c3t nu a #ost completat( greutatea maxim( a rucsacului si nu au #ost luate in considerare toate
obiectele5 se procedeaz( ast#el:
C dintre obiectele neBnc(rcate se selecteaz( acela cu cea mai ridicat( e#icien( de transport i avem dou(
posibilit(i:
C acesta Bncape Bn totalitate Bn rucsac5 deci se scade din greutatea r(mas( de Bnc(rcat greutatea obiectului5 la
c3tig se cumuleaz( c3tigul datorat transportului acestui obiectD se tip(rete 15 Bn sensul c( Bntregul
obiect a #ost Bnc(rcatD
C obiectul nu Bncape Bn totalitate Bn rucsac5 caz Bn care se calculeaz( ce parte din el poate #i transportat(5 se
cumuleaz( c3tigul obinut cu transportul acestei p(ri din obiect5 se tip(rete procentul care s8a
Bnc(rcat din obiect5 iar greutatea r(mas( de Bnc(rcat devine ).
Demonstraia este asem(n(toare celei de la problema anterioar( i o propunem ca tem(.
&om considera un exemplu numeric.
4reutatea care poate #i transportat( cu a6utorul rucsacului aste $
,vem la dispoziie $ obiecte. 4reutatea i c3tigul pentru #iecare obiect sunt prezentate mai 6os/
4-
"#iciena de transport este 1 pentru primul obiect5 4 pentru al doilea si - pentru al treilea.
.n concluzie5 obiectul - se Bncarc( Bn Bntregime Bn rucsac5 obin3nd un c3tig de 4 i r(m3ne o capacitate de
transport de dou( unit(i de greutate.
Se Bncarc( -N$ din obiectul $ 0care este al doilea Bn ordinea e#icienei de transport2 pentru care se obine
c3tigul 4. 3tigul obinut Bn total este 8. Se remarca strategia 4<""D[ prin alegerea obiectului care va #i
transportat5 alegere asupra c(reia nu se revine.
program rucsacD
tVpe vectorFarraV H1..+I o# realD
var c5g5e#:vectorD n5i5man1:integerD gv5man5castig:realD inv:booleanD ordine:arraV H1..+I o# integerD
begin Erite0`4reutatea ce poate #i transportataF`2D
readln0gv2D Erite0`?umar de obiecteF`2D readln0n2D
#or i:F1 to n do begin Erite0`cH`5i5`IF`2D readln0cHiI2D Erite0`gH`5i5`IF`2D readln0gHiI2D
ordineHiI:FiD e#HiI:FcHiINgHiI endD
repeat
inv:F#alseD #or i:F1 to n81 do i# e#HiIPe#HiM1I t1en begin man:Fe#HiID e#HiI:Fe#HiM1ID e#HiM1I:FmanD
man:FcHiID cHiI:FcHiM1ID cHiM1I :FmanD man:Fg H i ID gHiI:FgHiM1ID gHiM1I:FmanD inv:FtrueD
man1:FordineHiID ordineHiI:FordineHiM1ID ordineHiM1I:Fman1 end until not invD castig:F)D i:F1D
E1ile 0gvG)2 and 0iPFn2 do begin i# gvGgHiI t1en begin Eriteln0`;biectul `5ordineHiI5` `5 12D gv:Fgv8gHiID
castig:FcastigMcHiI end else begin Eriteln0`;biectul `5ordineHiI5` `5gvNgHiI:1:-2D
castig:FcastigMcHiIQgvNgHiID gv:F)D endD
i:FiM1D endD Eriteln0`astig totalF`5castig:$:-2D end.
Problema /axim 0maximizarea valorilor unei expresii2.
2e dau n numere ntregi nenule b5, b6, .... bn si m numere ntregi nenule a5,. a6, .... am. 2% se determine o
submulime a mulimii B"7b5, b6, .... bn8 care s% ma+imizeze valoare e+presiei/
" F a1x1Ma- x- M ... M amxm5 &tiind c% n mai mare sau egal ca m &i c% +l aparine 7b55b6, ... bn8.
<ezolvare.
&om sorta cresc(tor cele dou( mulimi de numere Bntregi , si >. )entru nceput, vom considera m"n.
4$
*em(. Kn aceste condiii 0elementele celor dou( mulimi #iind sortate2 suma maxim( este "Fa1b-Ma-b-M...
Mambm.
Demonstraie.
; posibilitate de cuplare poate #i scris( sub #orm( de permutare. Fie
permutarea:
unde i15 i-5... im sunt tot numerele 15 -5R5 m5 luate
Bn alt( ordine. Pentru permutarea considerat( suma va #i:
&om ar(ta5 c( dintre toate permut(rile5 permutarea identica este cea care maximizeaz( suma 0,tenieJ
?umerele sunt sortate b1Pb-...Pbm caz Bn care permut(rii identice Bi corespunde irul b15 b-5...bm2.
Fie o permutare oarecare. di#erit( de cea identica. Privim permutarea ca un ir de numere naturale. Da
exemplu5 permutarea
o privim ca pe un sir de 5 numere naturale: $5 15 -5 55 4. Sortam cresc(tor sirul5 rein3nd in acelai timp
rezultatele pariale:
,st#el5 obinem:
"vident5 cu orice permutare a mulimii primelor m numere naturale5 putem proceda asem(n(tor. Se obine
ast#el un sir de permut(ri5 ir caracterizat de #aptul c( ultimul s(u element este permutarea identica:
QQQQQQQQQQQQQQQQQQFe 0prin e am notat permutarea identic(. Pe de alt( parte dac( Q si QQQ sunt dou(
permut(ri vecine din sir5 ele o#er( printr8o singur( inversare de elemente 0corect inversiune2.
Fie QQQQ si QQQQ sumele asociate celor dou( permut(ri5 ,vem QQQQQQQQQQQQQQQQ ele dou( sume sunt
identice5 excepie #(c3nd doi termeni 0cei care au #ost inversai c3nd s8a obinut permutarea2.
Dup( simpli#ic(ri5 r(m3ne:
aObOMaOM1bOM1PaOblM1MaOM1bl5MaOM1bl5 unde blGbiM15 aOPaOM1 inegalitatea se trans#orm( Bn:
aO0bl8blM128aOM10bl8blM12P)D i apoi Bn 0aO8aOM120bl8blM12P)5 inegalitate evident(. <econsider3nd sumele
avem:
QQQQQQQQQQQQQQQQQQQQQQ f.e.d.
"xemplu nF$5 mF$5
44
a5"9, a6".:, a$F-D
b1F815 b-F-5 b$F8$.
Sort(m a si b i obinem Bn urma sort(rii:
a1F855 a-F-. a$F%D
b1F8$5 b-F815 b$F-D
"maxF85x08$2M-x0812M%x-F-%. Prob(. Scriem b Bn celelalte moduri cu putin(:
815 -5 8$ FG "F85x0812M-x0-2M%x08$2F81-P-%D
-5 815 8$ FG "F85x-M-x0812M%x08$2F8$$P-%D
-5 8$5 81 FG "F85x-M-x08$2M%x0812F8-$P-%D
815 8$5 - FG "F85x0812M-x08$2M%x-F-$P-%D
8$5 -5 81 FG "F85x08$2M-x-M%x0812F1-P-%.
'recem la cazul general5 nGm.
Sort(m elementele celor dou( mulimi.
12 2% presupunem c% elementele mulimii 3 sunt numere ntregi pozitive ;naturale). onsider(m elementele
ordonate ale mulimii > ca un sir de numere Bntregi Bn secven( strict cresc(toare. Din start5 trebuie selectat
un subir de m elemente. on#orm rezultatului obtinut anterior5 subirul trebuie s( #ie strict cresc(tor
0 contrar5 prin sortarea sa am obine un rezultat mai bun2. um elementele mulimii > sunt ordonate
cresc(tor5 r(m3ne condiia ca alegerea s( #ie un subir cu m componente. "vident5 putem alege mai multe
subiruri care Bndeplinesc condiia ceruta. Din ipotez(5 elementele mulimii ,5 ordonate sunt pozitive. Dup(
cum se tie5 produsul unui num(r natural5 cu un num(r Bntreg este cu at3t mai mare5 cu c3t acesta din urm(
este mai mare. Kn aceste condiii5 subirul ales va #i alc(tuit din ultimele m elemente ale &irului de n
elemente ale mulimii B, ordonate cresc(tor.
-2 S( presupunem c( elementele mulimii 3 sunt negative. Produsul dintre un num(r negativ i altul5 este cu
at3t mai mare5 cu c3t acesta din urm( este mai mic. Prin urmare5 sub&irul ales este sub&irul format din
primele m elemente ale &irului B.
$2 Bn cazul general5 c3nd mulimea , are O elemente negative i p elemente pozitive 0OMpFm2 vom alege
primele O elemente ale subirului , si ultimele p elemente ale subirului >.
"xemplu:
a1F8$5 a-F815 a$F-D
b1F15 b-F-. b$F$5 b4F4D
"maxF 8$x1M0812x-M-x4F$.
,lte posibilit(i:
"F8$x1M0812x-M-x$F1P$D
"F8$x-M0812x$M-x4F81P$D
"F8$x1M0812x$M-x4F-P$.
on#orm algoritmului propus5 prezent(m programul de mai 6os:
program .oan/aximD
tVpe vectorFarraVH1..+I o# integerD
var a5b:vectorD
45
m5n5i5ind5/axim:integerD
procedure sortare0var v:vectorD n:integer2D
var gata:booleanD i5m:integerD
begin repeat gata:FtrueD #or i:F1 to n81 do i# vHiIGvHiM1I t1en begin m:FvHiID
vHiI:FvHiM1ID vHiM1I:FmD gata:F#alse end until gataD
endD
begin Erite0`mF`2D readln0m2D
#or i:F1 to m do begin Erite 0` a H`5 i5`IF`2D readln 0a Hi I 2D endD
Erite 0`nF`2 D readln0n2D #or i:F1 to n do begin Erite0`bH`5i5`IF`2D readln0bHiI2D endD
sortare0a5m2D sortare0b5n2D ind:F)D
E1ile aHindM1IP) do ind:FindM1D ]4reedVS
/axim:F)D #or i:F1 to ind do begin Eriteln 0aHiI5`Q`5bHiI2D /axim:F/aximMaHiIQbHiID endD
#or i:FindM1 to m do begin Eriteln0aHiI5`Q`5bHn8mMiI2D /axim:F/aximMaHiIQbHn8mMiID endD
Eriteln0 `/aximF` 5/axim2 D end.
"#iciena algoritmului 4reedV este evident(. Prima idee ar #i #ost s( select(m toate submulimile de m
elemente ale mulimii de n elemente i pe acestea s( le permut(m5 rein3nd valoarea maxim(. .n acest #el5
aveam de probat 3< mulimi. Pentru aceast( problem( mecanismul de alegere a #ost prezentat si orice
element ales este si posibil de ad(ugat.
Probleme la care 4reedV nu conduce la soluia optim(
,m ar(tat #aptul c( exist( probleme pentru care nu se cunosc algoritmi care s( conduc( in timp
polinomial la soluia optim(. .n ast#el de cazuri se renun( la optimalitate5 se caut( soluii apropiate de cea
optim( dar care s( #ie obinute Bn timp util 0polinominal2. De multe ori5 pentru obinerea lor se #olosete
te1nica 4reedV. "vident5 Bn ast#el de cazuri nu se mai pune problema unei demonstraii. De reinut #aptul c(
exist( i alte metode care g(sesc ast#el de soluii.
Problema color(rii 1(rilor.
= 'ri sunt date preciz'ndu.se relaiile de vecin%tate. 2e cere s% se determine o posibilitate de colorare a
h%rii ;cu cele n 'ri), astfel nc't s% nu e+iste %ri vecine colorate la fel.
Se tie #aptul ca pentru colorarea unei 1(ri sunt necesare cel mult 4 culori. Problema ar #i putut cere
colorarea 1(rii utiliz3nd un num(r minim de culori. Din p(cate nu se cunosc algoritmi polinomiali care s(
poat( colora o 1art( prin utilizarea a numai 4 culori. 'otui5 colorarea 1(rilor este o problem( real(.
Presupun3nd un num(r mare de (ri suntem obligai s( #olosim o metod( euristic(5 Bn care sa obinem o
colorare admisibil(5 c1iar dac( nu utilizeaz( un num(r minim de culori 0poate c1iar mai mare dec3t 42
4!
,lgoritmul propus este urm(torul:
.ara 5 va avea culoarea 5>
.presupunem colorate primele i81 tari/
ara i va fi colorat% cu cea mai mic% culoare, cu un num%r ata&at mai mare sau egal cu 5, astfel nc't
nici una din %rile vecine s% nu fie colorat% la fel.
program colorareD
var a:arraVH1..5)51..5)I o# integerD
c:arraVH1..5)I o# integerD
n5i565cl:integerD gasit:booleanD begin Erite 0 `nurnar tari: `2D readln 0n2D
#or i:F1 to n do #or 6:F1 to i81 do begin Erite0`aH`5i5`5`565`IF`2D
readln0aHi56I2D
aH65iI:FaHi56I endD
cH1I:F1D #or i:F- to n do begin cl:F1D
repeat gasit:F#alseD
#or 6:F1 to i81 do i# 0aHi56IF12 and 0clFcH6I2 t1en gasit:FtrueD
i# not gasit t1en cHiI:Fcl else cl:FclM1D
until not gasitD
endD
#or i:F1 to n do Eriteln 0`tara `5i5` culoarea `5cHiI2D
end.
S(ritura calului
Problema5 este binecunoscut(5 nu o mai enun(m aici. ,m v(zut ca pentru o valoare a lui n5 nu #oarte
mare 0de exemplu 82 timpul de calcul este #oarte mare. Kn acest paragra# vom propune o rezolvare 4reedV5
cu rezultate excelente 0care circul( Bntre rezolvitori2. Kntruc3t nu cunosc demonstraia 0presupun3nd c( ar
exista25 am introdus aceasta problem( la 4reedV euristic.
Kn ce const( algoritmulL
?alul porne&te din poziia 5,5. @a fiecare pas alegem acea mutare care plaseaz% calul ntr.o pozitie din
care la urm%toarea mutare, avem c't mai puine posibilit%i de a muta din nou.
; explicaie 0nu demonstraie2 ar putea #i urm(toarea: calul ocup( poziii c3t mai puin accesibile 0care cu
alt( ocazie ar #i greu de atins2.
Principiul este extrem de interesant i merit( Bncercat i pentru alte probleme.
program calD
tVpe tablaFarraVH81..-5581..-5I o# integerD
var t:tablaD
i565n5min5nr5nr15l5c5l15c1:integerD
procedure poz0l5c:integerD var nr:integer2D
4%
begin
nr:F)D
i# tHl815cM-IF) t1en nr :FnrM1D
i# tHlM15cM-IF) t1en nr :FnrM1D
i# tHlM-5cM1IF) t1en nr :FnrM1D
i# tHlM-5c81IF) t1en nr :FnrM1D
i# tHlM15c8-IF) t1en nr :FnrM1D
i# tHl815c8-IF) t1en nr :FnrM1D
i# tHl8-5c81IF) t1en nr :FnrM1D
i# tHl8-5cM1IF) t1en nr :FnrM1D endD
begin
Erite 0`nF`2D readln0n2 D #or i:F1 to n do #or 6:F1 to n do tHi56I:F)D
#or i:F) to nM1 do begin tH)5iI:F1D tH815iI:F1D tHnM15iI:F1D tHnM-5iI:F1D
tHi5)I:F1D tHi581I:F1D tHi5nM1I:F1D tHi5nM-I:F1D endD
l:FlD c:FlD tHl5cI:F1D
repeat
min:F+D Eriteln0l5 ` ` 5c2D nr1:Fnr1M1D i# tHl815cM-IF) t1en
begin poz0l815cM-5nr2D
i# minGnr t1en begin l1:Fl81D c1:FcM-D min:Fnr endD
endD
i# tHiMl5cM-IF) t1en begin poz0iMl5cM-5nr2D
i# minGnr t1en begin l1:FlM1D
c1:FcM-D min:Fnr endD endD
i# tHlM-5cM1IF) t1en begin poz0lM-5cM15nr2D
i# minGnr t1en begin l1:FlM-D c1:FcM1D min:Fnr endD endD
i# tHlM-5c81IF) t1en begin poz0lM-5c815nr2D
i# minGnr t1en begin l1:FlM-D c1:Fc81D min:FnrD endD
endD
i# tHlM15c8-IF) t1en begin poz0lM15c8-5nr2D
48
i# minGnr t1en begin l1:FlM1D c1:Fc8-D min:FnrD endD
endD
i# tHl815c8-IF) t1en begin poz0l815c8-5nr2D
i# minGnr t1en begin l1:Fl81D c1:Fc8-D min:Fnr endD endD
i# tHl8-5c81IF) t1en begin poz0l8-5c815nr2D
i# minGnr t1en begin l1:Fl8-D c1:Fc81D min:FnrD endD
endD
i# tHl8-5cM1IF) t1en begin poz0l8-5cM15nr2 D
i# minGnr t1en begin l1:Fl8-D c1:FcM1D min:Fnr endD endD
l:Fl1D c:Fc1D tHl5cI:F1D
until minF+D i# nr1FnQn t1en Eriteln 0`tentativa reusita`2
else Eriteln 0`tentativa esuata`2 end.
Problema comis voia6orului
An comis . vaia(or pleac% dintr.un ora&, trebuie s% viziteze un num%r de ora&e si s% se ntoarc% n ora&ul
de plecare cu efort minim ;de e+emplu de5 timp, caz n care costul unei muchii a grafului reprezint% timpul
necesar comis.voia(orului pentru a a(unge dintr.un ora& n altul).
; modalitate de rezolvare a acestei probleme este de a genera toate ciclurile 0aa cum am ar(tat Bn
apitolul -2 i de a8l reine pe cel de drum minim. ; ast#el de abordare conduce la un algoritm
neper#ormant 0timp exponenial25 Din acest motiv5 aceast( soluie nu are valoare practic(.
Pentru aceast( problem( nu se cunosc algoritmi care s( nu necesite un timp exponenial5 iat( motivul
pentru care renun(m la condiia de optimalitate i ne m(rginim s( g(sim un ciclu care s( treac( prin toate
oraele cu un cost5 pe c3t posibil5 redus. ,lgoritmul este urm(torul:
C se citete matricea costurilor , i nodul de pornire viD
C dac( v15v-5...5vO este un lan de6a ales5 dup( caz5 se procedeaz( ast#el:
C daca 7F0v15v-5...vO25 se alege muc1ia 0v15v-2D
C dac( 78t0v15v-5...5vO25 se alege muc1ia de cost minim care are o extremitate Bn vO5 iar cealalt( Bn vOM15
0unde vOM1 nu aparine mulimii
0v15v-5...5vO2
4bservaie/
;dat( cu muc1ia se selecteaz( si un nod. *a #iecare pas se selecteaz( un nod. Din acest motiv
algoritmul prezentat se Bncadreaz( in te1nica 4<""D[.
Pentru gra#ul din #igura urm(toare se consider( nodul de pornire 1.
4+
Dintre toate muc1iile care au extremitatea Bn nodul 1 se alege
muc1ia 015-2 pentru c( aceasta are costul minim 012.
Dintre toate cu extremitatea Bn nodul - se alege muc1ia 0-5$2. .n continuare5 se aleg muc1iile 0$5525 055425
04512 si ast#el se obine
gra#ul din #igura urm(toare.
,cest gra# 0de cost 182 nu are costul minim. De exemplu5 gra#ul din #igura de mai 6os are costul 15.
Bn program5 vectorul S reine nodurile selectate 0S0i2F15 dac( nodul a #ost selectat si S0i2F) 'n caz contrar2.
program cvD
tVpe matriceFarraV H1..+51..+I o# integerD
vectorFarraV H1..+I o# integerD
var a:matriceD s:vectorD n5 i5 65 v5 vl5 v-5min5 cost:integerD
begin
Erite0`nF`2D
readln0n2D #or i:F1 to n81 do #or 6:FiM1 to n do begin Erite 0`aH`5i5`5`565`IF`2D readln0aHi56I2D
aH65iI:FaHi56I endD
#or i:F1 to n do begin sHiI:F)D aHi5iI:F) endD
Erite0`?odul de pornire esteF`2D readln0v2D sH&I:F1D v-:FvD
cost:F)D Eriteln0v2D
#or i:F1 to n81 do begin min:F$))))D
#or 6:F1 to n do i# 0aHv-56IPG)2 and 0sH6IF)2 and 0minGaHv-56I2 t1en begin min:FaHi56ID vl:F6 endD
5)
v-:FvlD sHv-I:F1D cost:FcostMminD Eriteln0vl2 endD
cost:FcostMaHv-5vID Eriteln0v2D Eriteln0`ost totalF`5cost2 end.
; Bmbun(t(ire a algoritmului se poate aduce dac( se reiau calculele consider3nd5 pe r3nd5 ca nod de
pornire ]15-58.5nS modi#icarea Bn acest sens a programului se propune ca tem(.
,lgoritmi genetici
Atilizarea acestor algoritmi este o te1nic( de ultim( ora5 aplicabil( cu succes problemelor pentru care nu
se cunosc algoritmi Bn timp polinomial. ,lgoritmii generici nu sunt speci#ici te1nicii 4reedV. /otivul
pentru care au #ost introdui Bn acest capitol este dat de #aptul c( se Bncadreaz( Bn categoria algoritmilor
euristici.
S( ne imagin(m situaia 0din a#ara in#ormaticii2 Bn care se d( un c3mp de 1 Om
-
pres(rat cu tot #elul de
obiecte cu diverse valori i se cere ca Bn timp de o or( s( select(m obiectul cel mai valoros. ; explorare
sistematica a c3mpului necesit( un timp cu mult mai mare. ,vem o singura ans(: ca dup( o or( s(
prezent(m cel mai valoros obiect g(sit in acest timp. "ste puin probabil ca acesta s( #ie cel mai valoros de
pe c3mp5 dar este cel mai valoros pe care l8am g(sit. ,ceeasi problem( dac( o rezolv(m din nou5 poate
duce la o soluie mai bun( sau...mai proast(. <einem #aptul c(5 Bn cazul problemelor de acest tip5 calitatea
soluiei #inale depinde i de ans(5 Bns( nu numai de ea. red c( suntei de acord cu #aptul c( o soluie
pentru o problem( de acest tip depinde i de modul Bn care organiz(m c(utarea Bn timpul pe car il avem la
dispoziie. De multe ori aceasta se #ace respect3nd criterii matematice riguroase5 care sunt Bmprumutate din
teoria probabilit(ilor. <evenind la exemplul nostru 0didactic25 am putea selecta eantioane de obiecte din
diversele locuri de pe c3mp5 pentru ca apoi s( organiz(m c(utarea acolo unde densitatea obiectelor
valoroase este mai mare. ?imeni nu ne asigur( c( Bn acest #el vom da peste obiectul cel mai valoros5 dar
ansele de g(si la s#3ritul timpului de c(utare a un obiect cu a valoare apropiat( de acesta sunt mai mari.
<enun3nd la exemplul de mai sus5 care nu are alt rol dec3t de a uura Bnelegerea necesit(ii existenei
unor te1nici euristice de c(utare Bn spaiul soluiilor5 vom prezenta5 in continuare algoritmii genetici5 care
abordeaz( probleme de tipul celei de mai sus Prezentarea acestora se va #ace pe un exemplu 0de6a clasic2 i
anume de a calcula maximul unei #uncii de#inite pe mulimea numerelor reale. ,cesta nu este un exemplu
semni#icativ5 Bns( Bl pre#er(m pentru simplitatea sa. ,legerea exemplului de mai sus poate indica
urm(toarea Bntrebare: care este motivul pentru care nu calcul(m maximul #unctiei aa cum am #ost obinuii
si anume prin a da variabilei x un num(r su#icient de mare de valori din domeniul de de#iniie consideratL
S( nu uit(m #aptul ca o #uncie poate avea salturi semni#icative pentru variaii mici ale variabilei x 0este
posibil s( pierdem punctele semni#icative2. Pe de a#l( parte5 problema devine mult mai complicata dac(
#uncia este de#init( pe < 0#uncie de m variabile reale2.
Pentru exemplul considerat nu vom scrie programul. /otivele care ne determin( s( proced(m ast#el sunt
date pe de o parte de simplitatea unui ast#el de program5 pe de alta parte de #aptul c( noi consider(m c( o
persoana dornic( s( Bneleag( #uncionarea acestor algoritmi are preg(tirea necesara pentru a scrie un
program.
Bie funcia f/0a,b1.#C. 2e cere s% determin%m valoarea ma+im% pe care o ia funcia pe domeniul de
definiie considerat. ,legerea #unciei o va #ace cititorul. "ste bine s( #ie aleas( o #uncie pentru care se
cunoate valoarea maxim( 0pentru a veri#ica dac( a6ungem la un rezultat apropiat de acesta2. De asemenea
se recomand( ca #uncia s( conin( mai multe puncte de maxim pe domeniul considerat5 din care numai
unul este maxim absolut 0pentru a veri#ica daca algoritmul se bloc1eaz( sau nu Bntr8un optim local2.
Kn continuare vom descrie algoritmul de tip genetic. $tapa 5. ?rearea unei populaii iniiale de cromozomi.
51
.deea de baza Bn aceast( #az( este de a considera mai multe valori pentru variabila x 0evident5 toate Bn
domeniul de de#iniie considerat25 alese arbitrar. Prima Bntrebare care poate apare este urm(toarea: care este
num(rul acestor valoriL An num(r mai mare de valori va spori ansele de a a6unge la o soluie apropiat( de
cea optim(5 dar va m(ri timpul de rulare. Din acest motiv vom primi ca parametru de intrare num(rul
acestor valori 0#ie el ?<2. ,ceasta ne o#er( posibilitatea de a rula programul Bn condiii di#erite i de a
compara rezultatele obinute 0procedeu mult #olosit Bn analiza algoritmilor euristici2.
'oate valorile pe care le vom alege vor #i cuanti#icate sub #orm( de cromozomi. Pentru Bnceput5 vom
considera un cromozom o succesiune de O poziii binare. are este valoarea lui O pentru problema noastr(L
,legerea acestei valori depinde de mulimea valorilor posibile pe care dorim s( le ia variabila x. S( #im mai
explicii Bn domeniul de de#iniie considerat exist( o in#initate de valori pe care le poate lua variabila x.
Din motive lesne de Bneles nu le putem considera pe toate. 'otui5 putem considera un num(r su#icient de
mare. S( presupunem c( dorim s( consider(m 6
6D
valori posibile pentru x. Kn acest caz vom considera OF-).
unoatem ca pe -) de poziii binare se pot reine numere Bntre ) si -
$)
81. .n exemplul nostru5 un
cromozom va #i dat de o succesiune de -) poziii binare si vom avea ?< cromozomi.
;bservaii. Kn exemplul considerat spaiul soluiilor va conine -
-)
elemente. Se cere acel element care
maximizeaz( #uncia. ;rice cromozom va conine o valoare a variabilei x i avem ?< cromozomi. An
cromozom va cuanti#ica o soluie admisibila 0pentru ea #uncia are o anumit( valoare5 c1iar dac( nu cea
optima2.
,legerea celor ?< cromozomi se #ace aleator. Pentru #iecare dintre ei se genereaz( aleator o succesiune
de -) de valori ) sau 1. Se poate citi ca parametru de intrare si numarul O.
4 valoare de D sau 5 aflat% pe o anumit% poziie a unui cromozom o vom numi gen%.
um convertim un cromozom Bntr8o variabil( real( din domeniul de de#iniie consideratL &om considera
intervalul Ha5 bI Bmp(rit 1n -
O
81 p(ri egale. &aloarea a va #i dat( de cromozomul care are pe toate pozitiile
)5 iar valoarea b de acela care are pe toate poziiile 1. <estul valorilor se distribuie proporional.
"xemplu: OF-. .ntervalul considerat va #i Bmp(rit in 4 p(ri egale. Fiecare punct al diviziunii 0aa se
numete in matematic( o ast#el de Bmp(rire2 va #i numerotat Bntre ) i $.
Prin mecanismul ar(tat mai sus5 am stabilit o modalitate de conversie de la un cromozom la o valoare x
din domeniul de de#iniie.
?aracteristic algoritmilor genetici este faptul c% opereaz% simultan cu mai
multe soluii admisibile.
2e nume&te cromozom o soluie admisibil% scris% sub form% de vector.
?omponentele vectorilor pot lua diverse valori ;nu neap%rat D sau 5 ca
n e+emplu).
4 component% a vectorului cromozom se nume&te gen%.
;bservaie. /ultimea valorilor pe care le poate lua o gen( este #init(. $tapa 6. 4binerea soluiei.
De la bun Bnceput preciz(m #aptul c( un ast#el de algoritm se ruleaz( in limita timpului disponibil. Deci
operaiile corespunz(toare acestei etape se repet( in limita timpului disponibil.
ei ?< cromozomi obinui in etapa anterioar( Bi vom nota prin
15-5...?<.
6.5 $valuarea populaiei. Pentru #iecare cromozom din populaie se evalueaz( #uncia obiectiv.
5-
Fiecare cromozom va #i convertit Bntr8o variabil( real( din domeniul de de#iniie5 pentru care se calculeaz(
#uncia al c(rei maxim se cere.
6.6 )entru fiecare cromozom n parte se calculeaz% probabilitatea cumulativ% de selecie.
-.-.1. Se Bnsumeaz( valorile #unciilor obiectiv obinute pentru #iecare cromozom Bn parte.
-.-.- Pentru #iecare cromozom Bn parte se calculeaz( probabilitatea de selecie:
-.-.$ Pentru #iecare cromozom Bn parte se calculeaz( probabilitatea cumulativ( de selecie:
C ;bservaii. 9irul f15 E6,......E=C va #i cresc(tor5 ultima valoare va #i 15 dup( cum se poate observa cu
uurin(. u c3t cromozomul lM1 conine o valoarea pentru care se obine o valoare mai mare pentru
#uncia obiectiv5 cu at3t di#erena Bntre flM15 i fl este mai mare. 9irul probabilit(ilor cumulative de selecie
constituie o diviziune a intervalului H)51I.
rearea unei populaii intermediare de cromozomi.
Se selecteaz( ?< numere uni#orm aleatoare din 0)512 0c3te unul pentru #iecare cromozom Bn parte2.
Dac( un num(r aleator se g(sete Bn intervalul 0)5f125 cromozomul c1 este selectat. Dac( num(rul aleator se
g(sete in intervalul 0f5fiM12 este selectat ciM1
;bservaii: Bn cadrul acestei populaii un cromozom poate apare de mai multe ori. Se observ( #aptul c( dac(
cromozomul n5i este mai valoros5 intervalul 0fi5fiM12 este mai mare. Kn concluzie5 exist( o probabilitate
mai mare ca acesta s( #ie selectat Bn noua populaie. ,ceasta Bns( nu garanteaz( selectarea automat( a
acestuia.
Selecia cromozomilor supui Bmperec1erii.
Pentru #iecare cromozom din populaia intermediar( se selecteaz( un num(r aleator din 0)512. Dac(
acesta este mai mic dec3t o probabilitate controlat( pc 0parametru de intrare2 cromozomul respectiv este
selectat spre reproducere.
;bservaie. ,legerea probabilit(ii controlate pc este de mare importan(. De exemplu5 dac( se
consider( pcF)51 aproximativ 1)g din cromozomi vor #i supui Bmperec1erii.
; prim( Bntrebare care se poate pune este urm(toarea: de ce8nu sunt supui Bmperec1erii toi cromozomiiL
Populaia supus( Bmperec1erii se presupune a #i valoroas(. Dup( cum vom vedea5 operaia de
Bmperec1ere poate duce la soluii mai bune sau mai proaste 0se e#ectueaz( mecanic5 #(r( a exista un control
5$
al rezultatului2. Prin urmare5 nu suntem interesai s( distrugem Bntreaga populaie de cromozomi 0risc(m
prea mult2. Pe de alt( parte5 a nu supune populaia de cromozomi Bmperec1erii Bnseamn( s( nu g(sim soluii
mai bune.
Kncruciarea 0mutaii Bncruciate2.
romozomii se Bncrucieaz( Bn #elul urm(tor:
8 primul selectat cu al doilea selectatD
8 al treilea cu al patruleaD `
;bservaie: dac( populaia supusa reproducerii conine un num(r impar de cromozomi5 se renun( la
ultimul.
Kncruciarea a doi cromozomi se realizeaz( ast#el:
8 se extrage un num(r natural5 aleator5 t Bntre ) si num(rul de gene 0comun al celor doi cromozomi2.
8 se obin doi noi cromozomi ast#el:
8 primul va conine primele t gene ale primului cromozom si ultimile O8t ale celui de al doilea cromozom:
8 al doilea va conine primele t gene ale celui de8al doilea cromozom intrat in reproducere si ultimele O8t
gene ale primului cromozom supus reproducerii.
8 cei doi cromozomi obinui vor Bnlocui Bn populaie pe cei care s8au reprodus.
/utaii simple
Populaiei obinute i se aplic(5 cu o probabilitate mic( p5 0parametru de intrare5 valoare apropiat( de )2
mutaii simple Bn care se sc1imb( coninutul unei gene. ,st#el5 pentru #iecare gena a #iec(rui cromozom se
extrage un num(r aleator r aparine 0)512. Dac( num(rul este mal mic dec3t p5 coninutul genei se sc1imb(
din ) Bn 1 sau invers.
Kn urma derul(rii etapei - se obine o nou( populaie de cromozomi. "tapa se repet( in limita timpului
disponibil.
;bservaii.
12 "ste bine s( se rein( in permanen( cromozomul cel mai valoros 0dei probabilitatea de a obine o
populaie mai proast( de cromozomi este #oarte mic(2.
-2 ?u putem s( nu observ(m uriaa asem(nare Bntre algoritmii genetici i viata de toate zilele. Dei
cromozomii valoroi au toate ansele s( a6ung( Bn noua populaie5 exist( si ansa ca unii dintre ei s( se
piard(5 important nu este at3t cromozomul ci populaia de cromozomi. ,ceasta trebuie s( evolueze.
$2 ?u exist( reete care s( conduc( cu certitudine la rezultate valoroase. Programul se va rula cu diveri
parametri de intrare5 rein3nd cal mai bun rezultat.
42 ; problem( important( care apare la utilizarea unui algoritm de acest tip este urm(toarea: in cadrul
mutaiilor Bncruciate sau simple se pot obine cromozomi care nu mai sunt soluii admisibile 0pentru alte
probleme2. Din acest motiv5 de multe ori sunt necesari algoritmi5 de corectare 0dintr8un cromozom care nu
este soluie admisibil( s( obinem unul care este2. ,plicarea unui algoritm de corectare poate duce la
pierderea e#icienei algoritmilor genetici. ine ne garanteaz( c( dup( aplicarea coreciei se obine un
cromozom valorosL Din acest motiv5 corectarea se va #ace dup( criterii care in de speci#icul #iec(rei
probleme.
54
Probleme propuse
12 ; num(r(toare de la ) la -n81 Bn codul 4raV are proprietatea c( oricare dou( numere consecutive di#er(5
in reprezentarea lor binar(5 prin exact un bit 0bineBneles5 numerele nu se repet(2. "xemplu: num(ram de la
) la % 0pe trei bii2D
)))5 ))15 )115 )1). 11)5 1115 1)15 1))
S( se scrie programul care num(r( pe 1Q?Q$) bii.
-2 Se consider( o mulime 7 cu n elemente. Sa se elaboreze un algoritm e#icient i s( se scrie un program
pentru generarea irului tuturor submulimilor lui 75 ,15 ,-5 ... ast#el Bnc3t ,iM1 se obine din ,* prin
scoaterea sau ad(ugarea unui element.
$2 Se dau n compozitori i pentru #iecare din ei5 anii de viaa. S( se tip(reasc( num(rul maxim de
compozitori contemporani.
42 Se citesc de la tastatur( un num(r natural ? i un num(r real ,. S( se genereze o mulime de ? puncte Bn
plan5 P15 )6, ... Pn ast#el Bnc3t:
1. P1P-FP-P$F...FPnPF, i
-. P.PdP, oricare ar #i 1PiP6P?.
52 Se citesc numerele naturale O si n5 OPn.
a2 ,#iai toate variantele posibile de tablouri cu n linii i n coloane care Bndeplinesc urm(toarele condiii
simultan:
12 onin toate numerele de la 1 la n- o singur( dat(D
-2 Pe #iecare linie numerele sunt aezate Bn ordine cresc(toareD
$2 Suma elementelor de pe coloana O este minim(.
b2 ,ceeai problema pentru tablourile Bndeplinind condiiile 1 i - de mai sus i condiia:
$2 Suma elementelor de pe coloana O este maxim(. ;bservaie: 'rebuie s( se a#ieze mai Bnt3i num(rul
de variante posibile i apoi se vor a#ia tablourile.
!2 Se consider( primele ? caractere din codul ,S..5 Bncep3nd cu caracterul `a`. u ele se #ormeaz( cuvinte
de lungime mD #iecare cuvBnt este #ormat din caractere distincte. uvintele se consider( Bn ordine
lexicogra#ic( 0cea din cartea de tele#on2. Se cer urm(toarele:
1. Fiind dat un ast#el de cuv3nt5 s( se determine num(rul s(u de ordineD
-. S( se determine cuv3ntul cu num(rul de ordine dat.
%2 <ezolvai problema comis voia(orului utiliz3nd algoritmi genetici.
55

S-ar putea să vă placă și