March 30, 2017 | Author: Pătrașcu Mircea-Gabriel | Category: N/A
MINISTERUL EDUCATIEI ~I CERCETARII
Mariana Mllosescu
I
W
norma lea In enslv I
I
c++
Filiera teoretica , profilul real, specializarea matematica • informatica, intensiv informatica Manual penlru clasa a XI-a
EDITURA DIDACTICA $1 PEDAGOGICA, R.A .
Man ualul a fos t apro bat prin Ord inu l ministru lui Educ atic i si Cerceta rii nr. 4742 d in
2 1.07.2006, in urma evaluiirii calitative organizmc de catre Consiliul National pentru Evaluarca si Difuzarca Manualelor si este realizat in confo rtni tate ell program a analitica aprobata prin Onli nu l rnin istr ului Edu catie i ~i Cercctarii nr, 3252 d in 13.02.2006.
Dcscrie r ea e lr a Bibliotecii Nati on ale a Rom:iniei
M ILOS ESC U, MARIA NA Informat ica intcnsiv: manu al pentru clasa ~I X l- a I Mariana Liliana Mi losescu. - Bucuresri: Editura Didactica ~i Pcd agogica, 2006 ISB N ( I0) 973 -30- 1567 -9; 15 13:" ( 13) 9 78-973-30- 1567-3 004(075.35) 007(0 75 .35)
L im bu j u l C++ © [UP 2006. Toate drepturile asupra acestei edit ii sunt rezervate Edi tu rii Didactice si Ped agogi cc R.A ., Bucuresti. Orice preluare, partialf sau integrala, a textului sau a materialu lui gra fic din accasta lucrare se face nu ma i ell acordu l scris al edit uri i,
EDiTURA OIDA CT ICA S I PEOAGO GI CA, R.A. SIr. Spiru Huret. nr. 12. sector 1, co d 0 10 176, Huc uresti Tel.: (0 2 1) 315 38 20 Tel./Fax: (02 1) 312 28 8 5; (02 1) 3 1573 98 E-mail: ed p@b .astra l.ro . ed pcom @b .astral.ro web : www.ed ituradp.ro
Comenzile pcn tru aceasta lucr are se prlmesc: • prin po sta , pc ad resa editurii, eu men tiunea Comandis carte • prin e-mail:
[email protected] [email protected]
• prin tel. rfax : (02 1) 315 73 98 • prin te l.: (021) 3 15 38 20 Referen ti: p rof g l: I E mma Gabrie la Dn rn cscu . Colegiul Tehni c Pet r u Rares, Bucuresti : rnetod ist de spe cial itate 1 1l rorl11 ati ca - I . ~ Jv1 . Bucu resti pro/ g/: I Geo rgi na Pat rasc u. Co legiul Nat ional S fa n tu l Sa va. Bucuresti Redactor: Lia na Faca Tehnoreductor: i\l a r ia na :\ l i1o~escu Desenator: Aur ica G eorgesc u Coperta: Ele na Dr a g uletei Dumit ru Nr. de plan : 5 1263 ; Format 16'70 " 100 Bun de tillar: augu st 2006: Coli de t!p.lr: 21. Tiparul exec uta: la Iml'riml!ria dl! le.If Oradea
1. Tehnici de programare 1.1 . Analiza algoritmilor Prin analiza unui algoritm se identifica resursele necesare pentru executarea algoritmului: timpul de executie ~ i memoria . Analiza algoritmilor este necesara atunci cand exista mai multi algoritmi pentru rez olvarea
aceleiasi prob leme
~i
trebuie ales aigoritmul cel mai eficient.
Eficienta unui algoritm este evaluate prin timpul necesar pentru executa rea algoritmului. Pentru a compara - din punct de vede re al eficientei - doi algoritmi ca re rezolva ace easi problema, S8 foloseste aceeasi dimensiune a dat elor de intrare - n (acelasi nurna r de
valor! pentru date Ie de intrare) . Timpul de oxecutle al algoritmului se exprima prin nurnarul de operatil de baza exe cutate i n functie de dimen siunea dat elor de intra re : T(n) . Pentru a compara doi algoritmi din punct de vedere al timpului de executie, trebuie sa se stabileasca umtatea de rnasura care se va folosi, adica op eratia de baza executata in cadrul algoritmilor, dupa care. S8numara de cateon S8 executa ope ra~ia de baza in cazvl fieca ru i algoritm. Operatia de baz a este 0 operatie eternentara - sau 0 succesiune de operatil element are, a carer executie nu depinde de valorile datelor de intra re. Exista algoritmi la care tim pu J de executie depinde de distributia datel or de in tra re . Sa cons ider arn doi algoritmi de sorta re a unui vector cu n elemente - algoritmul de sortare prin metoda selectiei directe si algo ritmul de sortare prin metod a bule lor - ~i ca operatie de baz a cornparatla . Daca , in cazul primului algo ritm , timp ul de executie nu depinde de distributia datelor de intrare (modul in care sunt aranjate elementele vec toru lui in ainte de sortarea lui) , el fiind T(n) = n x In - J) , i n cazul celu i de al doilea algoritm timpul de exeZ cutie dep inde de distributia datelar de intrare (nurnarul de executii ale structurii repetitive w hile depind e de mod ul in care sunt aranj ate elementel e vecto rului in ainte de sortare). in cazu l in care nurnarul de executii ale operatiilor elementare depinde de distributia datelor de intrare . pentru ana liza algoritmului se folosesc : -7 timpul ma xim de execu t ie - timpul de executie pentru cazul cel rnai nefavorabil de distributie a datelor de intrare; in cazul sortarii prin metoda bulelor, cazul eel mai nefavorabil este atune i cane elementele vecto rului . sunt aranjat e i n ordine inversa decat aceea ceruta de criteriul de sortare ; ~ timpul med iu de execut ie - media timpiJor de execu tie pentru fiecare caz de distnb utie a datelor de intrare. Deoarece , i n analiza eficientei unui algoritrn, S8 urrnareste comportamentul lui pentru 0 c imensiune mare a datelor de intrare, pentru a cornpara doi algoritmi din punet de vedere al eficie ntei, este suficient sa S8 ia in considerare numa i factorul care dete rrnina timpul de exe c utie - ~i care este denumit ordinul de complexi tate.
4
T ehn ici d e p rogra ma rc Ordinul de comp lexitatc al unui algo ritm ll reprezinta timpul de executie - estimat prin ordinul de rnarirne al numarului de execut ii ale operatiei de baza: O{{f(n)), unde f{n) reprezinta termenul determinant al timpului de executie T{n).
De exemp lu, daca - pentru algoritmul de sortare, prin metoda selectiei directe - timpul de 1
n X(~ - I) = n -~ '
ordinul de complexitate al algoritmului este 2 O{n \ deoarece in calcularea lui se ia in considerare numai factorul determinant din timpul de executie. executie este T{n) =
in functie de ordinul de comp lex itate, exista urrnatoarele tipuri de algo ritmi: Ordin de complexita te O(n) O{n
m
)
O{k") O(logn) Otnloqn)
Tipul algoritmului Algoritm liniar. Algorit m po linomia l. Daca m=2, algoritmul este patratic , iar dat a m=3, alqoritrnul este cubi c. A lgoritm exp onential. De exemplu: 2 , 3 etc. Algoritmul de tip O(n!) este tot de tip exponential, deoarece: , n- 1 1x2x 3x4x ...xn > 2x2x2x...x2 = 2 . Alqoritrn loqaritmic . Alqoritrn Iiniar loqarltmic.
De exemplu , algoritmul de sortare prin metoda selectiei directe este un algoritm patratic. Ordinul de comp lexitate este determ inat de structur ile repetitive care se executa cu multimea de valori pentru date le de intrar e. in cazul structurilor repetitive imbricate, ordinul de complexitate este dat de produsul dintre nurnarul de repetitii ale fiecarei structuri repetitive.
-
-
Structura repetitiva
fo r \ i=l ; i #incl ude < i o s t r e a m . h > typedef int s t i va[ lOO] ; typedef int s tiva[l OO) i int n ,k ,ev ,a s ; int n ; s t ive s t , e t i va s t , vo id .i.n t t t ) void i n i t ( i n t k) ( s t [ k l ~ O ;)
iot s ucce s o r () (if ( s t [ k)
typ edef int s t Iv e [ l Ol ; int 11, k ,ev , a s , m[l OJ ;
t5tiva st ; v o id .i n.i t t ) ( S L [ " ~ G;
Implemcntar ea recurs ive # include < i o s t r e a ln . h > typede f i nt s t i va [1 0 1 ; i nt n: s tiv a st ; v o i d i n~ t \ i n t k) { .:3 t [ k l= O; }
)
int sccc e so r { (i f s::, ~] typedef i nt s t i ? a [ : OO] ; in t n ; s t i ve s t, • v o i d 'i n.i t ( i n t k) ( s l:[ k l ~ O ;)
i n t 3ucceso r( i n t k) {i f ( s t [l: ]< s t.[ k - l ]+ I ) {s t [k ] '>: ;
c in» n; b t:. ( ) ; }
Scrieti urmatoarele programe. i n care sa folositi metoda backtracking pen ru gene rarea tuturor aranjamentelor. 1. Sa se genereze toate pos ibilitat ile de aranjare pe m sca une an persoane (rns n). Valorile pe ntru n :;;i m ~ i nume le persoanelor se citesc dintr-un fisier text. Se citesc de la tastatura n cifre distincte . Sa se genereze toate numerele de m cifre (msn) care se pot forma cu aceste cifre - ~ i care contin toate cele n cifr e. Sa se genereze toa te an ag ram ele unui cuvant , din care se efirnina p litere oareca re. Valoarea minima a nurnarului p este 1. iar va loarea maxima este cu 1 mai mica decat lungimea cuvantului, Se citesc de la tas tatura cuvan tul :;;i valoarea nurnarului p . Se citesc de la tasta tura n caractere distincte. Sa se gen ereze toate cuv inte le de m caractere (m s n) care se pot forma cu aceste caractere si care contin toate cele n car actere. Se cites te un nu rnar n care are m cifre . Sa se genereze toat e nurnere le, cu cel mult m cifre, ca re se pot forma cu cifrele nurnar ului initial. Dintr-o rnultirne de n persoane , aranjate intr-un sir, se elirnina p perso ane. Sa se genereze toate posibilitatile de aranjare intr-un sir a persoanelor rarna se. astfel tncat fiecare persoana sa nu alba ace iasi vecin i ca i n sirul initial. Valorile pentru n si p se citesc de la tastatura . Sa se genereze toate aranjamentele. de m numere , ale unei multirni de n num ere oarecare asUel lncat suma elementelor generate sa fie egala cu s . Nurnarul de elemente ale rnultirnii, n . elementele rnultirnii, valoarile pentru m :;;i pentru suma s . se citesc de la tastatura . Sa se genereze toate drapelele cu trei cu lori care se pot forma cu sase culori: alb, galben , rosu , verde , albastru ~ i neqru , care au in mij loc culoarea alb . verd e sau ro su. lndi ca ti e. Solutia are 3 elemente . un element al solutiei fiind indicele din vector al une i
Tc hnici de programarc
22
cu lori. Se genereaza aranja me nte cu con di tie de 6 obiecte luate cate 3 - solutia confine 0 co nd itle inte rna su pllrnen tara fa!a de cea impusa de aranjamente: elementul 2 al solutiei trebu ie sa fie indicele culori i alb , verde sau rosu. 9. Se considera n cuburi. Fiecare cub i are latura Li ~i culoare a Ci. Sa S8 construiasca toate turnuri le stabile, formate cu m cuburi, astfel tncat dOU8 cubu ri vecine in turn sa nu eiba aceeasi culoare. Valorile pentru n "i m "i atributele celor n cuburi se citesc de la tastatura. lndicatle. lnforrnatiile despre cuburi S8 mernoreaza intr- un vec tor de l nreqistrari cu n elemente. Solutia are m elemente. Un element al solutiei este indicele din vector al unui cub . Se genereaza aranj amente cu conditie de n obiecte luate cate m - solutia contine 0 con ditie in tern a suplimenlarii fa\a de cea irnpusa de aranjamente: cubul k care se adauqa la tum trebuie sa alba latura mai mica decat a cubului k-1 "i culoarea Menta de acesta.
1.3.3.4. Generarea cornbinarilor Se genereaza toate combinariie de m elemente ale rnultimii (1, 2, 3, ... , n} .
o sotutie
a problemei va fi 0 co mbina re "i va avea m elem ente. Fa\a de algoritmul pentru generarea aranjamentelo r, apare 0 conditie suplimentara: aceea ca solutiile obtinute sa fie distincte , adica doua solutii sa nu cantina aceleasi numere. Pen tru aceasta. se va adauqa 0 co nditie de co nt inuare suplimenta ra: valoarea de pe nivelul k trebuie sa fie strict rnai mare decat orica re dintre valorite de pe nivelele inferioare . Aillel spus , elementele solutiei trebuie sa fie ordonate : st [1] ";
l -l ; )
i nt succe s c r (i n t k ) {if ( s t Lk l c nv s )
c i. noc- n :
bt() r I
( / Ipar t ea
k)
fix~
void rna i n ( ) (cout«" n =!l i
a al g o ritmul u i ) c i. ncc- n ,
bt (l j ; }
A!go ritmul de generare a tuturo r partiti ilor unui nurnar natural poa te fi folosit 'Ii in alte probleme. De exemplu , gc nerarea t utu ror post bitl ta ti lor de p lata a unei sume cu ba nc no te de va lori date. Problema se reduce la gene rarea tuturo r partitiilor unui nu- 25 = 5+5+5+5+5 (01=5) mar natural nenul s u m a, a partitie fiind 0 descompunere a 25 = 5+5+5+10 (01=4) numarului suma in surna de m numere naturale, nenule , cu 25 = 5+10 +10 (01=3) valari apartinand rnultim ii A={a1,a2, _.., an}. Alaturat, sunt prezenta te toate partitiile sume i 25 pentru bancnate cu valori apartinand rnultimii A={5, 1OJ. Fala de problema anterioara , apar urrnatoarele modificari: -7 Deoarece suma suma se descompune in valori precizate , apartinand rnultimii A , aces te valori se memoreaza in vectorul a, care are lungimea loqica n (numarul de valori ale banenotelor) . -7 Un elem ent al solutiei este indicele valori i bancnotei din vectorul a, adica un element din multimea {1 ,2, , n} . -7 0 solutie a problemei va fi fermata din m elemente , alese astfel l ncat suma valorilor bancnotelor corespunzatoare lor sa fie eqala cu nurnarul suma. Altfel spus: solutia se obtine atunei cane surna s=a[st[1]] +a[st[2]]+ .-. + a[st[k-1]]+ a[st[k]] are valoarea suma .
26
Tehnici de progra ma r e
~
Co n dit ia de co ntinuare este ca suma valorilor termenilor qenerati, 5 , sa fie mai mica sau eqa la cu surna (sss u rna). 0 sclutie cornpleta obtinandu -se atunci cane s=suma . Atun ci cand S8 urea In stiva , S 8 adu na la surna valoarea bancnotei cLJ indicele k : s t e e Est [k ) ] , iar cand S8 coboara i n stiva, 58 scade din surna valo area bancnote i cu indicele k : s - =a [s t [ k] ] si valoarea bancnotei cu indicele k-1 : 5+ = a [s t [ k -1] ] . -7 Deoarece este pos ibil ca - pentru anumite valori ale sumei suma ~i ale valorilor bancnot elor nu existe nici 0 solutie, 5 8 folos este variabila de tip logic est e, care are valoa rea 1 (true), daca exista cel putin 0 solutie , ~ i 0 (false), In ca z contr ar
sa
# includ e t ype d e f int s t iv a [ lOO ] ; int n , k , ev , as / s= O ,su ma ,e sLe~O ,a[ lOJ ; stiva st; vo id .i n i.t; (i { i f ( k ~~l) s t [k J ~ D ; e l se s t[k] =s t[k -l] -l ; } i nt s u c c e so r- () { i f \s t[k] t yp e d e f i nt s tiva [100 ] ; i nt D,m ; s t i va e z , i n t su r jectiva( ) {int l ,j , x ; for ( j =l ; j < = n ; j + + l (for (i = l , ;~ =O ; i< = m &f, I >: ; l++) if (st [ i J~= j) x=l ; if ( ! x) r e t urn 0 ; ) r e t ur n l ; } v o i d in Lt ( i n t k) { s t [ k ) = O; } i n t 3uccesorl i n t k ) (if (sL[ kJn : d e i ( n, z ) ; couu c c z r }
~
i n acest exemplu , prob lema a l ost descornpusa in probleme care nu s unt independente unele de alle le ~i, i n apelu rile recursive, aceeasi subproblerna este rezolvata de mai multe ori : 1(4), 1(3), 1(2), 1(1). Pentru acest tip de problem a nu se recomandii metoda divide et impera deoare ce nu este eficle nta Atcntie
Informaticii
45
Exemplul 4: Sa S8 determine simultan va loarea minima 9i valoarea maxima dintr -un vec tor v ca re contine nume re intregi . Nurnarul de elemente ale vectorului (n) ~i elementele lui se citesc de la tastatura. lmplementarea metodei di vi d e et im pe ra i n acest exemplu S8 face astfe l: ~ Subprogramul divizeaza ()- Nurnarul de subprobleme in care S8 descompune problema este 2 (k=2). Div iza rea rnultim ii datelor de intrare se face la fel ca la exemp lul pentru calcularea sum ei elemen telor unui vector ;;i subprogramele sun t identice. -7 Subprogramul combina ( )- Combinarea solutiei l nsearnna determinarea minimului [ z L) ~ i a maximulu i (z z} dintre cele doua valori minime (x l ~ i y l ), respectiv maxime (x2 si y2 ), obtinu te prin rezo lva rea celor doua subprobleme. in subproqram sunt ·combinate cele doua perech i de valor i obtinute din cele doua intervale . Daca x 1>y1 , atunci minimu l (z r.) este y L, altfel , este x l. Daca x2>y 2, atu nci maximu J(z 2) este x 2; altfel, este y 2. -7 Subprogramul dei ()- 0 subproblems corespunde cazului de baza atunci cand subrnult irnea cont ine un singur element (se pot calcula min imul ~ i maximu l; atat minimul cat ~ i maximul vor ave a valoarea elemen tului) . Daca s-a terminat procesul recursiv (prin procesul de divizare cele doua capete ale intervalulu i au ajuns sa fie ide ntice) , atunci se pre lucreaza cazul de baza (se calc uleaza minimul ~i maximul In variabileJe z l si z 2 corespunzatoare solut iel): altfel , se ape leaza subproqrarnul pentru diviz are a intervalulu i, se apeleaza subproqrarnul d e i () pentru primul interva l, se ape leaza subprogramuJ dei () pentru al doi lea interval si se cornbina ce le doua rezu ltate. #i n clu d e i n t v [lOO ] , no void d i v i c ea a c {i n t s ( i n t d , int &m) { rn> (s I·d ) 12 ; } v o id c ombi n a( i n t xl , i rit yl , i n t &z l ,int x2, i n t y2 , i n t &z 2) { i f (x l >y l ) z1 c:;yl ; el s e z l =x l ; if (x2>y2) z2;::x2 ; el s e z2 =y2 ; } voi d dei Ci n t s , i n t d , i n t &z 1, int &z 2 ) II z 1 - mi nim, z2 - maxi m {int m,xl ,x2 ,y1 ,y2; i f (d-:: ::.s) z Le.z Z v-v l.sl : e lse {d.i.v La e az e ts , a ,m); d ei ( ~; , m , x l , x 2 ) ; Ilxl - min i m, x2 - max im d ei (m l-l , d , y l , y 2 ) ; Ilyl - mini m, y 2 ~ ma xim c ombina (x l , y l , z l , x 2 , y 2 , z 2 ) ; } } vo id ma i n C) {int i , 7.1 ~, z2 ; c o u t. x -cvne "; c i n »n ; f o r ( i ;:: l;i < =n;i + + ) {cout « "v [ " « i « " ] = " ; c i.nc-o-v l i j : } d ei ( 1 , n , z l , z 2 ) ; c ou t « ":ni n i mu l = " «z l « e n d l «"maximu l = " « z 2 « e n d l ; } Exemplul 5: Sa se calculeze sum a a doua polinoame. Gradele celo r doua polinoame , n m , si coeficientii celor do ua polinoame se citesc de la tastatura. Coeficientii ce lor doua polinoame se mernoreaza In vectorii p si q , iar coeficien tii polinomului surna se memoreaza In vectorul r. ~i
lmplementarea metodei divide at im pera In aces t exemplu se face astfel: -7 Subprogramul divizeaza () - Nurna rul de sub problems i n care se cescornpune problema este 2 (k=2). Deo arece exist a doua mul tirni de date de intrare (vectorii P ~i q ca re mernoreaza coeficientii ce lor doua polincarne), se va lua ca reper mul tirnea cu cele mai multe elemente. Multirnea datelor de intrare este divizata In doua sub rnultimi disjuncte ,
46
Tc h nici de progra ma rc
prin divizarea rnultimii indicilor in doua submultimi disjuncte de indici, adica rnultimea indic ilor [s,d) (unde s este primul indice, iar d este ultimul indice - d=maxim( n,m) +1) este divizata in doua subrnultirni disjuncte [s ,m ij l) si [m ijl+1 ,d) , unde mijl este indicele din rnijlocul intervalul ui: mi jl = ( s +d) / 2. Procesu l de divizare este identic cu eel de la exemp lele anterioare. -7 SUbprogramul cornbina ( ) - Deoarece i n cazu t de baza S 8 determina unul dintre coeficie ntii polinom ului surna care S8 scrie direct in vectorul r , acest subpro gram nu mai este necesar. -7 Subprogra mul dei () - 0 subproblem a corespunde cazului de ba za atunci ca nd submul\imea contine un singur element (se poate calcula coeficie ntul polinomulu i surna). Oaca s-a terminat procesul recursiv (prin procesul de divizare , cete doua capete ale intervalului au ajuns sa fie identice), atunci S8 prelucreaza cazul de baza , prin care S8 calculeaza coeficientul polinomulu i surna pentru acel indice (daca termenul care se calcuteaza are indicele rnai mic decat gradul minim al polinoamelor, atunci el este egal cu suma coeficientilor cetor doua palinoame ; altfe l , daca polinamul p are gradul mai mic decat al polinomului q , atunci el este egal cu coeficientul polinomului q ; allfel, el este egal cu coeficientul polinomu lui p ); allfel , se apelea za subprogramul pentru divizarea intervalului, se apeleaza subprogram ul d ei ( ) pentru primul interval ~i apoi pentru al doilea interval. #inclu de int p [l OJ,q [lOJ,r[l OI,n, m; i o t ma~im( i n t x, i n t yl {if ( x >y ) r eturn X; e lse r e t u r n y; } iot ~inim ( i nt x, i o t y ) {if (x >y) r e turo y; el s e r e t u r n x; } vo id diviz e a z a {i n t ~ , i n t d , i n t &mi j l ) {mi j l = ( s +d } / 2 ; } vo i d de i ( i n t s, i n t d) {int mi j l ; i f (d , = s) i f (d< =mi n im(n,m)) r[d]~p[dJ+q [ dJ ; e l s e if (Il Nurn ar total ba nc note= 9
Iso[ I s
I
pentru Valoare bancn ota 10 1 1 citirea datelor din fisierul text. In fisierul _ text , pe prirnul rand sunt scrise doua nuNumar de bancnote 2 4 1 2 mere i ntregi, n ~j 5 , iar pe randul urrnato r cele n valo ri ale bancnotelor. Valorile nume rice de pe fiecare rand sunt separate prin spatiu. -7 Subprogramul s o r t ( ) - se foloseste pentru a sorta descrescator vectorul a -7 Subprogramul g r e e d y ( ) - irnplernenteaza strategia greedy pent ru aceast a problema ~ i afiseaza solut ia in lim p ce 0 construieste. cite ste ()
_
Strategi a greed y este irnplernentata astfel: PAS1 . Selec tarea ban cnotelor in ce pe cu ba ncno ta cu valoa rea cea mai ma re (prim a valoare din vect oru l a). PAS2 . Cat t im p nu a fost platita toata suma , exe c uta PAS3 . Dac a 0 parte din suma rarnasa poate fi platita in bancnote care au valoarea elementului curent din vectorul a. atunci S8 determina nurnarul maxi m de bancnote cu care se face plata (catul dintre suma rarnasa ~ i valoare a bancnotei) si S8 calculeaz a restul din surna care rnai rarnane de platit. PAS4. Se trece la urrnatoarea valoare a bancnotei si S8 revine la Pasul 2. # inc lude < f s t r e a~ . h >
i n t n,m,S, a{ 2 0 ]; f stream f ("g rcedytl . t x t" . i os: : in ) ; v o id c i t.e s t e () {i n t i ; [ »n»5 ; f o r ( i = l ; i < = n ; i - ~ ~ ) f »a [i); f . c l o s e ( ); } v oid s o r t. t ) { i nt i,j,aux; f or ( i=l ;i ;i poate fi reprezentata printr-o rnatrice (nxm ) ale carei elemente pot avea valorile: a (pentru locurile in care nu exista masini) >;i 1 (pentru locurile in care exista rnasini). Robotii se deplaseaza in spatiut de deasupra rnasinllor , corespunzator aceluiasi caroiaj. Robolii pornesc din coltul din stanqa sus (1,1) >;i trebuie sa duca piesele i n coltul din dreapta jos (n.rn). Robotii sunt proqramati astfel i ncat sa se deplaseze dea r la dreapta sau in jos. Sa S8 scrie un program care sa determine nu rnarul minim de robof care trebuie porniti pentru a strange toate piesele fabricate intr-o zi. (Concursul Nemes Tihamer, 1998) 5. intr-un depozit al rnonetariei statului sosesc n saci cu monede. Seful depo zitului cunoaste nurnarul de monede din fiecare sac ~i vrea sa modifice continutut sacilo r, prin mutarea de monede dintr-un sac in altul, astfe l lncat, la starslt, sa fie in fieca re sac acel asi nu rnar de monede. Sa S8 scrie un program care sa determine, daca este posibil, nurnarul minim de rnutar i prin care fiecare sac sa cantina acelasi nurnar de monede, altfel sa S8 afis eze un mesa] . Fiecare mutare S8 afisea za sub forma: sac initial, sac final, f)umarde monede . (n,;2000, iar nurnarul total de monede '; 1.000.000 .000) (ONI Oradea , 1998)
1.6. Metoda programiirii dinarnice 1.6.1. Descricrea metodci prugramiirii dina rn ice Me toda pr oqrarnarii din am ice S 8 poate folosi pentru problemele in care trebuie sa fie gasita solutia optima si care au urrnatoa rele caracteristici : 1. Sotutia optima se alege dintr-o rnultirne de solutii. fiecarei solutii puta nd sa i se asocieze o valoare . Alegerea solutie i optime Insearnna alegerea solutiei care are valoarea optima (minima sau maxima ). 2. Problema poate fi descornpusa in subp rob leme simila re cu problema i ni tiala ce respects princ ipiul optirnalitatii : solutia problemei este optima daca ea coniine solutiile optime ale subproblemelor.
3. Subproblemel e i n care se descompun e problema nu s u nt indep end ente 4. 50Iu!i. problemei este data de un vec to r 5 = (x " X2, ... , xml si: -7 exista 0 multirne finita A din care se poate alege un element Xi al solutiei: -7 fiecare etapa de determinare a unui element Xi al solutiei se bazeaza pe rezultatele etapelor in care s-au determinat elementele anterioare ale solutiei; -7 nurnaru l de posibilitati de a alege un element Xi al solutiei se reduce din cauza cerin telor de optimizare si a restrictiilo r impuse solutiei. Metoda c la s l c a de rezolvare a acestor probleme este de a cauta toate so lutiile problemei si de a alege . dintre solutille qasite , solutia optima. Algo ritmul de gene rare a tuturor solutiilor tnsea rnna generarea tuturor subrnuttimi lor de indici ai multirnil A cu n elemente >;i are ordi nul d e c omp!exitate 0(2") . Acest ordin de com plexitate este inacceptabil pentru 0 dimensiune mare a datelor de intrare n.
III fn f
ill a I icii
71
(Swoon de CalZ I Scop : identificarea probl emelor care po l fi descompuse ill subprobl erno similare care nu s unl i ndepen dente ~i ca re resp ecta pr incipiul optirnalitati l, solu tiilo r putand sa Ii se asocieze 0 va loare, iar solutia optima deterrnin andu -se prin calcul area valorii optime . Enuntul problem ei 1: Se conskiere un triunghi de numere naturale ' a11 ell n tinii. Pomind de to numerut din linia 1, mergfmd in j os pana fa a21 finia n. sa se determine a setectie de etemonte astrel incat suma e/ementelor sa fie maxima . Trecerea to Iinia urmatoare se poate face nume! mergfmd in jos, direct sau pe diagonala, la dreapta . a n1 8 ij
I
a 22 a n2
.. ann
Metoda clas ica de rezolvare a acestei probleme este de a calcula toate sume le care se pot forma respectand restrictia de deplasare in triunghi si de a alege, dintre sumele gasite , suma care are valoarea eea rnai mare . Mul\imea datelor de intrare 0 reprezinta rnultirnea A fermata din elemente le aij ale triungh iului. Valoa rea asociata unei solutii este su ma elemc ntelor. Valoarea solutiei optime este valoarea maxima (s uma elementelo r tr ebui e sa fi e m axim a). Sol ut ia problemei este data de un vector S :::: {X1 , X2, ' .' , xn}, unde xjEA. Pentru canstruirea solutiei S8 porneste de la elementul a1 1 ~ i se merge in jos , pana la linia n. Trecerea la linia urrnatoare nu se poate face decat direct, in jos sau pe diaqonala, la dreapta, astfel lncat succes orul elementului aij nu poate fi decat elementul ai+1 ,j sau eleme ntul ai+1,j+1. Problema poate fi descompusa in subprobleme: subproblem a i este alegerea elementului Xi al solutiei de pe linia i a triunghiu lui. Res trictia impusa pentru sol utie este ca elementu l Xi al solutie i sa se obtina , prin deplasarea in triunghi, numai pe doua direcni, de la elementu l anterior, limita nd rnultirnea elementelor din care se alege elementul Xi al solutiei numai la elementele din triunghi care se gasesc lntr-o anurnita pozitie fata de elementul anterior al solutiei. Pentru a respecta princi piul op nrna titat ii. suma elementelor alese anterior trebuie sa fie maxima. Subproblemele nu s unt independ ente deoa rece i n subprob lema i alegerea elementului Xi al solutiei se bazeaz a pe alegerile Iacute in subprobleme le anterioare . Enuntul p ro ble me i 2: Df111du-se un §ir de num ere sa se determine subsirul crescator de lungime maxima . Fiind dat un sir de numere a- , a2, .. _, an, se defineste ca subsir crescator , sirul aj1, ai2, ..., aik, cu ai1 ~ aj2 :S:; .. . :s:; aik ;;i 1 s i1 < iz < ... :s:;i k. De exernplu . i n sirul de nume re 1, -2, 3, 2, 4 , 4 , un subsir crescator este 1,3 , 4, 4 . Motoda clas ic a de rezolvare a acestei probleme este de a genera fiecare subsir al multimii A ~ i de a verifica daca este subsir crescator. Dintre subsirunle crescatcare gasite se alege apoi subsirul care are lungimea cea mai mare. M u l~ i me a
datelor de intrare a reprezinta rnultirnea fermata din elementele sirului: A={a1, a2, .. ., an} . Val oarea asocia ta unei solutii este lungimea subslrulul cres cat or. Valoarea solutiei optime este valoarea maxima (Iun gim ca su bsiru tui tre buie sa fie ma xim a). Solut ia prob lemei este data de un v ector S = {X1 , X2, .. ., xm}, unde XiEA . Prob lema poate fi descornpu sa in subprobleme: subprob lema i este de a gasi subsirul crescator de lungime maxima care i ncepe cu elementul ar. Restrictia impusa pentru solutie este ca elementul aj cu care incepe subslrul sa alba valoarea rnai mica sau eel mult eqala cu cea a succesorului sau in subsir (aj), iar in rnultimea A nurnarul lui ordine (i) trebu ie Sa fie mai mic c ecat numarul de ord ine al succesorului (j) , tirnitand rnultirnea elementelor din care se alege succesorul aj . Metoda cea mai sirnpla de a gasi subsirul de lungime max ima care i ncepe cu
72
Tc h nici d e p r ogramarc
elementul aj este de a cauta printre subsirurile de lungime maxima descoperite in subproblemele rezolvate anterior, eel mai lung subsir care ince pe cu un element a] ce poate fi succesor in subsir al elementului a r, obtinandu-se un nou subsir, de lungime mai mare, care i ncepe cu elementul a.. Pentru a respecta principiul optimatitatii, lungimea subsirurilor descoperite anterior trebu ie sa fie max ima. Subproblemele nu su nt in dependcnte deoarece i n subproblerna i alegerea subsirului care i ncepe cu elementul ai al solutiei se bazeaza pe alegerile tacute in subproblemele anterioare. Enu nt u l pro bl emei 3: 0 (eava Cll Iungimea L trebuie sa se contectione ze din n bucet! do (eava. tiecere ouest» avand lungim ea ai. 0 bucot« de (eava nu poate Ii tiiiata. Sa sa gase asca. aoc« exisla , soil/ ria de a obtine teev« de lungime L prin sudarea unor bucet) de
!eava cu tunqimee e, Metod a clasica de rezolvare a acestei probleme este de a genera toate tevile care se pot forma cu cele n bucati de teava cu lungimile date si de a verifica daca lungimea tevii obtinute este eqala cu L. Mullimea dale lor de intrare 0 reprezinta rnultirnea A fermata din lungimile bucatilor de teava a.. Valoarea asociata unei solutii este lung imea tevii . Valoare a solutiei optime este L (Iungimea !evii co nstruite trebuie sa fie L). Solu t ia problemei este data de un vec to r S = {x, . X 2• •• •• xm}, unde x;EA . Problema poate fi descornpusa in subprobleme: subproblema i este de a gasi toate tevile care se pot confections adauqand bucata de teava cu lungimea a: la tevile care au fost construite in subproblema anterioara. Restrictia impusa pentru tevile care 58 constr uiesc este ca ere sa nu depasea sca lungimea L. Aceasta restrictie lirniteaza rnultirnea tevllor construite anterior. Pentru a respecta pri nc ipi ul optimalitatil, constructia tevilor eu ajutorul bucatii de teava eu lungimea ai se bazeaza numai pe tevile construite in subproblema anterioara, iar subproblemele nu sun t independente. En untu l pro btemai 4: lntr-un rucsac S 8 poate transporta a greutate maxima G $i exista n obiectc, fieeare obiect avand qreuuitee g; § i un profit obtinut in urma trenspottutu! c; iar obioctete nu pot fi fractionate. Sa se setecteze obiectote care vot fi trenspotteto in mesne, astfel incat sa se obtine profitul maxim (problema discrotii a rucsecutui y.
Metoda clas ica de rezolvare a acestei probleme este de a genera toate posibilitatile de a incarca rucsacul aieqa nd obiecte din cele n obiecte ~i de a verifica daca greutatea obiectelor nu depaseste greutatea de incarcare a rucsacului G. Dintre variantele de incarcare a rucsacului se alege cea care are profitul eel mai mare. Multirnea datelor de intrare a reprezinta rnultirnea A fermata din cele n obiecte ai care pot fi transportate in rucsac. Valoarea asociata unei solutii este pr ofit ul t ran sportului. Valoarea solutiei optirne este valoarea maxima (prof itul t rebui e sa fie maxim ). Solut ia problemei reprezinta lncarcatura optima a rucsacului si este data de un vec tor S = {X1. X2•.. .• x m}, unde xkEA ~ i 1skSm. Problema poate fi descornpusa in subprobleme: subproblema i este de a verifica daca obiectul a: poate fi element al solutiei, Restriqia irnpusa pentru solutia care se construieste este ca obiectul a: sa nu aiba a greutate mai mare decat greutatea disponibila a rucsacului ~i profitul lui sa fie mai mare sau egal cu profitul utimului obiect adauq at in rucsac 3i.1. Aceasta restrictie lirrnteaza multimea elementelor din care se alege elementul Xk al solutiei. Pentru a respecta princ ipi ul opt irnalitati i. elementu l Xk al solutiei S8 determine prin alegerea dintre doua obiecte a celui care are profitul mai mare. Subproblemele nu sunt inde pend ente dc oarece rezolvarea subproblem ei i se ~ bazeaza pe rezolvarea subproblemei i-1 (elementul Xi al solutiei este determinat in ~ functie de elementul X i-1 al solutiei).
73
lnfu r mu t icii Metod a proqramar it dinami ce so bazoaza pc descompunerea unci pro bleme in sub pro ble me s imilar e problcmci initiale, care nu sunt in de pc n dc n tc , ~i c on st ru iosto so lutia rozolvand fie care subprobtorna, prin selecta rea, dint r-o m ultirne d e c lemente, a el em entel o r ca re indep linesc
0
anurnita co nd it ie. .Pen tru
ca elementele care se selec teaza sa apartina sotutiet optima, la pasul k alegerea se face in f un cti e de valoarea op tima a unci functii asociate solutlei ~ i se baze aza pe ale ge rile care s -au facut pana atu nc i (pe elementele solutl ei care au fost desc operite anterio r). Etapcle de rezol var e a un ci p ro b lem a p ri n metoda p roq ra rna r!i d ina m ice s u nt: PAS1. Se dernonstreaza ca problema are 0 substructure optima (prin reducere la absurd). PAS 2. Se caracterizeaza structura unci solutii optime (descompune rea problemei in subprobleme). PAS3. Se defineste re cursiv va loarea so lut iol opt ime. PAS4. Se calculeaza valoarea solutiei optirne intr-o rnaniera "de jos i n sus" ("bottom-up·') . PASS. Se con struieste solutia optima din inforrnatiile obtin ute prin calcu larea valorii solutie i optime.
Obso rv atio. Valoarea solutiei optime este definite recursiv in functie de valorile optime ale subproblemelor. Daca pentru calcularea functiei recursive s-ar folosi un algoritm recursiv, ordinul de complexitate ar fi 0 (2"), la fel ca si in cazul metodei clasice de rezolvare. Din aceasta cauzn, ca!cularea functiei recursive S8 face "de j os in sus " obtina ndu-se un algo ritm itorativ : PAS 1. Se rezolva subproblema obtinuta din descompunerea problemei initia te care are cea mai mica dimensiune ~i S8 mernoreaza soluti a ei. PAS 2. Cat t imp nu s·a ajuns la rezolvarea proble mei cu dimensiunea n , exec uta : S8 rezo lva 0 subproblems de dimensiunea i folo sind solutiile obtinute in subproble mete cu dimensiune mai mica decat i.
1.6.2. lmplcmentarca mctodci prugrarnarii dinamice Pentru impleme ntarea metodei proqrarnari i dinamice S8 vor foios i subprogramele: -7 subprogramul ini t () - care initializeaza variabilele de rnernorie ~i structurile de date folosite pentru constru irea solutiei; -7 subprogramul p_ dinamica () - care calculeaza valoarea solutiei optune; -7 subprogramul afiseaza ( ) - care afiseaza solutia problemei foJosind intormatiile obtinute prin calcularea valorii solutie i optime . in exempJele urrnatoare datele de intrare vor fi citite dintr-un fisier text.
Excrn plul 1 . Proble ma surnei maximo in tr iunghi. Cerinta problemei este ca pentru calcu lul sumei sa se porneasca de la elementul a11 si sa se rnearqa in jo s, pana la linia n. Trecerea la linia urrnatoare nu se poate face decat direct, in jos, sau pe diaqonala , la dreapta , astfel lncat succesorul elementului aij nu poate fi decat elementul ai+l, j sau elementul ai+1,j+1. PAS1 . Pro blema are sub struc ture optima . Fie un sir de n numere din triunghi, care respecta conditiile de deplasare in triunghi ale problemei, si care tormeaza suma maxima. in subproblema i a fast ales numarul de pe linia i pe baza sumelor maxime calculate in subproblernele anterioare, altfel se contrazice ipoteza ca sirul forrneaza suma maxima .
T ch nici de programarc
74
PAS2 . Desc om puncrea probJem ei in subproblem e. Se deterrnina pe rand sumele maxime ale numerelor care apar pe trasee le care pornesc de pe ultima linie n catre varf si ajung pe linia i (t s is n-t). Pe linia i , suma maxima pentru fiecare element S8 va calcula pe baza sumelor max ime care s-au calculat i n subpr oblemele ante rioar e (sum ele de la linia n pfma la linia i+ 1). Aceste sume sunt sume le max ime pentru fiecare linie ~i principiul optirnalitatii este respectat. PAS3 . Valoarea solutie i fiind suma etementelor selectate , functia recursive care defineste s uma m axima pornind de la elementul au al triunghi ului este prezentata alaturat,
aij oaca len , h "js i S(i,j) =
{ a;j + max(S(i+1,j), Sli+1,j+1)) daca t stsn-t
PASS . Pentru a calcula valoarea solutiei optirne intr-o maniera de "de jos in su s ", S8 va forma un tri u nghi al s ume lor ma xim e, pornind de la baza (Iinia n ) catre varf (Iinia 1). Sumele maxime de pe linia n sunt ega te fiecar e cu elementul corespunzator de pe linia n a triun ghiului. Valoa rea maxima a sumei elementelor este 51 1. PASS . Pentru reconstituirea elemen telor solutiei, se foloseste 0 ma trice p , i n care se mem oreaza directia de deplasa re (valoarea 1 pentru deplasarea in jo s si valo area 2 pentru depiasarea pe diaqona la). Matricea peste defin ita alaturat .
p(i,j)
={
1 daca 5(1+1 ,j) > S(i+1,j+1) 2 caca 51i+1,j ) ~ 5(1+1,j+1)
Se tolosesc urrnatoarele date ~ i structuri de date : -7 Pentru nurnaru l de Iinii ale triungh iului se foloseste variabila n. -7 Pentru me morarea triunghiului se folose ste matricea a , pentru [ memorarea sumelor maxime - matrices s . iar pentru memo- ;1 1t rarea directiei de deplasare - matricea p . Toate aceste matri - a 21 ce sunt patrate , cu dimensiunea n .
o
:l n l Hil l Se folosesc urrnatoarele subp roqrame : -7 Subprograrnul c i tes te () - pentru citirea datelor din fisierul text. in fisierul text , pe primu l rand este scris numarul de linii, n , iar pe urmatcaree n rand uri numerele de pe fiecare Iinie a triungh iului. Numerele sunt separate prin spatiu . in urma executie i ace stui subprogram se creeaza matr icea triunghiului a. -7 Sub programul ini t () - irutializeaza linia n a matricei s cu elementele de pe linia n a triungh iului. -7 Subprogramul p_ dinamica - calculeaza valoarea solutiei optime (elementul 5 11 at matricei sumelor). -7 Subprogramu l a f isea z a () - afiseaza suma maxima ~ i solutia prob lemei folosind info rrnatiile din rnatricea p .
Strategia proqrarn ar li di namice este implementata astfe l: PAS1 . Se initializeaza linia n a matri cei sume lor max ime S cu ele mentele de pe linia n a matr icei triunghiului a . PAS2. Pentru urrnatoare ie linii ale matricei sume lor maxime incepand cu linia n-1 pana la linia 1, ex ec uta: PAS3 . Se calculea za suma maxima astfel: daca suma maxima S(i+1,j) - de sub elementul curer.t din triunghi - est e mai mare cecat suma maxima S(i+1 ,j +1) - de pe diagonala elementului curen t, atunci la elementul
Informatica
75 curent se aduna suma 5(1+1,j) si directia de deplasare este 1; altfel, la elementul curent se aduna suma 5(1+1 ,j+1) 'Ii directia de deptasare este 2.
Matricea t riunghiului - a Suma maxima = 20 1 2 3 4
Matricea sumolor
1
maxime - S 1 2 3
4
20
0
0
1
2
3
4
1
1
0
0
0 0
1
5
2
4
2
0
0
2
15
1
0
0
2
1
1
0
3 4
5
4
3
0
3
11
10
8
.s,
3
.z,
1
2
0
4
6
2
5
4
4
6
2
5
4
0
0
0
0
0
0
0
0
Matricea d irectiei de doplasaro - p
Prog ramul este : #include < £ s t r e a m. h > int n , a [20 J [2 0 1 , p [ 2 0 ) [20) , $[20] [ 2 0J ; fstream f ( "pdl .tx t " , i o s : : i n ) ;
void c.i t e s t e () {int i , j ;
f » n;
for ( i = l ; i < =n; i ++ ) for ( j~ l;j < ~i; F+ ) f» a [i ) [j ) ; f. cl ose () ; ) void .i n.i t ( ) (for (i n t i= l ;i:OI a[O][
adr
1
linia 0
I
a[0][ 1] 1
f
1
adr+2
I
a[ 1][0] adr+4
adreste
0
linia 2
linia 1
I a[1][1]
t
adr+6
4 0cteti
. ',.
•
1
linia 3
t~
z octeu
04~
I a[2][1] I
....
a12][0]
..
a[3][0]
d +12 a r
1
I
f
~I
a[ 3][11
adr+14
coloana 0 coloana 1
adresa de memorie care are valoarea consta ntei simbolice
a
Alocarea memoriei unei ma trice se face In mod contiguu , memor area elemente lor facan du-se linie cu linie, astfel Incat matr icea apare ca un vector de linii. Daca matr icea are m linii si n coloane , ea va avea mxn eleme nte. De exemp lu, matricea a are 4 x2=8 elem ente ;;i este rnernorata ca un vector eu m elemente de tip vector cu n elemente , care au tipul de baza al matricei (in exemplu, un vecto r cu 4 elemente de tip vector cu 2 de elemente de tip int). Zona
94
Implem entarea st ru ct ur ilor de dale
de memorie alocata unei matrice are dimensiunea m x n x stzeofttipbaza). in exemplu, rnatricei a j se aloca 0 zona de memorie de 4x 2x sizeof(int) =4 x2 >x i co o cc-c" - 'J : ". c.i.noc-b - c-y : / /:::::::: ca Lcu LcazS va Loz u-e a va r i.ab.i.Lc.; di nam i c e fo Los.i t;e pont ru d.i st.e.nt.a *.j =- sqrt (pow {a- > x - b - > x , 2 ) +pow (a- > y - b - > y, 2 ) ); ! / 51? a ~i$ e a z a. va Loa rea va r Lab iL e L di. nami.c e £010 3 i t.e pent r u d t s uant a c out«" d i s t a n t a d i n t re punc te le a 3i beste "« *d ; I I s e c Li b e r ec zu z cria d e memor Le n Ioc a t a v e r i ab iLeLc r d i.n um.L c c (3) d el ete i:J ; del ete b ; delete d ; }
Enuntul p roblem ei 3: So citesc de la Insta/ura n numero intrcgi cam sa mem oreaza intr-uo vee/or. Sa se iovorsozo voctor ut in el insus! §i sa so etiseze vectotul dupa inversare.
Se totoseste alocarea dinarnic a a s tructurii de date de tip vec to r. Pentru refer irea nurnarului de elemente ale vectorului se toloseste pointerul n catre tipul int, iar pentru referirea variabilei prin intermediul careia S8 mterschirnba d0\13 elemen te ale vectorului se foloseste pointeru l aux catre tipul int. Pentru referirea vectorulu i S8 foloseste pointerul p catre tipul int r n]. Acest pointer indica 0 zona continua de nxsi zeof(int) octeti, n reprezentand valoarea citita de la tastatura pentru numarul de elemen te ale vectorului ~i care este referita de pointerul n . Pointe rii q !?i r catre tipul int se folosesc pentru a parc urge zona de memorie atocata vec torului in vedere a prelucrarii elernentelor lui. #i n c l u de < i 0 s t r e a m. ~ >
#i r.c l ud e< ma t h . h > v oid ma i n ( ) / / .'H] d oc La r S po i.n t.c r.i i (1) l in t *p,* q, * (, * n,* a u x; //!; e; a Loc a memo ri.e pe nt. ru vo r iab i.I o I e dLn emi .ce (2) ne .ne w int; au x -n e v i n t ; c c u t c -cvr. > " ; c in» * n; p = n ew int[* n] ;
l i se fo r
c ite~c
de la tus: a tu r5 vulorile pent r u
e lemen~ele
ve ctorulu~
(q ""-" p ; q < t i p _ 2>
< i ~ fo , , 21 > , < i n f o 22 > ,
, ; , < i n f o 2n > ;
117
Info rm ati cii < t.i p~m>
< i n f o _ ml>, < i n f o_ m2>,
< i n f o_ mn>;
nod " u rm r L :
nod *prim , *u l t i m , *p ; Carnpurile < i n f o _ i j> sunt carnpurile cu inforrnat ii, iar carnpul urm este un cam p de tip pointer catre tipul de baza nod ~i cont ine intorrnatia de leqatu ra (adresa urrnatorutui nod din lista). Aeest tip de i nre gistrar e se nurneste inregistra rea au to re ferita. S-au declarat variabilele de tip ad resa a unei i nreqistrari de tip nod: -7 *prim ~i *ul t i m pent ru a memora adresa primulu i nod , respectiv a ultirnu lui no d ; ele va ajuta sa ldentificati extrernitatile listei; -7 * p pen tru a memo ra adresa unui nod curent din lista (este folosit pentru parcurgerea listei). in lisle, algoritm ii de inserare si eliminare a unor nod uri din structura S8 sirnplifica foarte mult 7 Inserarea unui nod consta in alocarea zonei de mem orie in care S8 scrie nodul si legarea lui la structure (stabilirea legaturii eu predeeesorul si eu sueeesorui lui). ?' Eli min area unui n od consta in ruperea nodului din structur e, prin legarea predeceso rului sau cu suc cesorul lui, ;;i eliberarea zone! de memorie pe care a ocupat-o.
2.6.2. Clasifica rca listclor
- I
' --:L-;is-:te - :7 1in-:ia-re-
!
."
."
."
Liste generale Nu exlsta restnctii pentru operatiile de mserare $i sterqere a elementelor din lista (se pot face in ortce pczitie a listei),
Uste restrictive Exista restrictii pentru operatiile de inserare $i sterqere a elementelar din lista (se pot face numal la extrernitati).
.
Stiva Operatiile de introducere si extragere a elementelor se pot face numai printr-una dintre extrernltati.
.
Usta simplu Inlantuita Fiecare element pastreaza legatura cu un singur vecin (de obicei. succesorul).
.
..
I
Coada Operatia de introducere a elementelor se face pe la 0 extremitate, tar extragerea elementelor - prin cealalta extremitate.
Lista dublu inlantulta Fiecare element pastreaaa legatura cu ambii vecini (succesorul $i predecesorul).
.
Usta circulara Este 0 flsta in lantuita in care elementul ult im se leaga de elementul prim .
A lgoritmii ce se p ot fo l os i po nt ru p re lu crarea Ii stelor: -7 initiali za rea Ii stci - se creeaza lista vida ; 7 c rca rea list ei - se adauqa repetat elemente la lista, porn ind de la lista vida; -7 insera rea unui c le me nt i n li sta - la i nceput, la sfa rsit , in inte rior; -7 ste rqe rea u n u i c le m ent d in l ista - la inceput, la starsit, in interior; -7 pa rc u rge rea liste i - se v iziteaza elementele tistei pentru a obtine inforrnatii: -7 c auta rc a in lista a unui cl eme nt care lndepline ste anumite co nditii: -7 sorta re a un ei liste ; -7 c o ncate n arc a a doua liste; -7 d ivi zar ca in dou a liste .
118
Im plcm cn tarca st r uct u ri l o r d e date
2.6.3. Agoritmi pcntnt prcillcrarca listclor simplll inlantllitc Lista simplu inlanluita
prim info
ultim
I urm ~ I
II. I
. f
In 0
I lI rm- 1
r.:::
I
info urm "--_---''-----J
info
INULL~
In Implementarea alqoritrnilor urrnatori S8 considers ca inforrnatia propiu-zisa este fermata nurnai dintr-un camp i n car e S8 rnernoreaza un nurnar i ntreg: ' s truc t n od {int in fo ; /linf o r ma 1;. ia p r c p r Lu-e z l s a nod *u r m;} ; l/in f orma1;;ia pent r u Leqe t u r a n od *pr i rn, *u l t i m, ~p ; j/pointe ri pe n tru e x p lo a t a r e a l i s tei in t x; . / /pen t ru valoare a ce s e atriliuie c empuIu i, eli I n fo rmat.L'i
in lista v id a atat nodul prim cat ~i nodul ult im nu exista, ~i adresa lor are valoarea NULL: prim = ult im ",. NULL; Starea de ll sta vida trebuie cunoscuta atune! cand S8 elirnina noduri din lista , deoarece in (isl a vida nu mai exista noduri care sa fie eliminate. Aceasta stare S8 testea za prin conditia : p r im = = NULL. Pentru testarea unei liste daca este vida se poate implementa functi a operand este_ v i d a ( ) care va furniza valoarea 1 ("adevarat"), daca lista este vida , ~i valoarea 0 (.tals") daca Iista nu este vida. i nt e s cejvLd e ( no d " p r i m) {return p rim ==NULL i l
2,6.3 .1. lnitializarea listei Prin acest algo ritm se c reeaza lista v ida . in acest caz, atat nodul pr im cat ~ i nodul ultim nu exista, ~ i Ii se atribuie adresa NULL. Imp lementarea algo rit mului. Se foloseste functia procedurala i n i t () ai carei parametri prim ~i ul tim de tip nod se transmit prin referinta. deoarece sunt pararnetri de iesire. v oi d i n i t (nod * &p r i m, n od *&u l t i m) {p r i m = ul t im=NULL i l
2,6.3.2 . Crearea listei Deoarece in alqoritrnii de prelucrare trebuie sa se cunoasca adresa prirnului nod, este importanta adauqarea prim ului nod la lista vida. Pasii alg oritmului de crcare a unei liste sunt: PAS1 . Se adauqa primul nod la lista (nodul pri m). PAS2 . Cat t imp mai exista informatie, exec uta : se adauqa un nod la lista.
2.6.3.3. Adauqaraa primului nod la lista in Iista cu un singu r nod , adres a de legatu ra a nodului pri m are valoarea NUL L - ~ i atat nodul pr im cat si nodul ultim au aceeasi adresa. Pasii executati i n aces t algoritm sunt: PAS1 . Se cere alocarea de memorie pentru nodul p r im. PAS2 . Se scrie inforrnatia in nodu l pr i m. PAS3 . Adresei de leqatura a nodului pr im i se atribuie valoarea NUL L. PAS4 . Nodului ul tim i se atribuie adresa nodului p r im. Implementarea algoritmulu i. Se foloseste Iunctia procedurala adauga_nod O ai carei parametri prim ~i ul t i m de tip nod se transmit prin referinta, deoarece sunt parametri de iesire. vo id ad a u g _n o d ( nod * &p r i m, no d *&u l t i m) {p r i m = new nod i p r i m- >info= x i pr im- >urm= NULL i ulti m=p rim ; }
Informatica
119
2.6.3.4. Adauqarea unui nod la lista Pentru adauqa rea unui nod p la lista , in functie de cerinte le problemei, S8 poate folosi unul dintre algoritm ii urrnatori : 1. ad auqaraa in fata pr imul ui nod ; 2. adauqarea dupa ultim ul nod ; 3. ad auqaroa l nt r-o po ziti e in in ter ioru l li stei.
Adauqare in tala primului nod Pasii executati in acest algoritm sunt: PAS1 . Se cere aloearea de memorie pentru nodul p. PAS2 . Se serie inforrnatia in nodu! p. PAS3 . Nodul p se leaqa de nodul prim. PAS4. Nodul p inserat devine nodul prim. Adauqare in fata pri mului nod
I
prim
1
ultlrn
~
inf o p
ij
info
@rnJ
G;3--+ info
~
] NULL ~
p devine nodul prim
Implementarea algor itm ului . Se foloseste functia procedurala adaugayrimO al carei parametru prim de tip nod S8 transmite prin reterinta, deoarece este parametru de intrare-iesre. void ada u ga...J'Jritn(n o d *&p r i m)
{no d * p ~ n e w no d ; p -> i nf o=x ; p -> urm=p r im ; pr i m~p;} Adauqare dupa ultimul nod Pasii executati in acest algoritrn sunt: PAS1. Se cere aloearea de memorie pentru nodul p. PAS2 < Se serie intorrnatia in nodul p. PAS3 . Nodul peste nod terminal (nu se leaga de nimie - adresa de legatura este NULL) . PAS4 . Nodul ul tim se leaqa de nodul p adaupat. PASS. Nodul p adaugat devine nodul ul tim. Adauqarea dupa ultimul nod
I
p rim
ultim info
urm ~ .......................................... ,
p devine nodul ultim
p ..
~
inf o
~
Im plemen ta rea algoritm ulu i. Se foloseste functia procedurala adauga_ultim() al carei parametru ul tim de tip nod se transmite prin referinta, deoarece este parametru de intrare- iesre. void a d a u ga...;..ult im( nod *&u l t i rn } {nod *p= ne w nod i p->info=x ; p~ >urm=NULL ;u lt im-> urm=p ; u l tim=p ; }
120
Im plemcnta rea struct u r ilur d e dat e
Adauga re a i n interiorul li st ci S8 poate face in doua modur i: a. dup a nodul cu adresa q ; b. in ainte de nodu l cu adresa q. Ad au g area i n i nterio ru l listei du pa nodul c u adrcsa q
Pasii aiqoritrnu lul sunt: PAS1. Se cere alocarea de me morie pentru nodul p . PAS2 . Se sene inforrnat ia in nodu l p . PAS3 . Nodul p se leaqa de succesorul nodului q . PAS 4. Nodu l q se leaqa de nodu l p adauqat. PASS. Daca nod ul q a fast ultimul nod , nodul p ad a uqat devine nodul ul tim. Adauqare dupii nodul q prim
I,I!
·, nl o
q->urm
I urm ,~ fIL' ~~·n~'~_l~~j Jl···.. In . I 0 I u rm J ur · . ~~ "':".f~' j, ••••
q p
ultim
I NULL,I
I""I' - ·' nI o-,..-----,
L~j. m iinfo lm"t¢r¢j:".J
Implemcntarca algoritmului. Se foloseste functia procedurala ada uga_ dupa () ai carei parametri sunt de tip nod : q (adresa nodului dupa care se face adauqarea), care se transmite prin valoare , deoarece este parametru de intrare, !iii ul tim (adresa ultirnului nod), care S8 transmits prin referinta, deoare ce este parametru de intrare-iesire.
void adauga. du pa( n od *q , { n o d " p v new nod ; p-csi.n f o e x :
r:.od
p -c-u rme q -c-u r m:
*& ul t i m)
q-c- u rur-p ,
i f
(q·== ul tim ) u l.f Ltr r-p r )
Adaugarca in inte riorul Iistei inainte de nodul de adresa q Pentru a adauqa nodu l p l nainte a nodului q , trebuie sa leqarn predecesorul nodului q de nodu! p . Dar, predecesorul unui nod nu este cunoscut. Adauqarea unui nod in lista inseamna, de fapt , inserarea i n lista a informatiei pe care 0 contine , i ntre alte doua informatii, !?i anume : informatia din predecesorul nodului q trebuie sa fie anterioara ei, iar informatia din Adaugare inaintca nodului q
(1) prim
q
I'_ _v 1_--'-_u_rm_ + +_ p
II
q- xurm
I NULLII
.v,,2.......,--,-_u_rm_ff_v_3_ ..lI_u_r_mf f = =V=4== = = = = =
•..
v2
ultim
I urm
f
(2)
p rim
I NULUI
121
In furmatica
nodul q trebu ie sa a urmeze. Ast fel, in lista nu se va adau qa nodul p i nainte de nodul q, ci dupa el, interschirnban d apoi informatiile lnt re cele doua nod uri. Pasii algoritmului sunt: PAS1 . Se cer e alocarea de memorie pent ru nodul p . PAS2 . Se cop iaza info rm alia din nodul q in nodul p . PAS3. Se sene In nod ul q inforrnatia care trebuie adauqata la 115t3. PAS4. Nodul p se leaqa de succesor ul nodu lui q . PASS . Nod ul q se leaqa de nod ul p adauqat. PAS6 . Daca nodul q a fast ultimul nod , nodu l p adauq at devine nodul u l t i m. Implementarca algoritmului. Se foloseste functia procedurala a d a u g a _ in_ f a t a () ai carei parametri sunt de tip nod: q (adresa nodului inaintea caruia S8 face adauqarea), care S8 transmite prin valoare, deoarece este parame tru de intrare, :;;i u l ti m (adresa ultimului nod) , care S8 transrnite prin referinta, deoarece este parametru de intrare-iesire. vo id oda u ga i n fa t a( n od *q, n od *&u l t i m) {nod * p~ new n o d; p ->infc~q -~info ; q- >inf o =x ; p - > urm~q -> u rm ; q- >u rm=p ; if ( q o:·~"'u l t i m ) uLt.Lmvp r }
2.6.3 .5. Parcurgerea listei Prin acest algoritm se viziteaza fiecare nod al listei , pornind de la primu l nod , pana la ultirnu l nod , in ordinea de lnlantuire a nodurilor - furn izata de adresa urm din nodu l vizitat. l.is ta se parcurge pentru a prelucra informatia stoca ta In noduri . Implementarea alg or itm ului. Se foloseste functia procedurala parcurge () al carei parametru prim de tip nod se transmite prin va!oare, deoarece este parametru de intrare. v oid p e rc u qe (noel " p rim ) {for (nod e p vp r i.m : p ! ""-NU L L ; ;'Y"' f) '- > lJ t:""m ) I/~e
p r e l u c r c ca za p->info;}
Atat vectorul , cat si lista sunt structuri liniare , iar algoritmii de parcurgere sunt asernanatori: Vc cto ru l Lis t a i de tip int pentru indlcele elementului P de tip pointer catre tipu l nod a! listei pent ru adr esa eleme ntul ui cu rent din usta curent din vector I uent ru oarcurocre p-prim - adresa primului nod din lista i=O- indicele prirnului element din lnitializarea vector ~c~!ia bi l~ p-p->u rm - pointeru lui i se atr ibuie i-i+1 _ se incrementeaza indcele Trecerea la eleadresa nodului urrnator m entu l urrnato r i- n - indicele i are prima valoare mar p NULL - adresa rnemorata in pointeru l Conditia de mare decat cea a ultirnului element p este cons tanta NULL tenninare Varia bila tolosfta
2.6.3.6. Cautarea unui nod in lista intr-o lista se poate cauta: 1. Nodu l care indeplineste 0 anurnita conditie , pe care 0 notarn cu co n ditie si care este exprimata pri ntr-o expresie lc qica ce contine eel putin un camp cu informatie din nod ; valoarea cond itiei este dependenta de intorrnatia stocata In ned . Alg oritmul este: se parcurge lista lncepand de la primul nod, in ordinea de lnlantuire a nodurilor, pana se gasel?te nodul care lndepl ineste conditia sau pana s-a ajuns la sfarsitullistei . 2. No du l care se gase~te intr-o anum ita pozit ie in tist a pe care 0 notarn cu poz. Algoritrnul este : se parcurge lista i ncepand de la primul nod, fn ordinea de inantuire a nodurilor, pima cand s-au parcurs po z noduri sau pana s-a ajuns la sfarsitull listei Implementarea algoritrnu lui . Se foloseste a tunctie operand cu tipul pointer catre tipul nod. In ambele variante:
122
Im pleme n ta r ea str uc t urilor de date
~ i S8 transmite prin valoare, deoarece este parametru de intrare ; -7 variabila lccala p de tip pointer catre nod se foloseste pentru parcurgerea listei - este initializata cu adresa prirnului nod ; -7 adresa nodului gasit S8 rnernore aza In po inte rul p care va fi ret urnata de functie .
-7 parametrul functiei este prim de tip nod
Varianta 1 nod *c a u t (n o d *p r i m) {for (nod * p~p r i m; p !=NULL && !c ond i t i e; p=p ->urm) ; return P i } Varianta 2 - Va riabi la lccala nr de tip int se foloseste pentru a nurnara pozit iile parcu rse - este inltializata cu valoarea 1. no d " c e u t t n od *p r i m, int p a z)
{n o d *p =p r i m; i n t n r= l; for ( ; p ! =NULL && n r u rm ,nr + +) ;
r etu rn p i }
2.6.3.7. Eliminarea unui nod din lista Dupa eliminarea nodu lui din pozit ia p din lista S8 va elibera zona de memorie ocupa ta de nod. Elim inarea unui nod S8 face numai daca lista nu este vida . Pentru eliminarea unu i nod din lista , In functie de situatie, se poate folosi unul dintre algori tmii urm ato ri: 1. e li m ina re a p rim u lui nod ; 2 . e li m ina rea ultimu lui no d ; 3. e lim ina re a unui no d d i n interi orulli stei. Eliminarea primului nod
Pas ii executati In acest algoritm sunt: PAS1 . Se salveaza adresa nodului prim In pointerul q. PAS2 . Succesorul nodulu i prim devi ne nodul prim. PAS3. Se cere eliberarea lonei de memorie de la adresa memorata In po interul q . Eliminarea primului nod p rim ·····...
u ltim
~ i:~?~ >f..~.~. ~ ~ info ~-i-n-fo ..,~ .'
".
succesorul nodului prim devine nod ul pri m
Implementa rea algoritm ului . Se foloseste functia proced urala e liminayrim O al carei para metru p rim de tip nod se transmi te prin referinta. deoarece este parametru de intrare-iesire. v oid e l imina_prim(nod * &p ri m) {no d q =pr im ; p rim"'p r i m->urm ; delete q ; } Eliminarea ultimului nod
Pasii executati In aces t algo ritm sunt: PAS1 . Se salv eaza ad resa nodului ulti m in pointerul q. PAS2. Se cau ta predeceso rul ultimu lui nod , prin parcurgerea liste i in ce pand de la primul nod , pim a la pred ec esarul nod ului te rm inal (nodul care nu se leaqa de nimic adres a de leqatura are valoarea NULL) PAS3. Predeces orul nodulu i ult im devine nod termin al (adresa de legatura este NULL). PAS4 . Predecesorul nodul ui ultim devine nodul ultim . PASS . Se cere el ibe rarea zo nei de memorie de la ad resa rnernorata I n po interul q .
123
Informatica Elim in area u lt im u lui nod p rim
--
.....
Im plemenlarea algoritmului . Se foloseste functia procedurala elimina_ultimO al carei parametru ul tim de tip nod S8 transmite prin referinta, deoarece este parametr u de intrare-iesire , v o id elim ina_ultim(nod · p r i m, n o d * &u l t i m) {nod *p ,* q =u l t i m; fo r (p=p r i m; p ->urm- >u r m l =NULL ; p=p ->u rm) ; p- >u r m=NULL ; ultim =p ; de le t e q i } Eliminarea unui nod d in inte rio r u l l istei
Pentru a elimina nodu l p aflat in interiorul listei, trebu ie sa leqa rn predecesorul nodului p de succesorul lui. Dar, predecesorul unui nod nu este cunoscu t. Elimin area unui nod din lista l nseam na de rapt elim inarea din lista a inforrnatiei pe care 0 con tine. Astfel, din lista nu S8 va elim ina nodul p , ci succesorul Sc3 U (care este cunoscut), dup a ce lnforrnatia din el a fast copiata in nodul p, Pasii executati in aces t algoritm sunt PAS1 . Se salveaza adre sa succesorul ui nodu lui p in pointe rul q . PAS2. Se cop iaza i n nodu l p toata informatia din succesorul lui (lnforrnatia propriu -zisa ~i inforrnatia de legatura). PAS3 . Se cere eliberarea zone i de memorie de la adresa memorata in poinl erul q. PAS4. Daca suc ceso ru! nodului p era nodul ultim , atunc i nodu l p devine nodu l ultim . Im plementarea algoritmului. Se foloseste functia procedura la el imina () ai carei parametri sunt de tip no d : p (adresa nodului care se elirnlna), care se transmite prin valoare, deoarece este param etru de intrare, ~ i ul ti m, care se transmite prin referinta , deoare ce este parametru de intrare-iesire. v o i d elimina(nod *p, n o d * &u l t i m) lnod *q =p - >u r m; p - > i ~ f o= p -> u r m - > i n fo ; p ->urm =p-> u r m ->u~m ; dele te q i i f ( p - > u r m= ~ NULL ) ultim=p ; }
2.6.3.8. El iberarea spatiului de memorie ocupat de llsta Oaca in cadrul unei aplicatii care prelucreaza mai multe liste, nu mai este necesara una dintre ele, se va elibera int regul spatiu ocupat de lista. Prin acest algor itm se viziteaza fiecare nod allistei , pomi nd de la prim ul nod, pima la ultimul nod, i n ordinea de lnl antui re a nodurilor _ furnizata de ad resa urm din nod ul vizitat, si se elibereaza zona de memorie ocupata de fiecare nod. Pas li executati i n acest algoritm sun t: PAS1 , Se initializeaza pointeru! p cu adresa primului nod din hsta - prim (p
struct n o d {int i nfo ; nod * u r m;}; int n ; void a da u qa __no d (nod *&p r i-m) { p r Lm-c n e w noti , p r i.rrr-c- i n f'o 'i nfo =q - >i n [ c i q- >i nfo=n ; q -c-u rm ep r I void a d eru q ai u Lt Ern Lr iod *q } {n o d *p= n e w no d ; p,.->in f Q=n; q- > urrn=p; p -> u r m=NULL ; } nod * c au t.a (n od * p c.b n l {n o d * q =p r i m ; while (q - > i n f o urm! ""NULL) q - q - c- u r m. retu r n q ; }
void
Df i s ar~(nb d
*p r i m)
{for ( nod * p =p r i m; void main ()
p ! =NUL L ;
p wp - c-ur ru) cout.ccp - oL n to c c '' " ;}
{n o d *p r i m,* q;
cou t .c-c vn uma r "; cin»n; aci d uga_ncd (prim ) ; / /S e a dau g a primu l nod c o u
t
c
c
vn u m a
r
";
while (n ! =0 )
c
i. ncc-n
/ /C ~lt
:
t i mp ma i. e x t s t
z
.i.nEo rm e t. Le d e a cle u qe t;
( q =c a u t a (p r i m); I/S~ caut ~
no d u l q in a i nt e a c~ rui a trebu j.e adb ug at n odu l p /I Dac5 s - .« a j un s I a a f a rs i.t.u .I Ld s t. o i. 2 d a uga:.;..ult irn( q) ; I lnodul p s e a de.uqf ce ul tirn n od else adau ga in ra ta (q) ; I in odul p se aciau q a i n f a t.a rrcciu.Lu L q if
(q-c i n I'o -cn)
cou t.c -cv n uma r- "; c i n » n ; } a f is a r e f p r im Lr } li Se afi o;> cClzJ.in f o n na ;': i i l e din l i E;ta
Varianta 2 - Se porneste de la lista care contine un nod santine la (un nod care ma rcheaza sfarsitul liste i). Acest nod con tine ln ca rnpul cheie 0 inforrnatie care are 0 valoare care face ca el sa fie intotdeauna ultimul nod din lista (de exemplu , In cazu l unei liste ordonate crescator, I n care ca rnpul folosit pen tru ordonare este de tip i nt, se ada uqa un nod care are In acest camp cea mai mare valoare pen tru tipul int - MAXI NT). Cand se va afisa lnfo rrnat.a d in lista. ultimul nod din lista nu S 8 mai af iseaza. Pasii executati in acest algoritm sunt: PAS1 . Se adauqa nodul santinela la lista. PAS2 . Ca l limp exista info rrnatie de adauqat ex ecut a PAS3 . Dac a infcrmatia care se ada uqa tre buie sa fie la i nceputul listei, atu nc i se adauqa noul nod ca prirnu l nod din list a si S8 rev ine la Pasul 2; a ltfe l, S8 trece la pasul urmator. PAS4. Se cauta nod ulTnaintea caruia trebui e adauqat nou l nod. PASS. Se adauqa noul nod in fata nodul ui gas it S8 revine la Pasul 2. tmp lemcnta rca al go ritm ului. #include < i o ::; t r czun . li> #include < v 2 l u e s. h > struc t nod {int info ; n od * u n n; }; int n ; v o i d a d auqa s a n t. Lne La (no a v Sp r Lm) {p r i m=new nod ; pri m-> inro"'-MAX.I NT ; pl~ i m- > u r m =-'- NUL L ; } vo id e da uqe p t i m .t n'od * &p r i m) {n o d * p =new nod ; p -c- Ln I'o cn , p -c-u r m- p r im . p ri.rn e-p i } void adauga~in_ fata (nbd *q ) {n o d * p ~new nod ; p-> lJrm =q-> lJrm ; p->i ll£o= q ->lnfo ; q - > i n £ o = !l; q ->urm =p ; }
126
I m plem cn ta r cu srructu ril or dc datc
nod *c a u t a (flo d * p r j m) { n od *p =p r i m; fo r ( ;p - > info < n i p ~p-> u r m) ; retur n pi } v oid a f is a re (n o d *p r i m) / I Nu se a fi g ea za Intcrma t.La d i n u ltimul nod {f o r (n o d *p = p r i m; p -> u rm ! =NULL ; p=p ->urm) c o u t «p-> :i. n f o « " " ; } v oi d ma in ()
{ nod *p r i m, *q ; ad a uga _s antinela( pr im ) ; / IS e adauga nodul santi nela cou t .c-c vn uma r " ; cin»n ; wh i le (n != O) II Cat timp mai e x ista i n f o r ma tri e d e a d a u ga t {i f (n-cp .r i ru-o Ln f o ) j *Dac a .i nf o rrnat.La tr ebuie sa
fie
10.
incepu tu l li s tei */ a d a u g a_p rim( pr in) ; /I n o du l p seada uga co. p r i m n o d e l s e { q = c a ~ t a ( p r i m J; I/Se c aur a no d u I q Ln a.Ln t e a ca r u i a t r eb u t etac au c c t rro d u.l, a d a ug a ~ i n ~fata
0
(q) ; } / I nodu l p s e ad auga in f a t a n odu lu i q
cout« "numar "; c in»n;} a f i s a.re (p r i m) ; }
Algoritmul de interciasare a doua liste ordonate Acest algoritm fo lo sest e ace lasi princip iu ca ,i aigoritmul de inte rclasare a doi vectori ordonati . Cele do ua liste sunt ordonate dupa ac elasi ca mp cheie ~j crite riu de ordonare ~i S8 obtine 0 a treia lista care contine infcrmatia din primele doua liste ordo nata dupa acelasi criteriu, folosind ace las i camp cheie. Pasii ex ecutati i n acest algo ritm sunt: PAS1 . Se creea za Lista 1 ,i Lista 2 ordonate dupa acelasi criteriu si dupa acelasi camp cheie. PAS2. Se adauqa primul nod la Lista 3 astfe l: daca in co nfo rmitate cu criteriul de ordonare folosit treb uie ad auqata intorrnati a din pri mul nod al Listei 1, at u nci se adauqa inforrnatia din nodul p rim al l.iste i 1 ;;1 In Lista 1 S8 trece la succesorul nodul ui prim , iar in Lista 2 la nodu l p rim ; altfe l , S8 adauqa inforrnatia din nodul pr im al Liste i 2,i i n Lista 2 se trece la succesorul nodulu i p rim , iar i n Lista 1 la nodul pr im . PAS3. Cat timp nu s-a ajuns la starsitul List ei 1 sau al Liste i 2, exec uta : PAS4. Se adauqa la Lista 3 un nod dupa ultimu l nod astfel : d ac a i n conformitate cu criteriul de ordonare folosit trebuie adauqata informatia din nodul curent al Listei 1, atunci S8 ada uqa inforrnatia din acest nod ;;i in Lista 1 S8 trece la succeso rul nodului curent, altfel , se adauqa informatia din nodul curent al Liste i 2 ,i i n Lista 2 se trece la succesa rul nadulu i curent. Se revine la Pasul 3. PASS . Da ca s-a ajuns la sfarsi tul l.istei 1. at unc i la Lista 3 se ad auqa dupa ultimul no d nodurile rarna se in Lista 2; altfe l, la List a 3 se ad aug a dupa ultimul nod nodurile rarnase in List a 1. Imp leme ntarea algoritm ului. i n implementa rea algoritmulu i s-au folosit liste pentru care carnpul cheie este de tip numeric intreg , iar ordonarea este crescatoare dupa valoarea carnpului cheie . Numerele care trebuie memorate i n nodurile listelor se citesc de la tastatura in variabila n pana se citeste valoarea a (are semnificatia ca nu mai exista intorrnatie de adauqat). Din subprogramele i n care nu este necesara informatia despre adresa ultirnului nod au fost eliminate prelucrarile care se retera la acesta. Cele trei liste se ldentifica prin adresa primului nod (p rim! , p r i m2 si respectiv prim3). Deoarece in acest algoritm nu este necesara intormatia despre adresa ultimului nod, din subprograme au fast eliminate prelucrarile care se refera la acesta Pentru parcurgerea celor doua liste se folosesc pointerii q ~i respectiv r , iar pentru lista care se creeaza prin interclasare - pointerul p .
Informa tica
127
#include s t r u c t nod t int in fo ; nod *u r m,'}; i nt n ; vo id a d auga,..:..Dod (nod * &p r i m) { p r i.rne n e w nod ; p r i.m-c-i.n f o e n : p r i.m-c-u r me Ntrl.L r }
v o i d adaug3_in:....-f at a (no d *q ) {nod * p = new hod ; p -> u rm=q ->urm; p ->info=q->info ; q - >info=n ; q - c-urm e-p r } v o i d adauga ultirn (nod * q )
{n od *p =new nod ; p->info~n ; q-> u rm ~p; p ->urm=NULL; } nod *c a u t a {n o d *p r i m) {n od *p =p r i rr.; while {p - > i n f o < n && p ->urm ! =NULL ) p =p - > u r m; r e t urn p i } v oid creare(nod *&p r i m) liSe creeaz a 0 l ista ordonata {nod *q ; oou t .c-cvn u ma .r " ; cin » n ; e da uq a j nod (prim) ; cout«" n u rua r " ; c i n» n ; whi le (n ! =O} {q =c a u t a (prim ) ; i f (q ->irlfoinfo>9r~m l->in fo) {n = p r i ml - > i n f o ; qe p .r im L - o u r m, r~ pri m2 ; } e lse { n = p r i rn2 - > i n f o ; r =pr im2 ->urm ; q =pr iml; ) adaug a nod (pr i m3 ) ; p=prim3 ; wh i le (q ! = O && r ! = O) {i f (r -> info >q - >i nfo) {n e q-o Ln f o , q e-q - c- u r rrij } else {n= r- >i n f o ; ra r -c- u rm r j :ldau!;Ja~ulti m{p ) ; p vp - c-urm r I if
(ql ~O)
wh i l e e lse wh i l e
(q !=OJ
{n =q - > i n f o; adau qa u Lt irn tp I • p vp -c-u rrn . ,q =q - >u rm ; )
t r ! = 0 ) {ne r -c-Ln fo , a dauga _ult i.:Tl (p ) ; p-p-c-unn. rvr-c-urm . I a£isareip rim3J ; ) / /Se afi$eaza info rma\=. i ile din lista interc lasata
2.6.3.10. Prelucrarea listelor simplu inlantuite Rezolvarea problemelor i n car e orqanizati datele sub forma de liste presupune folosirea algo ritmilor prezentati, astfel: 1. Se creeaza lista prin folosirea urrnatorilor algoritmi : -7 Se adauqa primu l nod la lista vida (algoritm ul pentru ad auqa re a la llsta a primului nod ). 7 Se adauqa cate un nod la lista. Pozitia in care se ada uqa nodul depinde de cerintele problemei. Daca lista nu este ordonata, adauqarea se poa te face la starsitul
128
lmplcmcn tarca structurllor de date sau la inceputul lisle i (algori tm ul pe nt ru ada uqa ro la i nc ep ut ul sau la s ta rs it u' list ei ). Daca lista este ordonata , S8 parcu rge mal in tai lista pentru a gas i pozi tia de ins erare (a ig o ritm u l pentru c auta roa unui nod i n tista) dupa ca re S 8 inse reaza noul nod In po zit ia gas ita (a lgo ritm u l pentru ada uqaro i n i nte r io ru l li stei ).
2.
Sa intretino l ista prin folosirea urrnatorilor algoritmi : -,) Se adauqa noi nod uri la lista . Ca ~i la crearea liste i, i n functie de cerintele probleme i S8 va folosi unul dintre algoritm ii de ada u qare. -,) Se elirnina noduri din lista . Mai inlai se parcurge lista pentru a gas i nodul care se elimina (al goritm ul pentru ca ut arc a un ui nod i n lista ) dup a care S8 elirnina nodul din pozitia gasita folosind unul dintre alg ori tm ii pent ru climi nare - in fu nctie de po zitia in ca re a fast gasit nodul. 7 Se mod ifies inforrnatia dintr-un nod al listei. Mai i ntai S8 parcurg e lista pentru a gasi nodul in care se va mod ifica informatia (aigoritm ul pe ntru cau ta rca unui n od in lista). Oaca lista nu este ordonata sau daca inforrnatia care se rnodifica nu face parte dintr-un camp cheie dintr-o lista ordonata, se rnodifica valoarea carnpulu i respe cl iv. Daca lista este ordonata si, prin modificarea valori i carnpului, se poate distruge aceasta ordonare, se modifica valoarea carnpului, se salveaza inforrnatia din nodul listei l ntr-o variabila intermediara , 58 elirnina din vechea pozitie (algoritm ul pe ntru c li m inarca un ui nod di n Hat e). se parcurge lista pentru a gasi noua pozitie (algo ritm ul pen tr u cautarea unui nod in lista) ~i 58 insereaza nodul in pozitia gasi!a (algoritm ul pentru ada uq arc a un ui nod la lis ta).
3.
Se obtin inforrnatii din Iista Se par curge lista (algo rit m ul de parc urge re a li sl ei) si se vizitea za fieca re nod allistei pentru a extrage din el inforrnatiile necesare.
[Swmu de cmz I Seop: exempl ificarea modului i n care , pentru rezolvarea prob leme i, folositi algo ritmii de prelu cra re a listelor simplu l nlantuite ~ i implementarea lor cu ajutorul subprogramelor. Enunt ul pro bl em c i 1. So citosto dintr-un fi§ier taxt lin sir do numere separate prin spatia cu care se creeazD 0 listfi simplu inlan tllita in ordinea in care sunt citite numoroto din tisior. Sa so vcrifico (facti tiste coutine numoi numere distincte §i opo! sa se tuiouqe dupa fiecam Ill/m ar impar "din lista vetonroe 100 §i sa S8 etiseze numctete din tiste. Penuu testarea prog ramu!ui se vor folosi aou« setuti do numere: (2, 5, 10, 3. 8) §i (2. 5. 10. 5, 8, 7) . Nodur ile listei nu sunt ordonate conform unui criteriu . Nume rele se vor cit: din fisier ~ i 58 vor scrie in lista prin adauqare dupa ultimul nod . Proble ma se desco mpune i n urrnatcare le subproblerne. iar algoritmul de rezolvare a unei subprobl ems este implemental cu ajuto rul unui SUbprogram:
iE1l Se crteste
primul num ar din fisier si se adauqa primul nod la lista (nodul prim ) subprogramul adauga no d () . ~ Cat tim p mai exis ta num ere in fisier exec uta : se cite ste un nurnar din fisier si 5e adauq a un nod cu num arul respe ctiv dupa ultimul nod din lista - subpr ogramul adauga ul t im () . ~ Se ver ifica daca num erele din lista sunt distincte, astfel: se parcu rge lista de la primul nod pana la penultimul nod si se venfica daca nurnarul din nod ul curent mai exista i n . nodu rile care urmcaza dup a el pana la sfarsitul listei - subproqrarnul distin cte () . ~ Se parcurge lista de la primul nod pana la starsitul ei si daca numar ul din nod este impar se adauqa dupa el un nod care contine valoarea 100 - subproqrarnul p rel ucrare ( ) .
129
Info rmatic a
~ Se parcurge lista de la primul nod pana la sfarsitul ei si se afis eaz a inforrnatia din fieca re no d - sub prog ram ul afi s are ( ) . #inc lude < f s t r e am . h > struct n o d t int i nfo ; n o d * u r m;) ;
fs tream f( " Li s r.e l . t xt" , i 0 5 : : in ) ; in t n i void a d a u g a ,.;n o d (nod *&p r i m, nod *&u l t i m)
{p r i m=new nod ; prim ->info=n ; p rim ->urm=NULL ; ul t im=p r i m; } void adauga_ultim(nod *&u l t i m)
{nod
* F ~new
nod ; p->in fb=ri ; p-> u r .m=NULL; u lt i rn->urm= p ; ultim=P i }
v o id ud auga~dupa(nod * &q, nod *&u l t i m) {n o d *p zonew nod ; p ->info =100 ; p ->urm=q ->urm ; q ->urm=p ; if (q==ultim) illtim=p ;} d l s t l ~ c t e ( n o d *p r i m) {f or (n o d *p """p r i m; p->urm!:=.NULL ; p=p ->u rm)
in t
fo r
(nod * q =p - > u r m; q !=NULL ; q =q->urm) if (p ->info==q->info ) retu r n 0 ;
re turn I ; } v o i d prelucrare(nod *p r i m, nod * &u l t i m) {fo r (no d *p =p rim ; p ! o;,o NULL; pe p -c-u r m) if (p ~ >infD %2 = = 1 ) adauga_dupa(p ,ultim) ; } v o i d a f is a.r e (nod " p r.Lm ) { for (nod * p=p r i m; p! =::oNULL ; p ep-c -urm) c cutx-cp - o i n foc c '' ". void ma in () {n od e p r Im , * u l t i m; f > > n adauga nod(prim ,ultim} ; wh i le (f »n ) adaugaultim(ultim) ; f of o s e t j , if i st t t p Lm ccc l sun t ti
cout-ocendf , }
i
{ d
L n c
e
r
l
)
c
.c -c
v z
I
c
m
e
n t
e
e
d
i . s
n c
t e v
c
c
e
n
c n
.
else cou t-cc ve Iement.e Le n u s un t dt s t i n c t e.vccen d f • prel uc~a re (prirr ,u ltim ) ;
afisare(pr im ) ; }
Enuntul problemei 2. Se citeste dintr-un tisier tex t un numet cu maxim 20 de cifre. Sa se verifice daca nurnarul esle palindrom. Pentru testarea programului se var folosi oou«
numere: 1234321
§i
12345.
Se vor crea doua liste: una cu cifrele nurnarului citite din fisier. prin adauqa re dup a uJtimul nod, iar a doua, cu cifrele memora te Tn nodurile primei liste prin adauqare In tata primului nod ;;i S8 vor campara cele doua liste. Din fisier se va citi fiecare cifra a nurnarului intr-o variabila de tip char si se va obtine cifra scazand din codul ASCII al caracterului citit codul ASCII al cifrei O. Cele doua liste se identifies prin adresa primului nod (prim 1 si respec tiv prim2) ~ i prin adresa ultimului nod (ultim1 ~ i respectiv ultim2). Problema se descompune in urrnatoare!e subprobleme , iar algor itmu l de rezolvare a unei subprobleme este implementat cu ajutorul unui subprc qrarn citeste primul nurna r din fisier ~i se adauqa primu l nod la Lista 1 (nodul prim1 ) subprogramul adauga n od ( ) . [E] cat timp mai exista caract ere in fisler, executa: se cites te un caracter din fisier, se converteste In cifra si se adauqa un nod cu citra respectiva dupa ultimul nod din Lista 1 - subp rogramul a d au g a u l t i m () . ~ Se ada uqa primul nod la Usta 2 (nodul pr im2 ) care va contine infor matia din primul nod al Liste i 1 (prim 1) - subpro gram ul adau ga nod()
IE] Se
130
Im(ll em entarea st ru ct u r ilor de date
~ Se parcurge Lista 1 de la succesorul primului nod pana la sfarsitul ei ~i se adauqa un nod cu citra respectiva inaintea primului nod din Lista 2 - subprogramu l adauga prim () .
~ Se parcurg simultan ambe le liste de la primul nod pana la sfar~ it ~i se v erifica daca sunt eg ale cifrele memorate i n nod ul curent din cele doua lisle - subprogramul p alindrom ( ) .
#includ e < f s t r e a m. h > s t r uct n od ti n t in f o ; nod - u r mr l • f s t r e a m f( "1 is ta 2 .t xt " , i o s : :i n ) i int n ; v o id adauga no d {nod * &p r i m, nod * &u l t i m) {p r i ;no:= new nod ; p rim->infoo=C1 ; prim->urm=NULL ; ul tim=prirn. ; } vo i d adaugu_u ltim (nod * & u l ~ i m ) {n o d *p =new nod : p ->info=n ; p ->urm=NULL : ultim ~ > urm=p ; ul t im=p ; } vo i d acta ug a_ prim (nod *&p r i m) { n o d - p v n ew nod ; p- >i n f o=n ; p -c- u rm ep r Lm, p r Lm-p r j i n t pa l i nd r om(nod *p r i ml, nod *p r i m2 ) { nod " p , *q ; f o r (p=priml , q =p rim2 ; p ->urm! =NULL ; p=p-> u rrn, q =q - >u r m) if (p ->in fo !=q->info) r eturn 0 ; r eturn I ; } v o i d ma i n ()
{cha r c ; nod * p r i m l , * u l t i ~ l , * p r i rn 2 ,* u l t i m 2 ,* p ; r » >c • n=c - 'O ' ; adauga nod Lpr Lm l s u Lt i mLj r whil e (f»cl ( n =c - ' O' ; a d a u g a _ u l t i m(u l t i ml ) ; } f . c l o s e ( ) ; n=priml ->info ; adauga _ nod(~rim2 ,ul~im2l ; f o r (p=priml - >u rrn ; p != NULL ; p=p->u r ml {n=p - > i n f o; ada u ga _p rim (pr i m2 ) ; } if (pa l ,indrom (p rim l ,pr im2) ) cOllt«" Es Le pa lindro m" ; el s e co ut« " Nu estc p a lind rorn " ; } Enuntul problemei 3. Se citeste dintr-un fi§ier text un :;ir do numere separate prin spa(iu cu care so creeaz8 0 lista simplu inl8n(uita in ordinea in care suni cilite numerele din Iisler. Se moi cnest« de /0 tastatura un numar x. Sa se caute $i sa se $tearga din list» nodu/ care contine acest nutner. Pentru testarea program II/IIi se va tolosi situt de nllmere: (2, 5. 10, 3, 8). iet pentru x patru vetori: 2. 5, 8 $i 7. Nodurile listei nu sunt ordo nate conform unui criteriu . Numerele se vor citi din fisier ~i se vor scrie i n lista prin adauq are dupa ultimul nod. Problema se descompune i n urrnatoarele subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplementati cu ajutorul subproqrarnelor:
[i>] Se citeste
valoar ea pentru x de la tastatura. ~ Se citeste prirn ul nurnar din fisier si se adauqa primu l nod la lista (nodul prim ) subprogramul ada u g a nod ( } . ~_ C a t timp rnai exi sta numere i n fisier ex ec uta: se citeste un nurnar din fisier ~i se adauqa un nod cu nurnarul respectiv oupa ultimul nod din lista - subprogramul a d a u g a u l tim () .
~ Dac a prim ul nod din lista contine numarul x , atunci se elirnina primul nod (subprogramul e limi n a _ p r i m ( )) ; altfel , se cauta predeceso rul nodulu i ca re contine nurna rul x (subprogramul cau ta () ) si da ca se g ase~te aces t nod, atunc i se sterqe nodul care urmea za d u p a el (subprog ramul el imin a _ u rm () ).
Informa tic a
131
~ Se parcurge lista de la primul nod pana la sfarsitul ei si se afiseaza inforrnatia din fiecare nod - subprog ramu l a f Ls er-e () . #i n cl u d e struct nod tint info ; n o d - u rm r j •
f s t r e a m f ( " lista3 . t xt " , ios:: in ); i nt n ,x ; void edauqa nod (n od *&p r i m, nod *&u l t i..'u ) {p r i m=new nod ; u l t i m=p r i m; prim->info=n ; p rim->ur.m=NULL ; } v oid adauga_u l tim(nod *&u l t i m)
{nod *p =-new nod ; p ->info =n ; p ->urm=NULL; n od
* cauta {nod
ult~r.l ->urm=p ;
ult.i.m=p ; }
~p )
&& p ->urm->info!=x) p=p->urm; return p ; } v o i d elirnina prim (n od *&p r i rr.} {nod *q =p r i m; prim=prim ->urm ; del ete q ; } void elimina_urm(nod *p ) {nod *q =p - > u r m; p ->urm=p->urm->urm ; delete q ; } vo i d afisare(nod · p r i m) {f o r {nod *p =p r i m; p ! =NULL ; p =p - > u r ml cout« p - > i n f o«" ": cout«endl;} void mai n ( ) {n o d e p r i m, "u l c i m, "'p ; cou t.c-c" x e " ; cin» x; f »o ; adauga~nod (prim , u ltim) ; while (f»n) Ddauga_ul~im(ultirn) ; f . c l o s e ( ) ; if (prim-> info==x) elimina prim(prim) ; e lse {p =c a u t a (p r i m) ; if (p - >u r m! =NULL ) elimina_urm (p ) ; } afisa=e(prim ); } { w h i l e ( p - > u~m ! =NULL
Enuntul problemei 4. Se citeste dintr-un tisier text un ~ir de numere separate prin spatiu cu cam se creeaza 0 Iista simplu inlantuila in ordinea in care sunt cilite numerele din tisier. Sa se eiimine din tist» vetotite care se reoete, in afara de prima lor aparitie. Pentru leslarea programului se va tolosi §irul de numere: (2, 4, 9, 9. 9, 6, 2, 9, 9) . Nodurile listei nu sunt ordonate conform unui criteriu. Numere le se vor cifi din fisier ~ i se vor scrie in lista prin adauqa re dupa ultirnul nod. Problema se descompun e in urrnatoarele subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplernentat i cu ajutorul subprogramelor:
:E1I
Se citeste primul nurnar din fisier si se adauqa primul nod la lista (nod ul prim ) subprogramul adauga nod ( ) . ~ Cat timp mai exista nume re in fisier executa : se citeste un nurnar din fisier ~i se adauqa un nod cu nurnarul respectiv dupa ultimul nod din lista - subprog ramul adauga ul ti m () .
~ 5 e elimina din lista valorile care se repeta, astfel (subprogra mul prel ucrare () ): Pentru un pointer p care indica fiecare nod din lista , in cepand cu primul nod pfma la p.enultimu l nod , exe cuta : -7 Se initializeaza pointerui q cu adresa nodul cure nt (indicat de pointerul p). -7 Cat timp pointerui q nu indica ultimu l nod, executa: daca nodul indicat de pointeru l p contine acelasi nurnar cu succeso rul nodului indicat de pointerul q ,
132
lmplcrn enrarea st r uc t ur ilo r d c date
atunci S8 elimina succesorul nodului q (- subpro gramu l e Li.m.i .na u rm n ): allfel, pointerul q indica succesorul nodulu i. ~ Se parcurg e Iista de la primul nod pana la sfarsitul ei ~ i se afiseaza inform alia din fiecare nod (subprogramu l afisare ( ) ). #incl u de struct n o d lin t in f o; :
!
nod
f s t r e am
* u rm ; } ;
f { " lis~a 4 .t x t " , i o s : : i n ) ;
int n ;
voi d adau g a n od (nod *&p r irn , nod * &u l t i m) {p r Lm- n e w nod ; pr Lm-c-Ln fo e x , prirn->unn=NULL i ultim=prim ; } v oid a dauga _ult im{nod * &u l t i m}
{nod *p =n ew nod ; p- >info=x ; p->urm=NULL ; u lt im->urrn=p ; u ltirn=p ; } v o i d e limina _ urm (n o d *p } { n o d * q=p - > u r m; p-> u r :n=p-> urm ->urm ;
delete q; }
void p~el u crare (no d *p r i m) {::o d *p ,* q ; fo r ( p =p rim ; p - >u rm!~ NULL ; p=p - > u rm)
{n=p->i n f o; q =P i whi l e
{i f
(q! =NULL)
(q-> urm!=NULL && q ->t: rm-> info="'-'n) elimi na_urm(q) ;
e l s e q =q ->urm; } } } void a fisare{ncd * p r i rn) {f o r (nod u Ym) cou t ccp - c- Ln f o -cc" "; cou t« e ndl;} void ma i n {} { ~ o d *p r i m, * u l t i m; f» n; ad aug a_nod( p r i m,ultiml ; while (f » :1) a dauqa_u l t i rn (u l t i m); L c l o s e (} ; p re I ucr a re (p r i m) ; afisa r e (p r im) ; }
En untu l prob lemei 5. Adunarea a dOlla potinooma. Se citesc oimr-ut: Iisier text de pe prima linie un numar n1, care teprezinte numiuut oe coeiicienti nenuli oi utiui palinom, apai do pe urmatoarele 111 linii coeticientii nenuli §i gradlll, de pe tinie urmatoare un numar n2 care repte ziate numetut do coeticienti nenuli ai cetui de al doi/ea palinom §i apai de pe utmetoetele lmii coeticientii nenuli §i gradul. Sa se creeze cu acesto intormetit ooue listo simplu inlernuite §i sa se adune cele doue palinoame. Coeticiontut §i gradul tiecetui termen din polinomul suma se vor salva intr-un tisier. Pentru testarea programului se vot folosi 4 2 3 potinoernete -lOx +5x -3x ~j 3x +7/+x +2. Se vor crea coua liste in care se vor memora cele doua polinoame. lnformatia utila va fi mernorata intr-o inregistrare cu doua carnpuri: un camp pentru coeficient si un camp pentru grad. Ambele liste se creeaza prin citirea datelor din fisier ~i adauqare dupa ultimul nod. in a treia lista se va memora palinomul obtinut prin adunarea celor doua polinoame . Cele trei liste se identifica prin adresa primului nod (prim1, prim2 ~i respectiv pri m3) si prin adresa ultirnului nod (ull im 1, ul li m2 ~i respectiv ull im3). Problema de creare a listei surna a polinoamelor se descompune in urrnatoarele subprobleme, iar algoritm ii pentru rezolvarea subproblemelor sunt impiernent ati cu ajutorul subprogramelor: n 1 si coeficientul ~ i gradul primului term en din primul polinom. Se adauqa primul nod la lista L1 (nodul prim1 ) - subprogram ul a da uga nod () . Pentru urrnatoare le n1-1 perechi de numere din fisier , executa : S8 citesc din fisier coeficientul ~i gradul unui termen al primului polinom si se adauqa un nod cu inforrnatia respect ive dupa ultimul nod din lista L 1 - subprogramul adauga_ ul tim () .
IE] Se citesc din fisler E?]
133
Inform at icii
~ Se citesc din fisier n2 ~i coeficientu l si gradul primului termen din al doilea polinom.
Se adauqa primul nod la lista L2 (nodul prim2) - subprogramul adau ga nod ( ) . ~ Pentru urrnatoarele n2-1 perec hi de numere din fisier, exec uta : S8 dtesc din fisier coef icientul ~ i gradul unui termen al celui de al doilea polinam ~ i se adauqa un nod cu informatia respective dupa ultirnul nod din lista L2 - subprogramul adaug a _ u l tim ( ) . ~ Se adauqa primul nod (prim 3) la lista L3 cu urrnatoarea inforrnatie: daca gradul din primul nod din lista L1 este egal cu gradul prirnului nod din lista L2, at unci gradul este egal cu gradul nodulu i din Lista 1, iar coeficientul este egal cu suma coeficientil or din nodurile celor doua liste ~ i in ambele liste se trece la nodul urrnator : allfel , daca gradul din primul nod din lista L1 este mai mare decat gradul primului nod din lista L2, atu nc i gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egal cu coeficientul nodului din Lista 1 ~i in Lista 1 se trece la urrnatorul nod; altfe l, gradul este egal cu gradul nodul ui din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 ~i in Lista 2 S8 trece la urmatorul nod - subprogramul adauga n od () . ~ Cat tim p nu s-a ajuns la sfarsitul Listei 1 si al Listei 2, exec ut a: se adauqa un nod la lista L3 dupa ult imul nod, cu urrnatoarea inforrnatie : daca gradul din nodul cure nt din lista L1 este egal cu gradul nodului curent din lista L2, at unci gradul este egal cu gradul nodulu i din U sta 1, iar coeficientul este egal eu suma ccefi cientilor din noduril e celor doua liste ~i in ambele liste se trece la nodul urrnator : allfel, daca gradul din nodul curent din lista L1 este mai mare decat gradul din nodul curen t din lista L2, at unci gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egaI cu coeficientul nodului din Lista 1 >;i in Lista 1 se trece la urrnatorul nod; allfel, gradul este egal cu gradul nodului din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 ~i in Lista 2 S8 trece la urmatorul nod - subprogramul adaug a _ u l tim () . #i nclude < f s t r e a m . r.> f stream f1 ( " l ista5 . t xt " , ios: : in ) , f2 t vp o Lj nom. r x t ", ios : : o u t } ; struct n od lint e ,g ; nod e u r rrr j , int e ,g ,:1 ; voi d a d a ug a nod { no d *&p r i.."TI, n o d *& u l t i m) { p r : ~=new ~od ;
v oid
ultiffi~pr:n ;
adaug2 _ul~im {ncd
prim ->u=m~ NULL ;
pr i ~- > c = c ;
prim- >g=g ; }
*& u l t i ~ )
{ ~ od *p =n e w n od ; p- >u r m=NULL; ultL~ ->urm=p ; u ltin~? ; p - >c =c ; P ->9=9 ; } void c r ea r e (nod *&p d .:n, nod *&u l t i ml {f l » c » g; a da uga _ n o d lp r i m,ultim ) ; f or ( i n t i '-".2 ; t c-n , i -'- t ) { £ l » c» gi a dzru q a ul t i m {u l t i rn) ; } } void a d u n a r e (noel - p r irn I. nod *p r i m2 , n o d * &pr im3 , I1 C'Jd * &u 1 t irr,3 .1 { no d *p = p r i ml , *q =p r i r:12; if lp - >g ==q - >g) {g =p - >g ; c =p- >c +q - >c ; p =p->u r m; q=q -> u r m; } else i f (p ->g>q- >g) {g =p - >g ; c=p ->c ; p=p - >ur m; } else {g =q- >g; c = q - >c ; q=q ->urm ; } adauga no d( prim3 ,u ltim3 ) ; while (q l =NULL && p != NULL ) { i f ( p - > ~ = = q - > g) { g ~ p - > g ; c=p ->c+q ->c ; p =p ->Jrrn ; q=q ->u r~ ; } else if (p - > g > q - > g) { g =p- > g; cep ->c • p =p - >u r rn; } e lse { g ~ q - > g; c=q ->c ; q=q -> urm ; } adau qa u l t i m (u l t i m3 ) ; }
if
{p ! ~ NUL L )
whi le (p ! =NULL ) else
( g =p - >g; c=p->c ; ad aug a ulti m (u l t i m3 ) ; }
Implcmentarea structurilor de date
134
while (q !=NULL) ( g=q- > g; c v q -c-c r edeuqe \J1tim(ultim3) ; } ) void afisare{nod *p r i ml (for (nod *p =p r i m; p !=NULL; p =p - >u r rn) c ou t « p - >c« " "« p - >g«endl; cou t« e n d l; ) voi d salvare(nod *p r i m) {f or (no d *p =p r i f:l ; p ! =NULL; p =p - >u rm ) f2 «p->C« " "« p - >g«endl;} v oid main () ( n o c *p r i ml ,* u l t i rnl ,* p r i m2 ,* u l t i m2 ,* p r i m3 ,* u l t i m3 ; int l"11 ,n2 ; f l oc-n L: n=n l; creare {priml ,ultiml ) ; afisare (prim l) ; fl »~2 ; n=n2 ; creare (prim2 ,ultim2) ; af i s ar e {prim2 ) ; a dunare (priml ,prim2 ,prim3 ,ult im3 ) ; afisare lprim3 ) ; salvare {prim3 ) ; ~l . c l o se ( l ; f 2 .c l o s e() ; }
Enuntul problem ei 6. Reuniunea !ji intersectie a doua muttimt. Se citesc dintr-un fi~ier text do pe prima linie un numar n1, care reprezintfJ numeru! de elemente ale ptimei tnuttimi. apoi de pe urmatoa rea tinie elementele muuimit, de pe linia urmetoere un numer n2 numerut de elemente ale celei de a doua muttim), epoi de pe urmatoa rea tinie elemen tele muttnni'. Sa se determine reuniunea §i intetsectie celor doua multimi. Pentru testarea programului se vor folosi doua seturi de date de introte: mu/rimile A ={1,2,3,4,5} §i B={4,5,6,7} §i multitnite A ={1,2,3} §i B={4,5}.
Se vor crea doua liste in care se vor memora cele doua rnultirni. Ambele liste se creeaza prin citirea datelor din fisier ~i adauqare dupa ultimul nod. in a treia lista se va memora reuniunea celor doua multirni, iar in a patra lista - intersectia. Cele patru liste se identifica prin adresa primului nod (prim1, prim 2, prim3 "i respectiv prim4 ) "i prin adresa ultimului nod (ultim1, ull im 2, ullim3 " i respectiv ultim4). Pentru determinarea reuniunii se vor executa urmatorii pasi: Pas 1. Se adauqa primul nod la Lista 3 (nodul prim 3) care contine numarul din primu l nod al Listei 1 (p ri m 1). Pas2 . Se parcurge Lista 1 de la succesorul primului nod pana la sfars itul ei " i se adauqa un nod cu num arul respectiv dupa ultimul nod din Lista 3. Pas3 . Pentru liecare nod din Lista 2, exec uta : se parcurg e Lista 1 si daca nurnarul din nodul curent din t.ista 2 nu S8 gas8iite in Usta 1, atunei se adauqa un nod cu nurnarul respectiv dupa ultimul nod din Lista 3. Pentru determinarea int ersecti ei se vor executa urrnatorii pasi: Pas1 . Se initializeaz a Lista 4 ca lista vida (prim 4=NULL si ult im 4=NULL ). Pas2 . Pentru fiecar e nod din t.ista 1, executa : se parcurge Lista 2 si daca nurnarul din nodul curen t din Lista 2 se gase" te in Lisla 1, at unci se adauqa un nod cu numarul respectiv ca prim nod in Lista 4 (nodul prim4 ). Pas3 . Daca s-a adauqat primul nod la Lisla 4, atu nci pentru un nod din Lista 1 de la succesorul nodului curent pana la ultimul nod , executa : se parcu rge t.ista 2 ~i dac a numarul din nodul curent din Lisl a 1 se gase"te i n Lista 2, at unci se adauqa in Lista 4, un nod cu nurnarul respectiv, dupa ultimul nod . #include < : s t r e a ~ . h >
struct nod t i nt i n :o ; nod - u rn. r } ,
fstream f( "lista 6 .: ~ : t " , i o s : : i n) i nt x ; voi d adau ga_ nod( nod * & p r i ~ , n o d
; * & ~ l t im )
III fnrill a ticii
135
{p r i rnvn e w n od i pri rn -c- Ln f oe x r pr irn - >u r m=NULL ; u LtImep r i.mr I void a d a u g a_ultim( nod *&u l t i m) {no d - pe new nod ; p- c- Ln f c -cx, p ->unn=NUL L ; u l t i m- >u r m=p ; u l t i m=p ; } voi d c r e a r e {no d * &p r i m, n o d * &u l t i m)
l i n t n ; f »n»x ; ada uga_flod (p rim, ultim) ; fo r (i n t i =2 ; i unn ip !=NULL i p-p->urm) l x=p->info i a dauga u ltim{ul tim3) ; } f o r (p = p r i m2 ; p ~ ~ NULL ;p = p ~ >u r~) (for (q =p r i ml, g a s i t =O; q !=NULL && !gas ~t ; q=q- > u r ~ ) i f ( p - > i n f o = = q - > i ~ f o ) ga3it=l ; if ( ! g a s i t i { x e p -c-Ln f o , adauga_ult.i:ntultim3) ; } } } voi d .i n t e r s cc t Le Lnod e p r i.rnL, nod * p r i m2 , nod * &p r i m4 , nod * &L:. l t i m4 } ( n o d *p ,* q ; int gasit ; ?r im ~=NULL ; ultim4=NULL ; f o r (g a s i t= O, p ""'p r i m1; p ! =NULL && i qas i t , p =p ->urm) fo r (q=prim2 ; q != NULL && ~ g as i t ; q=-q->u r m) i f (p - >info==-q->info) {g a s i t = l ; x ~p - > info ; } if (g a s i ':) ( a d a u ga n on (p r i m1 , u l : i m4 ) ; f or ( ; p ! ~ O ; p=p - >u ern) {for (ga s i t =O, q =-p r i m2 ; q! =- NULL && !gasit ; q=q- >u r m) if (p ->info=- =q->info) gasit= l; i f (g a s i t } {x =p - >i n f o ; adauga_ultim(ultimt;) ; } } }} void a :i s a re(nod * p r i m) {for {nod * p = p r i m; p!:-:"NULL ; p =p- >u r m} c out« p - > i n f o «" cou t « e n d l ; } v o i d mai n () II
{ ~ od
.
* p r i m l ,* u l t i m l ,* p r i m 2 ,* u l ~ i m 2 ,* p r i m 3 , * u l t i m 3 ,* p r i m 4 , * ~ I t im 4 ;
c cee ce (p r .iml , ul timl) ; c r ee r e (prim2 , ul tim2} ; f _close ( ) ; r cuni.une (priml , prim2 , pr im.S, u l t i m3 ) ; ccuccc vne cnt u ne e - " ; afisa re (prim3) ; Ln t c r sec t i e (p r im l , p r i.mz , p r i.mq , u Ltim-1) ; c o u t-cc" Intersectia= " ; if {prim4l=NULL) afiSar~(p r ~~j.:) ; ~ else cout«" Mu l t l :ne 2. vida " ; }
'*"
Scrieti cate un program care sa rezolve cerintele flecarei probleme. Fiecare problema se va deseompune i n subprobleme ~i algoritmul pentru rezolvarea unei subprobleme se va implementa cu un subprogram. Datele se transmit intre subprograme eu ajutorul parametrilor de comunicatie ~i nu al variabilelor globale. Dupa executarea unei operatii de preluerare a lisle; simplu i nlant uite. se vor afisa numerele din nodurile listei pentru a se verifica daca operatia de preJucrare s-a executat corect. Se vor alege seturi de date de intrare astfel l ncat sa se verifice algoritmul pe toate traseele lui. Pentru urmatorii 18 itemi in nodurile listelor se rnernoreaza numere i ntregi. Sirul de numere se citeste dintr-un fisier text in care sunt serise pe acelasi rand. separate prin spatiu 1. Se creeaza 0 lista i n care ordinea de acces este cea i n care sunt citite numerele. Se mai citesc de la tastatura c oua numere x ~ i y . Se insereaza i n lista numarul y ina intea nurnarului x. 2. Se creeaz a 0 lista i n care ordinea de aeces este inversa celei i n care sunt citite nurnerele. Se elimina din lista eel mai rnic nurnar si eel mai mare nurnar. o
Tenui
0
---
136
1m ilcm cntarca st r ucturilor de date
3. Se cree aza 0 lista ~i S8 afise aza in ordinea inve rsa citirii din fisier num ai numerele pare . 4. Se creeaza 0 lista in care ordinea de acees este cea in care sunt citite nurnerele din fisier. Se mai citeste un nurnar n de la tastatura. Se afiseaza elementul cu nurnaru! de ordine n din lista . Oaca nu exi sta, S8 afiseaza un mes aj de informare. 5. Se creeaza 0 lista in care ordinea de acees este cea in care sunt citite numerele din fisier . Se insereaza inaintea fiecarui nurna r facto rii sai primi. 6. Se creeaza 0 lista in care ardinea de acees este cea in care sunt citite numerele din fisier . Se insereaza i ntre fie care pereche de nod uri eel rnai mare divi zor com un al celor doua num ere. 7. Se creeaza doua lisle in care ordinea de acces este cea in care sunt citite numerele din fisiere. Se creeaza a treia lista prin concatenarea llstei care are cele mai putine elemente la lista care are cele mai multe elemente. Daca listele au acelasi numar de elemente , se va adauqa lista a doua la prima lista. 8. Se creeaza doua liste in care ordine a de acces este cea in care sunt citite numerele din fisiere. Se creeaza a treia lista prin concatenarea celei de a doua liste la prima lista. Se elirnina din a treia lista numerele care S8 repeta. 9. Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Se divizeaza lista in doua liste: una care coniine numere care sunt palindrom si una care contine numerele care nu sunt palindrom. Se salveaza lista cu numere palindrom intr-un alt fi~ie r. Daca nu au existat numere palindrom, in fisier se va sene un mesaj de informare. in lista care nu confine numere palindrom se insereaza cupa fiecare numar inversul sau. 10. Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Se afiseaza numerele care au ultimele trei cifre identice, se elimina din lista numerele care au ultimele trei cifre consecutive si se insereaza valoarea 10 inaintea numerelor care au suma ultimelor trei cifre eqala cu 10. 11.8e creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Se afiseaza numerele care au mai mult de doi divizori primi, se insereaza divizorii proprii in tata numerelor care au mai mult de trei divizori proprii si se elirnina din lista numerele care au eel putin doua cifre identice. 12. Se creeaza 0 lista numai cu numerele prime din fisier. Se afiseaza eel mai mare numar prim ;;i eel mai mic nurnar prim. Se verifica daca lista contine numai numere distincte ;;i se afiseaza un mesaj de informare . Daca lista nu contine numai numere distincte , se elirnina numere din lista astfel tncat sa contina numai numere distincte. Se salveaza lista creata intr-un alt fisier. Daca nu au existat numere prime in fisier, se va scrie un mesaj de informare . (lndicatie. Se va crea 0 lista ordonata crescator ~i se vor afisa numerele prime din prirnul nod ~i din ultirnul nod) . 13.Se creeaza coua liste cu numerele citite din fisiere. in primul fisier numerele sunt ordonate crescatcr, iar in al doilea fisier numerele sunt ordonate descresca tor. Se creeaza a treia lista prin interclasarea primelor coua. 14.Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Sa S 8 inverseze ordinea de acces in lista, astfel incat parcurgerea sa se taca de la ultimul nurnar catre primul nurnar. (lndicatie. Se rnuta ultimul nod la inceputul listei ;;i apoi, pana se ajunge la numarul memorat la adresa care a fost a primului nod se insereaza nodul ulti m dupa ultimul nod inserat.) 15.Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Sa se afiseze in ordine inversa numerele din lista. (Indlcatle. Se implernenteaza un algoritm recursiv de parcurgere a listei.)
137
I II forma tid
16. Se creeaza a lista ordonata cu numerele din fisier si se divizeaza apoi lista in doua Iiste: una cu numere pare ~i una eu numere impare . 17.;n fisie r sunt memo rate foarte multe nume re (maxim 10.000). Foarte multe dintre aceste numere S8 repeta (exists max im 100 de numere distincte). Se creeaza 0 lista ordonata crescator numai cu numerele distincte si eu frecventa lor de apa ritie. Se aflsea za eel mai mare numar si eel mai rnic numar . Se calculeaza media aritrnetica a nurnerelor care au valoarea cea mai mare sau au valoarea cea rnai mica ~i se afiseaza numai num erete care sunt mai mari decal media aritrnetica. 18.Pentru doua rnultirni de numere A ~i B sa se determine diferent ele A-B ~i B-A. 19. 5e citeste dintr-un fisier text un nurnar cu ma xim 20 de cifre. Se creeaza a lista cu cifrele nurnarului, S8 elirruna din lista cifre te pare ~i se afiseaza nurnarul astfel obtinut. 20. Se calculeaza produsul a doua polinoame. lnforrn atiile desp re cele doua polinoame S8 citesc dintr-un fisier. (Indicat ie. Pentru fiecare nod din prima lista se parcurge a doua lists iii. daca produsul coefic ientilor nu este nul, se creeaza un nod i n iista a treia care va avea coeficientul egal cu produsu l coeficie ntilor ~i gradu l egal cu sum a gradel or. l.is ta a treia este a lista ordo nata descresca tor dupa grad .) 21. 8 e creeaza dou a liste cu n noduri ~ i respectiv m nodur i care cont in nume re in tregi ge nerate aleatoriu in intervalul [a.b] . Valorile pentru nurnarul de noduri n, si respect iv rn, si pent ru limitele intervalului , a ~i b , se citesc de la tastatu ra. Sa se afiseze numai numerele distincte din cele doua liste !;)i nurnarul care are cea mai mare trecventa de aparitie in cele doua liste.
2.6.4. Algol'itmi pcntru prelucrarca listclor circulare simplu inlan!lIite Algoritmii de ad au qare a primului n od la tista vida si de ada uqare d u pa ullimul nod sunt la fel ca si cei de la listele simplu l nlantuite: Lista circulara simplu ln tantuua u ltim
prim
I
info
-,-
I urm
I,
info
I urm~ r:
info
I urm
I
I'.
info
I urI"l I
2.6.4. 1. C rcarc a list c i Deoareee in algoritmii de preluerare trebuie sa se cunoasca adresa prirnului nod, este importanta adauqarea primul ui n od la lista vida. Pasii algo ritnl ului de croaro a unei liste sunt: PAS 1. Se adauq a primul nod la lista (nodul prim ) PAS2 . Cat limp mai exists inforrnatie exec uta : se adauqa un nod la lista dupa ultimul nod. PAS3. Se leag a ultim ul nod de primul nod. Impl cm cntarea algori tmu lu i. Se folose ste functia procedurala c rea re ( ) at carei parametru este prim de tip no d : care se transrnite prin reterin ta deoa rece este parametru de intrare-ieslre. 8e foloseste variabila globala n pentru citirea inforrnatiei din nod. Se considera ca nu mai exista into rmatie atunci cand valoarea citita pentru n are valoarea O. vo i d c rea re (n od *&p : i o ) ( n o d *u l t i m; cin» n; adau ga _n o d , p r im , u l ~ iffi ) ; wh i le ( n ! ~ O ) (cin» n; a d a ~ g a_ u l t i ~ ( u l tire ) ; } ul t.i m-c-u r-mop r-a m }
138
Im plcmenta r ca strudurilor de date
2.6.4 .2. Pa rcurgerea listei Deoa rece lista circu lara nu contine un ultim nod care sa fie conside rat ca terminator al listei, S8 va con sidera ca nod care terrnina lista nodul prim . Pasi i algoritmului de prelucrare a unei liste circu lare sunt: PAS1 . Se prelucreaza primu l nod din lista (nod ul prim ). PAS2. Pentru l iecare nod din lista ln cepan d de la succesoru l nodulu i prim pan a la prim ul nod, executa: S8 prelucreaza nodul curent. Implementarea algoritmului. Se foloseste functia procedurala parc urge (J al carei parametr u p rim de tip nod S8 transmite prin valoa re deoa rece este pa rametru de intra re.
v o id p a r cug e (no d *p r i ffi ) { l i s e prel ucreaza prim->info ; f or (nod * p~prim- >urm ; p r =pri m; p =p- >urm) I /s e prelucreaza p->info; }
2.6.4.3 . Eliminarea unui nod din listii Daca S8 elirnina din lista nodul care urmsa za dupa nodul curen t p tre buie sa S8 ve rifice daca aces t nod nu este nodul prim , ca sa nu S8 piarda adresa prim ului elemen t din lista. Pasii algoritmului de eliminare a nodului urrnator nodului curent sunt: PAS1. Se salveaza adresa succesorului nodului p i n pointerul q. PAS2. Se leaqa nodul p de succesorul succesorului lui. PAS3 . Daca succesorul nodulu i p era nodul prim , atunci succesorul nodului pr im devin e nodul prim . PAS4 . Se cere eliberarea zonei de memorie de la adresa mernorata in pointerul q . Implementarea algoritmului. Se foloseste functia procedurala elirnina_urm() ai carei parametri de tip nod sunt: p (pentru adresa nodului precedent nodului ce S8 elirnina), care se transmite prin valoare deoarece este parametru de intrare si prim, care se transmite prin referinta. deoarece este parametru de intrare-iesire.
v o i d elimina._urm(nod *p, n od *& p r i m) {n o d *q =p-> u rm; p->urm= p->urm->urm i if (q===prirn) pr im==pr im ~>urIll i delete q ; }
I Swmu de CBlZ I Sco p: exemplificarea modului in care, pentru rezolvarea problemei , foloslti algoritmii de prelucrare a listelor circulate simplu Inlantuite si implementarea lor cu ajutorul subprogramelor. Enunt ul probl emei. Sa ciuiste dintr-un fi§ier text un sir de numere separate prin spti tiu cu ctue S8 creeaza a lisla circutare simplu inl antuila in ordinea in care sunt citite numerete din fi§ier. Sa se §tearga numerele p are din lista §i sa S8 etiseze numetoio din iiste. Pentru leslarea proqrtnnutu) se vor tolosi doua seiut! de nutnere: (2. 2, 3, 4, 4) si (2. 2, 2, 4, 4). Problema se descompune in urrnatoarele subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt implernentati cu ajutorul subprogramelor:
f1l Se creeaza lista circulara simplu Inlantuita -
subprcqramul creare ( ) .
~ Se parcurge lista de la succesorul primului nod pana la primu l nod si daca nurnar ul din succesorul nodului curent este par, at unei se elimina succesorul nodului curent subprogramu l eLa mi n a u r m ( ) ; altfel se trece la succesorul nodului curent. ~ Daca nurnarul din nodul prim este par. atunei se elirnina nodul prim si lista este vida subprogramu l e Li.mi.n a_ p r i m ( ) .
139
Infor matica
~ Dac a lista nu este vida (subprogramul es te vida () }, atunci S8 afiseaza numerele din fiecare nod (subprogramul afisare ()) . #inc lude struct nod {int in fo ; n od *u r m ;}; fstream f( "li s t a7 . t x t " , i o s : : i n } ; int x ;
void a da u ga nod (n od *&p r i m, nod *&u l t i :nl {p r i :n=new no d ; pr im-> i n fo =x ;
p r i m- > u r m ~ NULL;
u l t i m=p r i m; }
void a cla ug a _u l t i m(nod * &u l t i m ) {n o d " p e new n od ; p- c- Lnf oe x , p ->unn=NUL L ; u l t i m- >urm=p ; u L t..inr- p , } void c reare(nod *&p r i m) {n o d *u 1 tim ; I c->x , a d a u ga.. ..n od rpr im , u lt im ) ; while (f »x ) adauga~)1 1 t im(u ltim) ; u l t Lm- c-u rme-p rLm , } ' v o i d e Li.m.ina __urm( n o d *p, n o d *&p r i m) {rio d *q =p - >u r :n; p -c-u rmcp -c-urm- o u rm ,
if (q ==p r i m) p r im=prim- >u rm ; delete q ; } vo i d e Ld.m.i.na p i .im t n o d * &p r i m) {n o d *q = p r i m; pr irn=NULL ; delete q ; } a.n t; e s t .e vLda ( n o o ep r-Lrn ) {return pr i m= =NULL ; } v oid 2-fisar e( n od *p r i m) Lcou t.c-cp r i.m -o Ln Fo -cc " ", for {nod *p "" p- >u rm; p >=p rim;p =p->u rm ) coutxc c - c- Lnfcoc'' "; cout«endl ;} void ma i n () { no d e p r i.m, *p; c r ee.r-e.Ip r i .m j , afi s ar e (p r i m);
for (p =p r i m- >u r m; p ! =p r i lll;) if (p - >u r m->i n f o% 2=-"'O) e l i rn i n u.....urm(p ,prim) ; else p=p- >u rm ; i f (p r i m-c -I u Co %2== O)elimina ,:-,"prim (p rim} ; i f (! este_v .i.da (p r im ) ) a f L s a r e (pr i m) ; }
_
--
-----.--.... Scrieti cate un program care sa rezolve cerintele fiecarei probleme. Fiecare problema se va descompune i n subprobleme ~i algoritmul pentru rezolvarea unei subprobleme se va implementa cu un subprogram. Datele se transmit intre subprograme eu ajutorul parametrilor de cornunicatie ~i nu al variabilelor globale. Se creeaza liste ci rcu lare sim plu ln lan tu tte in noduriIe carora se rnernoreaza numere intregi. Sirul de numere se citeste dintr-un flsier text in care sunt memorate pe acelasi rand, separate prin spatiu. Dupa executarea unei operatii de prelucrare a listei, S8 vor afisa numerele din noduri pentru a verifica daca operatia s-a executat coreet. Se vor alege seturi de date de intrare astfel l ncat sa se verifice algoritmul pe toate traseele lui. Pentru urmatorii 4 itemi Jistele se creeaza asttel lncat ordinea de acces sa fie cea in care sunt citite numerele din fisier. 1. Sa se insereze , dupa fiecare nurnar divizibil cu cea mai mare citra a sa, valoarea cifrei, ~ i sa se elim ine numerele care au ultime le doua cifre consecu tive . 2. Sa se verifice daca num erele sunt in progres ie geometr ica si sa se afiseze primul termen al progre siei geometriee. (Observat ie. Daca numerele sunt i n progresie geometrica, nu este ob ligatoriu ca sirul de numere citit din fisier sa lnc eapa cu primul termen al progresiei geom etrice.) 3. Sa S8 insereze in tre doua numere pare din llsta media lor aritrnetica pana can d nu mai exista perechi de numere pare .
140
Implcm cn ta r ca structuril or de d ate
4. Din lists circul ara creata sa se creeze alte dOU8 liste circulate simplu inlant uite - una cu numerele divizibite cu cea mai mare citra, iar alta cu numerele divizibi le cu cea rnai mica cifra - ~i S8 verifice daca cele doua liste cont in numere comune. 5. Se creea za 0 lista ordonata crescat or si S8 creea za apoi din ace asta lista 0 lisla cu numerele care sunt patrate perfecte.
sa
2.6.5. Algoritmi pcntru prclucrarea listclor dublu iulantuitc in cazu l listelor dubl u Inlantuite intorrnatia de legatura trebuie sa contin a ~ i adresa succes oru lui nodului (pointerul wa n t catre tipul nod):
struct nod lint .info ; nod * a n t , *u r m; } ; nod " p r i m, - u l t j-n , *p;
//inforrna\:ia propriu -zisa pentru leg5 tur~
//irlforma~ia
Alg oritmi i de la listele simp lu ln lantui te S8 rnod ifica prin adauqarea instructiunilor care Int retin ~i adresa de leg atura cu predecesorul nodulu i. Algoritmul de ada uqare a unui no d pin inte rio rul liste i i na in tea un u i no d q se sirnplifica deoar ece se cuno aste adresa atat a succesorului, cat ~ i a predecesorului. Lista dublu lnlantulte
prim
NULL I
i nfo
•I
an t
2.6.5.1. Adauqarca primului nod la lista Impl emen tarea alqoritrnului . Se foloseste functia procedurala adauga_nod O ai carei parametri prim ~ i u l tim de tip nod se transm it prin re ferin ta deoarece sunt parametri de lesire. void adaug_nod (nod *&p r i m, nod *&u l t i m) {p r 'im = new nod , pr im-> .i n foe x r pr.l.m->an t =-NULL; p r i rn- >u rm =NULL; ultim=pri:n ; }
2.6.5 .2. Adau qar oa unui no d la lista Ad5ugare in Ia ta prirnului nod
Implementarea algoritmul ui . Se foloseste functia procedurala adaugayrimO al carei parametru prim de tip nod. se transmite prin referinta deoarece este parametru de intrare-iesre v oid adauga_prim (:1oa *&p =i m) {n od *p =new nod ; p -c-Ln foex , o »an =NULL; p ->urm =p r i rn; p.r i.mvp i } Adflllga re dupa ultimul nod
Im plementarea algoritm ului. Se foloseste functia procedurata adauga_ul tim () al carei parametru u l tim de tip nod se transmite prin refennta deoarece este parametru de intrare-iesire. void adauga_ultim(~od * &u l t i m) {n od ~ p =new ~od ; p -> i~ fo = x ; =u l t i rn; =NULL; u.l t i.m-c-u rmvp , ultim=p ; }
141
lufnrm aticii Adauqarc a in in tc rio ru l liste i [ p rim
I- . . -f~-{~J-+B ..- 1 I ultim
a) dupa nodul cu adresa q Nodul p care se adauqa se insereaza lntre nodul q ~i nodul q-surm. Succesorul sau este nodul q-surrn, iar predecesorul sau nodul q . Nodul p va fi succesorul nodului q ~i predecesorul nodului q -surm . Implementarea alg oritmului. Se foloseste functia procedurala adauga_ dup a ( ) ai carei parametri sunt de tip nod: q (adresa nodului dupa care S8 face ada uqare a), care S8 transmite prin valoare deoarece este parametru de intrare ~i u l t i m (adresa ultimului nod), care S8 transmite prin referinta deoarece este para metru de intrare-iesire. v o i d ada ug a~dupa (nod *q , n6d -* &ul tim)
{n o d i f
p -> in f o= x ;
PT u rm ;
p~>a~t= q ;
(q ==u l ti m) u ltirri.=p; e l s e
q;;j>j.lriTL~>ant= p ;
q->.urxn= p ; }
*p~ n e w
nod ;
b) l nai n te de nodu l de adrcsa q Nodul p care S 8 adauqa S8 insereaza intre nodul q-sant si noduJ q. Succesorul sau este nodul q. iar predecesorul sau nodul q-sant. Nodul p va f succesorul nodului q-e-ant ~i predecesorul nodului q. Implementarea algoritmului. Se foloseste functia procedurata adauga_in_ fa t a () ai carei parametri sunt de tip nod: q (adresa nodului inaintea caruia se face adauq area), care se transmite prin valoare deoarece este parametru de intrare.
v o i d adau g a~ in _ fa t a(nG d *q ) {ne d kp=n e w nod ; p ~> i nf o= x ; p -c-u r m- q ,
p-ec-an
t e q- c
-an
L,
q-c-an c-c-u.rm-e p ,
q·;.>ant= p ; }
2.6.5.3 . Parcurgerea listei Viz itarea fiecaru i no d al listei se poa te face In doua moduri: -7 pom ind de la primul nod, pima la ultimul nod, In ord inea de i nla ntuire a nodurilor furn izata de adres a urm din nodu l vizita t; -7 pornind de la ultimul nod, pima la primul nod, in ord inea de inlantuire a nodu rilor fu rnizata de adresa ant din nodul vizitat Implementarea algoritmulu i. Se toloseste functa procs durala parcurge-inainte (), respectiv parcurge-inapoi () , al carei parametru prim, respec tiv ul ti m, de tip nod , se transm ite prin valoare deoa rece este parametru de intrare. v oid pa r cuqe .i na i.n t e.Lri od e pr i m) {for (no d * p =pr i m; p !=NULL; p=p- > u r m) lise prelucre Dza p->i nfo}
vo i d p a r cuge _in apoi( n o d *ll l t i m} {for (nod * p =u l t i m;-p ! >=NULL ; p=p ->ant ) l i s e p r el.uc r ea za p->info}
2.6.5.4. Eliminarea unui nod din lista Eliminarca primului nod Implementarea algo ritm u lu i. Se Ioloseste functia procedurala eliminayrim() al carei parametru p r i m de tip nod se- transmite prin referinta deoarece este parametru de intrare-iesire void el i mi na__ pr im( n o d *&p r i m) {n o d *q =p r i m; prim->urm- >a n t =NULL ; prirn=p rim->u rm; dele te q ; }
142
I mplem enta rea strn ctnrilor de date
El iminarea ultimului nod Implementarea algoribnului. Se toloseste functia procedurala e limina_ ultim () al carei parametru ul t i m de tip n od S8 transmi te prin referinta deoarece este param etru de lntrare-iesire . v o id e L i mi n a u L t Lm t rrod. * &u l t i m) {n od * q=u l t i~; ultim~>ant->urm~NULL; u l tim=ultim->ant ; d elete q;}
Eliminarea unu! nod din interiorul listei Pen tr n a eli mi na nodul p al lat in interiorul listei, treb uie sa legam pr edeee sor ul nodului p (p-s ant) de sueeesorul lui (p -s urm ). Sueeesorul nodului p-e-ant va fi nodul p-x urm , iar predecesorul nodului p- o-urm va fi nodul p -sa nt. Implementa rea algoritm ulu i . Se foloseste functia procedurala ed.imi.na () al care i paramet ru este de tip nod: p (adresa nodului care S8 elimina) , ca re S8 transm ite prin valoare deoarece este parametru de intrare. v oid el i min a (nod * p ) {nod *q=:=p ; p:-c->a nt - >u r m:=p - >u rm ; p -ourm - c-a n ue p - c- en t , de lete q ; }
Seop: exe mplificarea modului in care, pentru rezolvar ea pro blemei, folositi algoritmii de prelu crare a listelor dublu Inlantuite ,;;i implementarea lor cu ajuto rul subpro gramelor.
Enunt ul p rob lem ei 1. Sa citeste dintr-un fi§iBr text un sir de numere separate prin spetiu cu care se ereeaza 0 !ista dublu inlanfuita in ordinea in care sunt citiie numerele din tisier. Sa se adauge va/oarea 1 dupa fiecare numer par §i sa se §tearga apoi numerele pare din lista. Sa se etisoze numerele din lista dupa fiecare operatic de prelucrare, in ambele moduri (de fa primulla ullimul, si de la ullimul fa primu/). Penlru les/area programufui se va folosi $irul de numere: (2, 2, 5, 3, 4, 4). In prelucrarea tistelo r dublu inlantuite trebuie lnt retin ute atat adre sa primulu i nod , cat si adresa ult imu lui nod . Pro blem a se de sco mp une in urrn atoarele subp rob leme, iar algoritm ii pentru rez olvare a subproblernelor sunt implementati eu aju torul subprogra melor:
lP11
Se creeaza lista du blu inlantuita - sub programu l creare () . ~ Se adauqa un no d eu valoarea 1 dupa l iee are nurna r p ar, a stlel (s ubp rogramu l pr e l u c r a re 1 (» ): 1 -7 Se p areurge lista de la primul nod pana la pe nul timu l nod si, da ca nurn arul din nodul eure nt es te par, se adauqa dupa el un no d eu valoa rea 1 - subp rogramu l ada u g a ~d u p a ( ) . -7 Dac a nurn arul din nodu l ul tim este par , atu nc i se ad auq a dupa el un nod ca re con : tine valoa rea 1 si aeest nod devin e no dul u ltim - sub program ul a d auga ul tim () . ~ Se elirnina nodurile cu numere pare, astfel (su bpro gramu l p r e l u c r a r e _ 2 0): -7 Se pa reurge lista de la sueeesorul pr imului nod pa na la penu ltim ul nod si , da c a nu rna ru l din nodul eurent este par, at u ne i se elim ina di n lista (su bp ro gra mul el imi na ~ urrn (») ; altfe l , se trece la sueee sorul n odului eurent. -7 Oac a nurna rul din nodul pri m este par, atunci se elimin a din lista si suecesorul sau devine nodul prim - subprogramul e li mina _ pr i m ( ) . # i n c lude < f s tr e a m . h > st ruc t n od ( i nt i n f o;
nod *a n t , *u r rn ; ) ; f stream f ( " l i s t a8 . tx t " , i o s : : in ) ;
i n t X;
143 .:....:...::.
InliJrm :l!k.a'--voi d adauga nod (no d *&p r i mr n o d * &u l U .m) {p r i m=- n e w n od i p r im ->i nfo = x ; p r i m- >u r m=NULL i pr i m->a n t =NULL ; ul tim=p r i rn; }
vo id a d a u ga u l t im(nod *&u l t i m) {n o d *p ; p=n e w n od ; p -> info= x ;
p ->unn=NULL; p-> ant =ult im ; ultim - >urm=p; ultim=p ; }
vo i d ada uga_dupa(n od *p ) { ~ od
*q=n e w n od ; q -> inf o = x ; q - >u rm =p - >u rm ; q - >a n t =p ; p ->urm- >an t=q ; p ->urm=q ; } v o i d elim i n a p r i m {n o d *&p r i m) {n o d *q =p r i m; prim->urm- >a n t =NULL ; p r i m=prim-> urID ; de lete q ; } void elim i n a( nod *&p ) {n o d *q =p; p ->ant->ur~=p-> ~ rm ; p ->urrn->ant =p ->ant ; p =p - >u rm ; de lete q ; } void crea rc{nod * &p r i m, l1oc * &u l t i m)
{f» x ; adauga noc(prirn ,ultirnl ; whi le ( f » x)
adauga_ult L~{ultim) ; }
void pr e lucrar e _ l ( n o d *p r i m, n o d *&u l t i ml
{fo r (nod *p =-p r i mi p - >u rJn! +=NULL ; p =p - >u r ml i f { p - > i n fo% 2=~O} ad a u g a~d u p a ( p) ; if (ultim- >i nf o %2 =- =- O) a d a u g a u l tim ( u l t i m) i }
v o i d p xe l u c r-are vz (n od *&p r.i m) {fo r ( n o d *p =p r i m- > u r m; p - > u r m ! =NULL i ) if ( p - > i n f o % 2 ~ = O ) c l i mi n a( p) ; e lse p =-p->urm; i f (p rim- >i n fo%2==O) e l ~mi n a~rim(pr i m) ; } v oid a f i s a r e~urm(nod * p r i ~ }
{for
(nod *p =p r i m; p !:=cNULL; p =p - >u rm)
c o ut«
p~ > i n [ o «"
" ; c ou t «end l ; }
v oid a fi s a r e ant {nod * u l t i rn) {f or (no d *p =u l t i mi p > NULLi p =p- >a n t l c out-ccp - c- Ln Coc c " "; cou t « e ndl; } void maine ) {n o d *p r i m,* u l t i m,* p ; creare (p r i.rn, ultim) ; a f i s a r e j u rm (prim) ; a f i.s a rejen t (ul tim) ; :-:=1; p re Lu crar e 1 (prir:-: ,t;lt im) ; a r Lsare urm tp r im) i afisa re a n t (ult i m) i p re Luc r e r e _ 2 (p r im) i a fisa re_'1rJn (pr .irn j r e f i s ar e _ an t. (ul t. Lm) ; }
Enuntul problem ei 2 - Calcularea rezistentai ec hlv alente Sa se cotcuteze rezisiente echiv etente in tre pun cteie A $i B pentru citc uiiut electric din figura.
n,
s,
u,
R il l
:~-ER" Pentru calcularea rezistentei echivalente se porneste de la ultimele rezistente - Rn ~i Rn-1 care sunt legate in serie. 5 e calculeaza rezistenta lor echivalenta Re1, care va fi legata i n paralel cu rezistenta Rn·2. Prin calcularea rezistentei echivalente a celor coua rezistente legate i n paralel, R cl o;i R n-2, se va obtine 0 noua rezistenta echivalenta R c2 care este leqata in serie cu rezistenta Rn-3. Calcularea rezistentei echivalente a circuituiui electric este un proces repetitiv i n care alterneaza calcularea unei rezistente echivalente a doua rezistente legate i n serie eu calcularea unei rezistente eehivalente a doua rezistente legate in paralel. Pentru a ~ti care dintre variantele de calcul se alege, se foloseste variabila 5 care are valoarea 1 daca rezistentele sunt legate in serie, ~ i valoarea 0 daca sunt legate i n paralel.
144
Implem entarea st ructu r ilor de da te
Va lorile pentru rezistente S8 citesc dintr-un fisier text in care sunt memorate pe acela si rand, separate prin spatiu , Se creeaza a lista dublu Inlantuita in care ordinea de aeces este cea in care sunt citite nurnerele din fisier. Lista S8 parcurge de la ultimul nod pana la primul nod . #inc l ud e struct nod {f loat in fo ; n o d *a n t , * u rm ; } ; fst ream f I vre z i s t.ent.e t x t vi Los : : i n ) ; f l oat X i c
void a da uga nod (nod *&prim, nc d *&u l t i m) { p r ~=new nod ; pr i m-> i nf o=x; prirn- >urm=NULL; prim- >an t =NULL; ultimzprim ; } vo id adauga (no d * &u l t i m) {n o d *p ; p e n e w nod ; p- c- Lnf o e x , p- >u r m=NULL ; p - >ant= ul t i m; u l t i m - > u rm~~; u l tim=p ; } voi d c rea r e (n od *&p r i m nod * &u l t i m} ( f» x; a d a u g a nod(p ri m ,~] .ti m ) ; whi le ( f »x) adauga(u l t i rn) ; } float R {n o d * u l t i m) {int 5= 1 ; float r=ul t im->info ; nod * p = u l t i m - > a ~ t ; l
while (p ! ~NU LL ) if ( 5) {r +=-p- > i n f o;
p=p - >a n t ; s=O; } else {r = (r *p - >i n f o ) j {r +p - > i n f o ) ; p =p ->ant ; s=l ; } return r ; } void main(} {n o d e p r irn , *u l t i m; c r ea r-e {p r i m, u Lt.Lml ; f. c l o s e () ;. ccc e-ccv nez t s t ent.a e c h iva Leri t .a> "« R ( u l t i m);} ~
*
Rcco mandare. Listele dublu l nlantuite se folosesc i n prob lemele in ca re , pentru prelucrarea lnformatiilor: -7 se executa frecevent operatii de inserare ~i de eliminare de noduri; -7 lista trebuie parcurs a i n am bele sensuri. Exe m plu. i n problemele i n care trebuie prelucrate numere foarte ma ri (pentru memorarea carora nu pot fi folosite tipur ile de date implementate) se folosesc listele dubl u l nlantuite : -) pentru operatiile aritmetice (adunare, scadere , lnrnultire) Iistele in care sunt memorate cele doua numere vor fi parcurse de la ultimul nod , pima la primul nod ; -) pentru compararea a doua numere sau determinarea nu rnarulu i de cifre ale nurn arulu i, listele i n care sunt m em orate numere le vor fi parcurse de la primul pima la ultimu l nod. Scrieti cate un program care sa rezolve cerintele fiec arei probleme. Fiecare prob lema se va descompune in subprobleme si algorilmul pentru rezolvarea unei subprob leme se va implementa cu un subprogram . Datele se transmit intre subprogra me cu ajutorul param etrilor de com unicate si nu al variabilelor globa le. Se creeaza liste d ublu I nlant uite in nod urile carora se rnerno reaza numere i ntregi. Sirul de numere se citeste di ntr-un fisier text in care sunt m emorate pe acelasi rand , separate prin spatiu. Dupa execut area unei operatii de prelucrare a listei, se vor afisa numerele din nodu ri pentru a verifica daca opera tia s-a execut at core ct. Se vor aleg e seturi de date de intrare astfel incat sa se verifice algoritmul pe toate traseel e lui. Listele se creeaz a astfel ln cat ordinea de acc es sa fie cea in care sunt citite numerele din fisier. 1. Sa se elimine numerele prime $i sa se insereze intre fiecare pereche de num ere rarnase cel mai mare divizor eomu n al lor. 2. Sa se calc uleze eifra de cont rol a fiec arui nurna r ~i , da ca numarul este diviz ibil cu cifra de cont rol , citra este ada uqata du pa nurnar; alttel, numarul este elim inat din lista . Citra
Inform aticii
145
de control a unui numar este suma repetata a cifrelor numarulu i pana cane S8 obtine 0 suma mai mica decat 10. 3. Sa S8 mo difice adresele din nodurile Iistei astrel inca t sa S8 obtina doua liste !iniare dub lu inlantuite care sa cantina numerele din pozitiile pare, respectiv din poz itiile impa re. 4. Se citese dintr-un fisier doua numere foarte marioSa S8 scrie urrnatoare le subprog rame pentru prelucrare a nume relor: a. calcu larea sume i, a diferentei §i produsu lui nume relor; b. com para rea a doua numere (subprogramul trebuie verifice daca cele doua nume re sunt egale , iar daca nu sunt egale, sa precizeze care nurnar este mai mare) ; c. ver ificar ea nurn arului daca are un nurnar par sau un numar irnpa r de cif re , fara sa se numere cifrele nurnarului: d. determina rea nurna rului de cifre ale unui nurnar: e. verific area nurnarutui daca este palindrorn.
sa
2.6.6. Algoritm i pcntrn prelucrarca stivclor Cele coua ext rernitat i ale stivei se numesc varf ~ i baz a , Accesul la nodurile stive i (adauqarea. extragerea sau con sultarea unui nod) este permis numai printr-o sinqura extrem itate nurnita varf si ultirnul nod inserat este primu l nod extras (se extrage cea mai noua inforrnatie adauqa ta ). La 0 operatie de adauq are a un ui nod , varful stivei stivei urea, iar la 0 oper atie de extragere a unui nod , varfu l stivei coboara . Implementa rea dinamica a stivei se face la fer ca a unei liste Iiniare, cu deosebirea ca : -7 varful stivei va fi indicat de pointe rul va r f catre tipul nod ; -7 pentru adauqarea unui nod, se poale Iolosi numai algoritmul de adauqaro in fata primului nod ; -7 pentru extragerea unui nod se poate folosi numai algoritmul pentru eliminarea primului nod . Altfe l spus , prelu cr are a unei stive se face de la varf spre baza si se prelucr eaza Intotdeauna nodul din varful stive i . Acces ul la informatia din acest nod se face cUva r f - >i nf o . st.va vida este stiva care nu contine nici un nod ~ i adresa nodu lui vart are valoarea NULL (v a r f ~ NULL; ) . i n sliva vida nu se mai pot exec ula operatii de extragere de nodu ri. Stiva poate sa ajunqa sa fie vida In doua cazuri: la inltializare sau dupa extragerea ultimului nod . Pentru testa rea unei stive daca este vida , S8 poate imple menta functia operand es te _v ida ( ) care va furniza valoa rea 1 ("adevarat") , daca stiva este vida , si valoarea 0 ("fals ") daca stiva nu esle vida. int 8s t c_v i da (no cl *v a r f ) {return var f=~ NUL L ; }
Penl ru prelucrari cu autorul sl ivei putet i folosi urrnatorii algoritmi: -7 lniti alizarea s tive i: -7 ada uqa rea u nu i n od la stiva : -) ex trage rea unui n o d d in s tiv a: -) co ns u lta re a n odului din v a rfu l stive i.
2.6.0 .
nitial izarea s ti ve i
Prin acest algoritm so c roo aza st iva vida. varf are valoa rea NULL.
in acest
caz . nodul v arf nu ex ista si poin terul
Im pl em entarea algorit m uJui. Se foloseste functia procedura la ini t () al carei parametru varf se transm ite prin referinta, deoarece este para metru de iesire.
146
Implementarea strue t u r ilor de date vo id i n it{ no d * &v a r f ) {va r f = NULL;)
2.6.6.2. Adauqaraa unui nod la stiva Nodul se adauqa la stiva ca predec esar al varfului. Pasii algoritmului sunt: PAS 1. Se cere alocarea de memorie pentru nodul p . PAS 2. Se scrie informatia i n nodul p . PAS 3. Nodul p se leaqa de nodul varf. PA S4. Nodul p a da uqat devine nod ul var f . Impleme ntare a algoritm ului . Se foloseste functia procedu rala ada uga () al carei parametru
varf
S8
tra nsmite prin reterinta, deoarece este parametru de intrare-iesire.
voi d adau g a( nod * &va r f ) {no d *p =n e w no d i p ->in f o ~ x ; p - >u r m=va r fi
var.f~p ; }
2.6.6.3. Extrag erea unui nod din stiva Nodurite se extrag din stiva pentru a putea consulta informalia care e xi sta in nodur ile urmatoare. Un nod S8 poate extrage numa i in cazul in care stiva nu este vida. Se poate extra ge numai nod ul din varful stivei (se elibereaza spatiul care a fost ocu pat de nod ). i n varfu l stivei va aju nge succesorul nodului extra s, Pasi i algoritmu lui sunt: PAS1 . Se salvea za adresa nodului v a r f i n pointerul p . PAS 2. Succesorul nodu lui varf devine nodul varf . PAS 3. Se cer e elibera rea zonei de memorie de la adresa mernorata in po interul p . Im plementa rca alq oritmu lui , Se foloseste functia procedurala extrage ( ) al care: parametru var f se transmite prin referinta, deoarece este parametru de intrare-iesire. vo id e xtr a g e (nod *&v a r f ) {n o d *p =v a r f ; va r f =va rf - >u rm ; d e l ete p ; }
2.6.6.4. Prclucrarea stivei Prin acest algoritm se consulta informatia din fiecare nod al stive i. Deoarece nu poate fi co nsultata de dit inform alia di n vartut st ivei , pentru a ajunge la un nod trebuie sa se extraga toale nod urile p;ma la et. Imp lementarea alg oritm ului. Se foloseste functia procedurala prelucrare() al carei parametru varf de tip nod se transmite prin referinta, deoarece este parametru de intrare-iesire. v oid prelucrare{nod * &va r f ) {whi l e (va rf! =NULL) { l i s e p r e lu creaz5 v arf->inf o e xtr a ge (va rf ) ; ) }
Seop exempliticarea modului i n care, pentru rezolvarea problemei , folositi algoritmii de prelucrare a stive lor ~i implementare a lor cu ajutorul subprogramelar .
Enunt ul pro bl em ei. Se citesie dintr-un tisier text uri sir de numere separate prin speiiu care se depun intr-o stive in ordinea in care sunt ciiite numerete din tisier. Sa se etimine nunuuut de la baza sitvei §i numerele ttimese in stiv» sa so scrie intr-un tisier text. Pentru testarea programului se va lolosi §irul de numere: {t , 2. 5. 3. 4). in prelucrarea stivelor, pentru a putea ajunge la inforrnatia care treb uie prelucrat a, trebuie extrase toate nodurile, pan a la nodul care confine acea informatie, deoarece nu poate fi prelucrata decat inforrnatia din varful stivei. Pentru a nu se pierde informatia din nodur ile
147
Informatica
extrase, ele vor fi descarcate intr-o alta stiva (de rezerva ), iar dupa prelucrarea inforrnatiei, nodurile vor fi i ncarcate din nou i n stiva.
..
Con su lta rea nodului care c ont ine n um aru! 3 '
5
4
_
oes c arc a
consulta
•
1 stiva
....
(
5
Inca rc a
W
W
varl r
W
stiva de rezerva
- 3 W
- W
W
stiva
Iv arl
4
[~_3:Jva rl
3 2
_
varl r
-
stiva de rezerva
2
1
varl_r= NULL
stiva
stiva de rezerva
Problema se de seomp une i n urrnatoarele subprobleme , iar algoritmul de rezol vare a unei subprobleme este imple me ntat cu ajuto rul unui subprogram:
rP1l
Se creeaza stiva cu numere le citite din fisier (nodul ve r -f) - subprogram ul c rea re ( ) ) Se descarca stiv a Intr-o alta stiva (nc dul va rf r ) pan a la penu ltimu l nod (subprogramu l d e s ca rc a (» ). ~ Se extrag e ultimu l nod din stiva - subp roqrarnul ext rage () . ~ Se l ncarca in stiva (nodul v arf) nodurile din stiva de rezerva (nodul varf r ) - subprogramu l i n c arca ( ) . ~ Se seriu numerele din stiva (nodul var f ) i n fisierul text - subprogram ul salv e aza () .
~
# i n c l ude < f s t r e &~ . h >
s t r u c t nod {i nt info ; nod * u rm ;} ;
fst ream f1 ( "stival .t xt " , i o s : : i n ) , £2 ( " stiva2 .txt " , i o s : : o u t ) ; i nt x; vo i d in it (no d * &v a r f l { v a r f = NULL; } voi d a d a ug a (n od *&va r f ) {nod *p= n e w nod ; p-> i n f o =x; p->urm=varf; va rf~~ ; } i n t este vida(nod * va r f ) {retu r n varf==NULL ; } v o i d extrage (nod * &v a r f ) {n o d *p = v a r f ; var f =varf->u rm ; d e lete p i } void crcare{nod * &va r f ) {i n i t (va r f ); wh i le (fl »x) adauga(varf) ; } voi d d~sca rca(nod * &v a r f , n o d * &v a r f _ r ) { Ln i t I va r f vr ) ; while (va r f -c-u rm! =-NULL) {x=va r £- >i n f o ; ext raqe (varf) ; adauga (var f rl ; } } void inca rca (nod *&v a r f , n o d * &v d r f r) {wh 1 l e (le s te_vi6a(varf_T )) ( x =v a r f _ r - > i n f o ; extrage(varf~r ) ; adauga(varf ) ; } } vo i d salveaza(nod *&v a r f ) ( wh i l e ( !este vida {v a r f l ) { f zccv a r f -o i.n fo -cc" "; ex t.r aqe (varf) ; } ) void ma i n () ( ne d " v e r f , " va r f r ; c rea r e (va r f) ; fl . cl o s e () ; _ descarca (v a r f va r f r) ; e xtrage(varf) ; - incarca{varf ,var[_r} ; salveaza(varf); f2 . c l o s e {) ; } j
Fieeare problema se va deseompune in subproblerne ~i algorilm ul pentru rezolvarea unei subprobleme se va impleme nta cu un subprogram. Datele se transmit i ntre subproqrarne cu ajutorul pararnetrilor de cornunicatie ;;i nu al varlabilelor globale. Se creeaza stiv e in nodurile carora se merno reaza inforrnatia (numere sau caracte re). lnforrnatia se citeste dintr-un fisier text i n care , nume rele sau caracterele, sunt memora te pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfel tncat sa se verifiee algoritmul pe toate traseele lui.
148
lmplcm cntarcu s t r uct u r ilo r de date
1. intr-o stiva sunt memorate numere din intervalul [1,10J, ordonal e crescator, iar i ntr-o alta stiva, numere din intervalul [20,30]. ordonate crescator. Sa S8 concateneze cere dOUE! de numere, pastrand ordonarea crescatca re. (Ind icatio. Se rastoarna a doua stiva intr-o a treia stiva , S8 rasto arna si prima suva in a treia , peste numerele din prima stiva , !?i S8 extrag numerele din a treia stiva.) Se cornp ara doua stive fara a pierde conti nutullor i n urma extragerii de noduri. 5e elirni na din stiva numerele pa re. Se rnernoreaza intr-o suva un ~i r de litere mici. Se citeste de la tastatura 0 litera mica a alfabetului - lit. Sa se creeze doua stive: una va contine literele din stiva initiala care preced in alfabet litera lit ~ i alta va conune literele din stiva ini!iala care succed in alfabet litera lit Sa se afiseze in ordine inversa num ere !e dintr-o lista linlara sim plu l nla ntuita. (Ind icat ie . Se incarca nume rele din lista lntr-o stiva, i n ordinea de parcurgere a listei, !?i apoi S8 extra g ~i se afiseaza numerele din stiva.) Se ordoneaza crescator un ~ir de numere, cu ajutorul a doua stive . Determinati complexitatea algoritmului. (Indicat ie. Se folosesc doua stive. Se serie un nurnar in Stiva 1. Se citeste un numar. Daca nurnarul din varful Stivei 1 este mai mare decal numarul citit, atunci noul nurnar se adauqa la Sliva 1; altfel , se descarca din Stiva 1 in Sliva 2 numere pima cand in varful Stivei 1 ajunge un nurnar rnai mare decal nu rnarul citit, S8 adauqa la Sliva 1 numarul citit , si S8 lncarca in Sliva 1 numerele din Stiva 2.) Sa S8 verifice daca 0 expr esie aritrnetica ce contine paranteze este balansata. adica daca fiecare parante za deschisa este i nchisa coree! De exemplu, exp resia (a+b+(cI[d-e]})+ (dis) este balansata, iar exp resia (a+b+{cI[d -e}])+(d/s) nu este balansata , (lnd icatie. Se codifica paranlezele 1-(; 2- [; 3-{; 4-); 5-J; 6-)). Daca stiva nu esle vida ~; daca difere nta dintre codul dintre paranteza citita ~i codul parantezei din varful stivei este 3, atunci se elimin a nodu! din varful stivei: aittel , S8 adauqa la stiva codul parantez ei citite . Daca stiva este vida la term inarea evaluarii expre siei, inseamna ca expr esia este balansata .) ~i ruri
2. 3. 4.
5.
6.
7.
~() rit 1II DC
irn
Cele doua extr ernitati ale coz ii S8 nu mesc ca p ~i baz a . Ada uqarea de noduri la coada se face pri n nod ul baza , iar extragerea ~ i consultarea unui nod est e perrn isa nu mai prin extremitatea cap (se extrage cea rnai veche intormatie adauqata). Imp lementarea dina mica a cozii se face la tel ca a unei liste liniare , cu deosebirea ca: -) primul nod al cozii va fi indicat de pointerul catre tipul nod . iar ult imul nod at co zii va fi indicat de pointerul ,i. catre tipul nod : -7 pentru adauqarea unui nod . se poate folosi numai algoritm u l de adauqa re dupa ul timu l no d ; -7 pen tru extrager ea unui nod se poate folosi num ai algoritm u l pent ru elimina rea prirnului n od . Altle l spus , prelu cr area unei cozi se face d e la ca p s p re baza ~ i se prelucreaza intotdeaun a nodul d in ca p ul cozii. Accesul la inforrnati a din acest nod se face cu c.ap-c-Lnfo r"'
iaa es te coada care nu confine nici un no d si ad resa no d ului cap are va loarea NULL (ca p ~ N UL L ; ) . in coada vid a nu se mai pol execut a ope ratii de ex tragere de noduri. Coada poate sa ajunqa sa fie vida in doua cazuri : la in itlaliza re sau dupa ext rage re a ultimul u i n od . Pentru testarea unei cozi daca este vida se po ate implem enta functia operand este_ v i d a () ca re va furniza val oarea 1 ("adevaran. dad! este vida , :;;i valo area ("fa ls") daca nu este vida .
°
III fo rill 'I tid
149
int e ste_v ida(nod *c a p ) {return c a p == NULL ; } Pentru preluc rari cu ajuto rul coz ii puteti folosi urrnatorli algorit mi: -7 lnitlallzar ea cazii ; -7 adauqa roa unui nod la coada: -7 ex t rage re a unui nod din coa d a: -7 con su lta rea nodului di n cap ul co zii.
2.6.7.1.lnitializarca cozii Prin acest algoritm se creeaza co ada car e con tlne un nod . in acest caz , nodurile cap
~i
baza vor avea aceeasi ad resa . Implem entarea algori tmului. Se foloseste functia procedura la i ni t {} ai carei parametri cap si ba za S8transmit prin referinta, deoarece sunt parametri de iesire. v o id init{nod *&c a p, nod *&b a za )
{ca p =n ew nod ; cap->info=x ; cap->llrl11=NULL ; baza=-cdp ; }
2.6.7.2. Adiiugarca unui nod la coada Nodul se ada uqa la coada ca succesor al bazei. Pasii algo ritmului sunt: PAS1. Se cere aloca rea de memorie pent ru nodul p . PAS2. Se scrie intorm atia in nodu l p PAS3. Nodul p se leaga de nodu! baza PAS4. Nodu l p adauqat devine nodul b aza . hnp lcm entarea alg oritmului. Se foloseste functia procedu rala adauga () al carei parametru baza S8 transmite prin referinta deoarece este parametru de intrare -iesire. void ada~ ga(nod * &b a z a ) {no d *p =n ew no~ ; p->in:o=x ; p ->urm~ NUL L ; Da=~->urm~p ; ba z3 =9 ; }
2.6.7.3. Extraqcroa unui nod din coada Nodurile S8 extrag din ccada pe ntru a putea consu lta inforrnatia care exista in nodurile urrnatoare . Un nod S8 poate extrage numa i in cazul in care coada nu este vida . Se poate extraqe num ai nodul din capul cozii (se eliberea za spatiul care a fast ocupal de nod). i n capul coz ii va ajunge succesorul nodulu i extras . Pasii algoritmu lui sunt: PAS1. Se salveaza adresa nodului cap in pointeru l p . PAS2. Succ esor ul nodului cap devine nod ul cap. PAS3. Se cere elibera rea zone ! de memorie de la adresa rnernora ta i n pointerul p .
lmplernentaroa alg oritmului . Se foloseste functia procecurala extrage () a! carei metru cap S8 transmite prin referinta, deoa rece este parametru de intrare-iesire. voi d extraq e (Ilo d * &c a p ) {n o d *p i n f o ext rage(cap ) i )}
Implem enta rca str uct u r ilor de date
150
Scop exemplificarea modului in care, pentru rezolvarea probleme i, folositi algoritmii de prelucrare a cozilor ~i implementarea lor eu ajutorul subp roqrarnelor .
Enun t ul proble mei. Se citeste dintr-un fi§ier text un §ir de numere separate prin speiiu care S8 depun tntr-o coeoe in ordinea in care sunt citite din tisier. Sa S8 a/imine numiuut din mijloeul eozii, daea numerul de noduri este impar, §i eele oou« numere din mijloe, daea numetut de noduri este par, iar num erele (amase in cooos sa se sctie lnlr-un tisier text. Pentru testarea prog ramufui se vor folosi doua seturi de numere: fl , 2, 5, 3, 4) §i fl , 2, 5, 4) . in prelucrarea cozilor, pentru a putea ajunge la intormatia care trebu ie prelucrata, trebuie extrase toate nodurile pima la nodul care contine acea informatie, deoarece nu poate fi prelucrata decat informatia din capu l cozii. Pentru a nu S8 pierde intorma tia din noduri le extrase, ele vor fi descarcate l ntr-o alta coada (de rezerva), iar dupa prelucrarea lntorrnatiei, nodu rile var fi descarc ate in continuare in coada de rezerva. pana cand coad a initiala dev ine vida. Consulta rea n odul ui ca re confine numaru l 3
coada
coada
2---l.--,,----,---=---,---,,--,---=nSUl~~
~ cap
coada
baza
ocscarca
eap =NULL
cap \ aza
desca rc a
coada de rezerva
coada de rezerva
C1IU c aPJ
Problema se des com pune i n urmatoarele subprobleme, iar algo ritmul de rezo lvare a unei subprobleme este imp lementat cu ajutorul unui subprogram: [E1J Se creeaza coa da cu numerele citite din fis ier (nodurile cap :;;i baza) - subproq rarnul creare () . ~ Se descarca coada in tr-o alta coad a (nodurile c ap _ r sl ba z a_ r) pana la nodu rile care trebuie elimin ate - subproqra rnul de scarca 1 () . Se ex trage nodul sau se extrag nodu rile din mijlocul eozii - sub prog ramul extrage () . lE1l Se descarca res tul nodurilor din coada (nodul c ap ) in eoa da de rez erva (nodul ba z a r ) - sub proqrarnul de s c arca 2 () . ~ Se seriu numerele din eoada de rezerva (nodul c ap r ) i n fisi erul text - subprogram ul s a l v eaza ( ) .
§
#1 nclude < f s t r e o rn . h > str uct nod t i nt info ; n od *u r rn; }; fs t r e a m fl( " c oadal .tx t " , 1 o s : : i n ) , f 2 ( " c o a d a 2 . t x t", ios : :ou t );
i n t x s n , i,j ; v oid in it {no d *&c a p , no d *&ba z a ) {c a p =n e w nod ; cap ->in £o ~ x ; ca p ->u ~m= NULL ; baza=cap ; } int este vi d a{nod *c a p ) {r e tu r n cap==NULL; } v o id adauga(nod *&b a z a ) {no d *p =new nod ; p ->in fo =x ; p ->u rm =NULL ; baza ->u rm=p ; baza=p ; } v 01d ext rage(nod -& c a p ) {no d *p =c a p ; cap=cap->u rm ; del ete p ; } v oid crea re{ nod * &c a p , n o d *&b a z a ) {f l» x; i nit( cap ,baza) ; n ++ ;
151
I II forill a tiea while
( f l » x)
{ a d a u g a (baz a) ;
n ++ i } }
void desc a rca_l(nod *&c a p , no d *&c a p_ r, nod *&b a Za _ L) {x v c e p - o i n f o , ext ra g e(cap) ; ini t ( ca p _r , ba z a _~r) ; i + +; while (i i n f oi extra ge(cap) ; a d au ga{baza r ); i ++;}} voi d desc a rc 3_2(nod *&c a p , noc *&ba za _ r ) {whi le (! e ste vida (cap)) {x=c a p- >i n f oi e xt r age(cap} ; a dauga(baza ~ r) ; } } v o id sa l v e a z a(nod *&c a p ) {whil e { ! este vi da (c a p } ) { f 2« c a p - >i n f o «" "; e x t ra g e (cap ) ; } } void main ()
(nod *c a p ,* ba z a ,* c ap r, *ba za r ; crea r e (cap,ba za ); f l . c los e ( ) ; if
(n%2==O)
j=n/Z -l ;-e l s e j=~/2 ; e xtrage(cap) ;
descarca_l(cap ,cap_~ ,baza_r) ; if (n %2==0) e x t r a qe (cap) ;
~
~ , " " ~
descarca_2(cap ,baza_T) ; salveaza{cap_r) ; f2 . c l o s e ( } ; J ~
Fiecare problema se va descompune in subp robleme ~i algoritmul unei subproblems S8 va implementa cu un subpro- , -f gram . Datele se transmit in tre subprograme cu ajutorul parametrilor de cornunic atie si nu al varia bilelor glo bale. Se creea za cozi in nodur ile caro ra se memoreaza numere intregi . Sirul de numere S8 citeste dintr-un fisier text i n care sunt memorate pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfe l i ncat sa se veri fice alg oritmul pe toate traseele lui. 1. Se elirnina din coada nume rele pare. 2. Se verifica caca numerele dintr-o coada sunt ordonat e (cresca tor sau descrescator). 3. Se concateneaza doua cozi, adauqano a doua coada la sfar§iitul primei coz i. 4. Se formeaza din doua cozi 0 a treia coada care contine rnai intai numerele pare din pozitHle impare din prima coada si apo i numerele impare din pozitiile pare din a doua coada. 5. Se inverse aza ordinea numerel or dintr-a coada cu ajutorul unei stive .
Tem«
'>::::J pentru rezolva rea
2.6.8. Aplicatii practice 1. Ana liza lexi cal a a unui text. Sa se afiseze. i n ordine alfabetica, cuvintele dintr -un text ~i frecventa lor de aparitie i n text. 2. Exista co ua automate care elibe reaza bonuri de ordin e pen tru 0 coada de aste ptare. Pe fiecare bon de ordine este trecut nurnarul bonului ~ i momentul la care a fost eliberat (exprimat in ora , minut si secunda). Bonur ile au numere unice . Deservirea persoanelor S8 face in ordinea momentului de eliberare a bonurilor. Sa S8 organi zeze 0 coada de asteptare pe baza bonur ilor emise de cere dou a automate. 3. Jocul lui Josephus . i ntr-un grup de n copii, acestia sunt aranja ti in cerc ~i sunt nurnarati ince pand cu primul copi l pana la nurnaru: k . Cop ilul care are numa rul k iese din joe. iar nurnaratoarea ince pe din nou de la 1 cu urrnatorul copi l. Sa S8 afisez e ordinea de iesire din joc a copiilor. Se vor implementa doua solutii, folosind 0 structure de date de tip: a) cca da: b) lista circulara simplu lnlantuita.
4. Sa S8 simuleze , cu ajutorul unei stive, 0 rnasina de adunat si muJtiplicat. Numerele S8 introduc i ntr-o stiva - si operatia S8 inche ie atunei cand S8 citest e de la tastat ura operatorul n +" (pentru adunarea numerelor) sau operatorul n *" (pentru l nrnuttirea numerelor). Se ma i folosesc : caracterul .A", pentru a anula ultimul nurnar introdus, ~ i caracterul n C~, pentru a anula toate numerele introduse.
_152 _ _ __ _ _ _ _______ _ _ _ --'-Ir:.:.: " I'l cl11 ellta fea Sl f llet IIfilllf de dal e
sa
5. Un automo bil trebu ie parcurqa un traseu care forrneaza un poligon, cu intoarcere la statia de pom ire. Pe trase u exista n statii de alimentare cu carburant care formeaza varfurile poligonului. Fiecare statie de alimentare i este caracterizata de coordonatele (x;,y;). Automobilul consurna 1 litru de carburant la fiecare 20 km ~i nu exista restricne pentru capaeitatea rezervorului. Se citesc dintr-un fisier text urrnatoarele informaui: de pe prirnul rand nurn arul de statii n , de pe urmatorul rand un sir de n numere Cj care reprezinta cantitatea de comb ustibil cu care este alimentat la statia i, iar de pe urrnatorul rand n perechi de num ere X j ~ i Yi care reprezinta eoordonatele statiei i. Din ee punet trebuie sa piece automobilul astfel incat sa parcurga traseul cu intoarcere in punctul de pornire ~i sa nu n3mana tara combu stibil.
Pent ru exercitiile urrnatoa re, daca nu lolosese urrnatoarele dat e:
S8
struct no d tint inf o ; n od * u r m;} ; r. o d * p r i m ,* u l ~ i m /* p ,* q/* r /* u / int x , k ;
specifica sernnificatia variabilelor de mem orie, se
* v :: /* c a p ,* b a z a ;
Raspundoti : 1,
Analizati din punet de vedere al cornplexitatii algoritmii pent ru prel uerarea listelor. Se va folosi i n determinarea cornplexitatii timpul maxim de exec utie Pentru compararea algoritmilor com pletat i urrnatorul tabel: Lista sim p!u i n l a n~ Li sla dublu inf an!uita Neordon ata Ord onata Neordonata Ordonata Cau t a (L ,k) Ad a ~g ~hL ,~)L _____
Elimina L,x ~u cce s o r u l
(h> u r m );
co u t «
p - > i~f o ;
3.
0 lista simp lu in lantuita contine, i n ordine . urmatoa rete nodu ri: 1 - ) 2 - ) 3 - ) 4 --t 5 -» 6 -o 7 ~) 8. Ce se va afisa i n urma executie i urrnato arei sec vent e de program? for {k =O,p::.:;prim;p->urm !::.;;NULL ; p~p->u rrn) if (p -> i n f o%2) k += p->i nf o ; cout« k; 4. Ce se va afisa i n urma executiei urrnatoarei secvente de program , daca lista sirnplu inlantulta conf ine. in ardine , urrnatoar ele noduri: 1 - ) 2 - ) 3 - ) 4 - ) 5? Dar dac a naduri le ei sunt, i n ord ine: 1 - ) 0 - ) 3 - ) 0 - » 5? f or (p =p r i m; p-> i~f o!= O ;p=p -> u rm : ; c out« p - >i n r o;
5.
Ce se va afisa in urma exec utiei urrnatoarei secv ente de progra m, dac a lista sirnplu contine , in ordine , urrnatoarele nadur i: 1 - ) 2 _.) 3 - ) 7 - ) 8 - ) 9? Dar daca nodurile ei sunt, in ordine: 1 - ) 2 - ) 4 - ) 5 ~) 7 -~) 8?
inlan~uita
f or ( ~ = O , p = p r i m ; p - > i n f o ! = O ; p = p - > u rm )
Informatica
153
i f f p -c-urm -'> 'i n f o r p -' > .i n.f o e -eL ) cou t cc k ,
k++;
Adevarat sau Fals: 1. 2. 3.
Daca p este prim ul nod al listci, pentru a afisa informatia din al doil ea nod se executa secventa de instructiuni; p e p - c- u r m, cou t -cc p- c- Ln fo • Daca peste pr im ul nod al listei, pentru a afisa infcrrnatia din al doilea nod se executa instructiunea: cou t-cc p- c- u rm- >info; Dac a p est e primul nod al Iiste i, pentru a afisa inforrnatia din al treilea nod S8 executa instructiunea: c ou t.c -cp - »u r m- c- u rm- >i nfc :
Aleqeti: 1.
Daca p este primul nod al liste i, iar q al doile a nod al listei, prin ce instructiune se leaqa nodul p de nodul q ? a. p'urm ; C. p=q->urm ; d . p -c-u rm e q : 2. Care din tre urmatoarele variante realizeaza corec t leqaturile in cazu l inserarii unui nod nou in tr-o lista simplu lnlantuita, daca nodul nou are adresa p, iar nodul dupa care se tnsereaza are adresa q? a. o -c-u rme o : q ->urm=p ->urm ; b . p ->urrn=q -> urm ; q ->urm=p ; C. q -c-u rme p -c- u rm : d . p->urm=q->urm ; p->urm=q ; 3. Daca p este primul nod al listei, ce instructiune trebuie executata pe ntru a afis a intorrnati a mernorata in al treilea nod? a . c ou t « p - >u r m- >u rm- >i n f o - >i n f o ; b. c o u t« p - > u :::- m - > i n f o ~ > u r m ~ > i n f o ; c. cout« p - > u .rrn- > u r :n- >i n f o; d . cout« p ->u rm ->u rm->u rm ->info ; 4. Daca p , q si r sunt trei nod uri co nsecutive ale listei , pentru a intersch imba nodul q cu nodul r , care dintre sec ventele de instructiuni este corecta ? a . r ->unn=q ; q ->urrn=r ->urm ; p -c-urrno r : b . p - >u r m= r ; r->unn=q ; q-c-urrrr-r'-c-u rrru c.
q -c- u .rme r -c-u rm .
r -c- urrn-iq .
p ->unn=r ;
d. .r-c-u r me -q , p-c-urme r : q -c-urrn-ir -c-urm . 5. Daca p este un nod al listei " i q un pointer catre tipu l nod, care dintre secventele de instructiuni urrnatoa re realizeaza corect leqaturile astfel i ncat sa se elimine din lista cele doua nod uri care urrneaza dupa nodu l p? a . p ~>u rm=p->urrn->unr,->urm ->urm ; b. p- c- u rm- p- ou rm- c -u rm . C. p->unn->urm=p->urm-> urm ->urm ; d . q =p->unn ; p -c-u rme q -c-u.rm-c-u.rrn: 6. Daca L1 este 0 lista orqanizata ca stiva . stab iliti care este adresa corecta de extragere din stiva:
a.
7.
de lete p ; p=p ->urm ; b. r =p ->urm ; p=r ; delete p ; c . r =p ; p e p-c-u rm : delete p ; d . r e -p - c- u r m: p=r ; delete r ; Ca re dintre urmatoarele secvente de progr am ca lculeaza , in variabila k , suma elementelor din lista simp lu inlantuita: a. for {k= O, p=p r i m; p !=NULL; p = p ->urrn) k+ = p-c-i n f o : b. fo r ( k= O, p""p r i m; p->urm ~ =NULL ;p = p -c-u rm I k+=p-> info ; c. k =O ; p=pri:n ; while (p! =NULL) { k + = p->info ; p = p -c-u rrr u } d . p=pr im ; k = p ->in fo ; do { p = p-c-u rm, k+= p ->info ; } while (p ->unn! =NULL ) ;
i n urrnator!i 7 iterni , variabilele p si q mernore aza adresele de i nceput ale listeJor liniar e simplu lnlantuite nevide L1 si respectiv L2. Elem entele listelor sunt de tipul no d. (Baca taureat - 5e siunea iunie-iu lie 2003)
154 8.
Implernentarcu struct urilor de datc
Trebuie mutat primu l element al listei L1 imediat dup a primul elem ent al listei L2, in rest listele ramanand neschi mbate. Car e dintre urrnatoarele atribuiri sunl nec esare ~ i in ce ordine se etectueaza? 1) r eq- ourm . 2) r-ep - ourm , 3) q-c-urmep , 4) p=r ;
5) p- >urm=r ; 6) p- >urm =q- >urm; a. 1 6 3 4 b. 1 3 5 c. 2 6 3 4 d. 2 3 6 4 9. Trebuie mulat primul element al listei L1 imediat dupa primu l elem ent al Iistei L2, i n rest listele rarnanand nesch imba te. Care dintre urrnatoarele atribu iri sunt necesare ~i in ce ord ine se ete ctuea za? 1) r =q- >urm; 2) r =p->urm; 3) q- c-urm-p , 4) p e r r
5) p->urm=r ; 6) p- >urm =q- >urm, a. 1 6 3 4
b. 1 3 5
c. 2634
d. 236 4
i
10. Daca la sfarsitu l exe cutarii secventei alatu rate valoarea r =p- >u nn r"'l'Nh':w ~ i var iab ilei r es te nu la, atu nci lista L 1: whil e J .t:'! = p && r ) a. are eel putin doua elemen te b. este vida r';'i->UDn i 'l! c. este incorect constituit a d . nu este circulara '"' 11. Functia egale(ad1 ,ad2) returneaz a valoarea 1 dac a ~ i numai daca inforrnatiile utile mem orate la adr esele ad1 ~ i ad2 coincid, altfel return eaza valoarea O. Secventa alaturata calculeaza i n variabila l ntreaqa n nurnaru l de elemente din lista L1: a. disli ncte consec utive aflate la i nceputullistei n =O; r=p ; b. egale consecutive aflate la inceputul listei while (e ga l e (r , p) && r } c. care sunt egale cu primul element { r = r - >u Lln: n-l-+ ; } d . car e sunt egale doua cate doua 12. Daca L1 este 0 coada , cu p adresa primului elem ent si u adresa ultimu lui element, iar r este adresa unui eleme nt ce urrneaz a a fi adauqat i n coada , stabiliti care dintre urrnatoarele es te 0 ope rali e co rec ta de adau qare : a. rvu - c- urm. u= r ; b. r- >urm::o: p: pe r : C. u -o u rme r : u e r • d. r - c- u rmeu , u e r : 13. Pent ru a uni listele L1 ~i L2 plas and lista L1 in continuarea listei L2 , se etectueaz a ope ratiile : a. r e q : whil e (r -> u rm ) { r e r - c-urm, r -> u rm=p ; } b. r urm) r-e r'- c -u rmr r -c-urm- p : d. r =p : wh il e ( r - >urm) r =r ->UnTIi r - >urm::o::q i 14. Pentru a determina nurnarul de elemente ale liste i L1 se utilize aza 0 variabila intreaqa n astfel : a . n =O: .r e p , while ( c- -c-u rm) {r e r -c-urm . n++ ; } b . n =O: r ep r while ( r) r e r -c-urm: n+ ... ; C. n =O: r e p s while ( r) { r e r -ourm. n + t- ; } d . n =O; r =p ; do { n + + : } while I rl
in urmatorii 6 itemi, variabilele p ~i u rnernoreaza adresa primului, resp ectiv a ultimului element al lisle i Iiniare simplu ln lantu ite nevide L. Elementele listelor sunt de tipul nod. (Bacalaureat - Sesiune a august 2003) 15. $t iind ca L este fermata din 4 elemente, atunc i adresa penultim ului elem ent este : a . p-c- u rm- c- u.rm- > b . p -c-urrn- o u r m C. p- >u r m d . p - >u rm->urm-> urm 16. Elerne nte le din lista L aflate la adre sele q si r sunt vecine (consecutive) i n lista c aca si num ai daca: a . q - >u rm r-c-u rrn b . r- >u r m == q && q ->u nm = = r C. q->u rm d . q == r r I I r - >unn q
Intorm atica
155
17. Stiind ca este cefl nita 0 functie cnf astfel incat cnt(a1,a2) returnea za nurnaru l de elemente situate i n lista i ntre elementele de la adresa a1 si a2 (fara a nurnara elementele de la adrese le respective), care dintre urmatoarele ex presii arata al cate lea este elementul memo rat la adresa q in lista L? a . c n t (p ,q ) +2 b . c nt (q ,u) +2 c . cnt (q ,u)+ l d . cnt (p , q) + l 18. Este defini te 0 fun ctie min astfe l tncat min(a 1,a2) returneaza valoarea 1 daca 'Ii numai daca eel putin unul dintre elementele memorate la adrese le a1 ~ i a2 S8 afla in lista L ~i returneaza valo area a in caz contrar. Care dintre urrnatoa rele expresii are valoa rea 1 daca ~j numai daca elementul de la adresa q S8 afla in lista L? a . min{p , q)
b. min(q ,u}
c . min (p ,u )
d. mi n (q ,q )
19. Un element aflat la adresa q face parte din lista L daca la starsi tul executarii secve ntei alaturate va riabila r are valoarea : a. 1 b. p e. q d. NUL L ! 0 20. Lista L are exac t doua elemente daca: a . p-> unn= =u b. u ->urm==NUL L / ! u->u rm c . P'''' U d. p ->u rm==NUL L / ! p ->urm 21. Daca in variabila p este rnernorata initial adresa primului nod a l unei liste simplu Inlantuite cu eel putin 10 elemente, pentru a obtine in variabila p adresa pen ultimului nod al listei S8 executa secven ta: b. while (! p- >unn) p ->u rrn; a. while ( ! p ) p->urm ; C. wh ile (p- >urm->urm ) p - c-u rm, d . while (p - >u rm) p - >u rm ; (Baealaureat - Sesiunea speciala 2003) 22. Stiind ca intr-o lista circular a simpl u inlanluita cu eel putin doua elemente. adresele p si q reprezinta adresele a do ua elemente distincte din lista, atunci elementul memo rat la adresa p este succesorul elementului memorat !a adresa q in lista daca si numai daca: b . q ->u rm =:::., p a . p-> u nn == q ; C. p ->urm == q -c-urrn , d. q - c -urm-o u rrn == p (Bacalau reat - Sesi unea speciala 2004) 23. Daca lntr-o lista circulara simplu inlantuita . cu eel putin 4 elemente, se cunoaste adresa p a unui element din nsta, atunei este accesibila adresa element ului din lista precedent celui aflat la ad resa p ? a. Nu. b . Da, in orice situatie . c. Da, numai daca p este adresa prirnului element al listei. d . Da, numai daca p este adresa ultimului element al listei . (Bacalaureat - Sesiunea iunie-iulie 2004) 24. intr-a lista liniara simplu i nlantuita nevida , pentru eliminarea elementului ee urmeaza dupa elementul aflat la ad resa p (elementul de la adresa p nu este nici primul, niei ultirnul) un elev utilizeaza trei instructiuni simple (nestructurate). Care dintre instructiunile urrnatoa re poate fi una dintre cele trei? a . p ->unn-> urm = p ; b . d i s po s e (p ) c. p ->urm = p->urm- >u rm ; d . p- c-urm = p (Bacalaureat - Sesiunea iunie-iulie 2004) 25. Noduri!e unei liste dubl u inlantuite retin in carnpurile info, adp si ad u 0 inforrnatie numerica, adresa noduJui precedent si respectiv adresa nodului urmator. Stiind ca lista este eoreet construita si ca doua noduri p ~ i q ale acesteia se lnvecineaza, atunci: a . p- >adp==q - >ad u b . p ->adu ==q ->adu C. p -c-e du we q d . p - >a d p ==q ->adp (Bacalaureat - Simulare 2006)
156 _ _ _______ _ _ _ _ _ _ ---'I=1llplclI1 C II ta rca st.-nctn rHo.- dc da te ___ 26. Daca intr-o lista liniara simplu inlantuita adresa de inceput a listei este p , iar adresa de sfarsit este u , atunci transfonna rea llstei in lista circulara S8 realizeaz8 prin instructiunea : a. p -c-u rm -.u b . p cu- o-u rm C. u - c-u r rnvp d . ue p - c- u r m (Bacalaureat - Ses iunea iunie-iulie 2004 ) 27. Se considera 0 lista simplu Inlantuita ale carei noduri retin in carnpul urm adresa nodului urmator allistei sau NULL daca nu exista un nod urmato r. Pentru inserarea unui nod aflat la adresa p irnediat dupa un nod al listei aflat la adresa q, 58 utilizeaza unele dintre urmatoarele atribuiri: 1) p -c-ur me q , 2) q->u rm =p ; 3) p=q- >urm; 4) q=p -> urm ; 5) p- >unn = q - >u r m; 6) q - >urm= p - >u r m; . Stabiliti care dintre acestea S8 utilizeaza ~i in ce ordine: d. 23 c . 52 a . 36 b . 24 (Bacalaureat - Simulare 2006) 28. Variabila vf mernoreaza adresa elementului din varful stivei . Fiecare elemen t al stivei rnernoreaza intr-un camp ad r adresa urrnatorului element din stiva. Variabila q poate memora adresa oricarui element al stivei. Sa se realizeze elirninarea elementulu i din varful stivei: b. q =v f-> a dr ;vf =q - >ad r ; d e l e t e q ; a . q - >a d r =v f; v f - >a d r =q;delete q ; d. q= v f ; v f =q- >a dr ; delete q ; c . q =v f; v f =v f - >a d r; d elete 'If ; (Bacalaureat - Simulare 2003) 29. 0 lista tiniara simplu i nlan\uita cu adresa de i nceput merno rata i n variabila p este vida daca: b. p ~~ NULL I lp a. *p ==NULL I ! "" P d . e p ! =NULL / "p c. P ! =NUL L I p (Bacalaureat - Sesiunea spec iala 2003 ) 30. i ntr-o lista dub lu in lantuita cu cel pu tin 4 ele mente, fiecare ele»acu-:>adp ; men t rel ine i n carnpu l adp ~ i adu adresa eleme ntul ui precep""'q->odtJ; dent si respectiv urrnat or din lista. Daca p reprezinta adresa p- >ad p=NOLI ,; primu lui element din lista, iar q e ste de acelas i tip cu p , atunci delete q ; secventa alaturata realizeaz a: a. interschim barea pr ime lor doua compo nente b . elim inarea primu lui element d. eliminarea ult irnului elemen t c . elimin area ce!ui de-a! doilea element (Bacalaureat - Sesi unea specia la 2005) 31. i ntr-o lista dublu inlan! uita cu cel putin 4 elemente, fiecare eleme nt reline i n carnpu l ad p ~ i adu adresa eleme ntului precedent ~i resp ect iv urrnator din llsta , Daca p reprez inta adresa pr imulu i elemen t din lista , atunci p ->adu->adu->adp este a. adresa primu lui element b. adresa celui de-al doilea element c . adresa celu i de-al treilea eleme nt d . adresa celui de-al patrulea elemen t (Bacalaureat - Simulare 2005) 32. Intr-o lista circulara simplu i nlantuita fiecare element refine i n carnpul next adresa eleme ntului urmat or. Stiind ca. pentru variabi la p ce rnernoreaza adresa unui element oareca re din lista, este adev arata relatia p ->ne xt=p , atunci lista este fermata din: a. zero componente b. 0 components c . 2 componente d. minim 3 componente (Bacalaureat - Sesi unea august-septembne 2005 ) 33. Daca vf ind ica ultimu l nod al stivei , care dintre urrnatoa rele expresi i trebuie sa fie adeva rate , pentru ca stiva sa fie vida? a. v f ==NULL b. v f - >urm ==O
q;. ; p-
c.
v f - c-u r me e Nu L l,
d.
vf ~ ~O
Informati d
157
34. Daca v f indica ultimul nod al stivei, jar q urrnatoarele secve nte de instructiuni extrage a. q e v f-c-u r rn : v f = q -> u r m; d e l e t e q; c . q =vf ; v f = q -> u r m; d e l e t e q ;
un pointer catre tipul nod, care dint re nodul d in varful stivei? b . c.=v :: ; v : =v f ->urm ; d e l e t e q ; d . q =v f ;v f = q - >u r m ; d e l e t e q ;
35. Daca variabila cap rne moreaza adresa primului nod din coa da si va riabil a b aza rnernoreaza adresa ultimului nod din coada, ca re dintre urrnatoa rele exp resii trebuie sa fie adevaratc . pentru a avea 0 coada vida? a. be z a e v NlfL l .
b . cap-> urm= == ba z a
c . cap==b az a
d . c ap = = NUL L
Miniproiccte: Observatie: Pentru realizarea urrnatoarelo r miniproiecte S8 va lucra i n echipa. Protesorul va numi ccnducatorii de proiect, le va distribui proiectele si le va aloca un buget pentru realiza rea lor (pentru simpli!icare , buge tul va fi folosil numa i pentru plata membrilor ech ipei care vor realiza proiectul). Conducatorii de proiect vor negocia cu profesorul termenul de predare a aplicatiei, echip a cu care 0 vor realiza, si , daca este cazul, bugetul care Ii s-a alocal initial. Pe timpu l realiza rii aplicatiilor, membrii echipelor pot migra de la a echipa la alta. cu co nditia sa rarnana incadrati Intr-una dintre echipe, iar miqratia sa se faca numai cu accep tul conducatortlor echi pelor int re care migreaza. Fiecare echipa va fj to rrnata din : -7 Condu catoru! pro ie ct ulu i I~i va forma echipa ~i va distribui sarcinile pentru fiecare membru, negociind initial suma repartiza ta din bugetul alocat pentru realizarea sarcini i. Va fixa termene de executie pentru fiecare memb ru al echipei ~i va urma ri rnodulin care sunt respectate aceste tenn ene. In cazul In care unul dintre membrii echipei nu i~i realizeaza core ct :?i la timp sarcinile, va redistr ibui a parte dintre sarcini lntre ceilalti rnernbri ai echipe i, renegociind suma din buget alocata fiecaruia dintre ei La sfarsit , va da calificative fiecarui membru al echipei , In functie de modul in care si-au respecta t termenele, de modul in care au cooperat cu ceiialti membrii ai echipei si de calitatea lucrarilor executate. -7 Ana listu l va analiza cerinte!e info rmatio nale ale aplicatie i. va determina functiile apli catiei ~i va elabora modul de rezolvare (datele ~i structurile de da te folos ite, procesele in care este descornpusa aplicatia - care vor f implementate cu subprograme - si meniul care asiqura intertata cu utilizatorul ). In rea!izarea acestor sarcini va f ajuta t ~i indrurnat de conducatorul proiectului. -7 Grupul de pro g ram atori (numarul lor trebuie sa fie stabilit in funct ie de dimensiunea proiectu!ui) va implernenta in Iimbajul de programare solutia qasita de analistul echipei. Conducatorul proiectului Ie va repartiza subprogramele pe care Ie vor realiza ~ i specificatiile fiecarui subprogram: datele de intrare , datele de iesire si functia subprogramului. -7 Testo ru l va testa aplicatia . EI va trebu i sa aleaqa set uri de date de intrare astfel incat sa gaseascii erorile de loqica ~i de executie ale aplica tiei , -7 Documcnta ristu l va Intocm i docurnentatiile aplicat iei : documentatia pentru beneficiar si docurnentatia pentru pro iectantul aplicatiei La terminarea pro.ectului membri i echipelor vor prim i note pentru evaluarea activ.tatii lor. Sistemul de evaluare trebuie sa tina cant de venitu rile rea lizate pentru munca depusa , de calificativul obtinut de !a conducatorul de proiect si de ca!itatea muncii eva luata de profesor. 1. Pentru biblioteca scolii sunt aduse carti de la mai multe edituri. Cartile trebuie organ izate i n ordinea alfabetica a autor ilor , ~i pe fiecare autor in ordinea alfabetica a titlurilo r. Este posib il ca pen tru acelasi autor ~i acelasi titlu sa se prirneasca ma i mu lte exempla re. Se va folosi cate 0 stiva pentru fiecare autor, In care se va simula teancul de titluri primite , pentru fieca re titlu rnernorandu-se si numarul de exe mp lare . Numele autorilor si adresa
158
Implcm cnta rca st ruct ur ilor de da te
varfului stivei de carti asociate S8 vor memora i ntr-o lista ale carei elemen te contin in info rmati a utila do ua carnpuri : un camp de tip sir de car acte re pentru numele auto rulu i si un camp de tip pointer cate tipul nod al stivei pentru varful stivei. Scrieti a aplicatie care sa asigure urrnato arele ope ratii prin intermediul unui meniu : a. Distribuirea pe autori si titluri a unui teanc de carti sosit de la 0 editura. b . Afisare a titlurilor si a nurnarului de exemplare ale unui autor al ca rui nume se citeste de la tastatura. c. Afisarea in ordine alfabetica a autorilor si a numarului de titlu ri si de exemplare pent ru fiecare auto r. d. Numele autorilor cu cale mai multe, respectiv cu cere rnai putine titluri. e. Numele autorilor cu cele ma l mu lte, respectiv cu cele ma i putine exemplare. 2. La un concurs participa mai multi candidati identificati du pa nume ~i prenume . Fiecare candidat primes te la i nscriere un nurnar de identificare. Concu rsul consta i n trei probe , notele putanc lua valori de la 1 la 10. Rezultatul concursulu i se stabileste pe baza mediei aritrnetice a notelor primite. Trebu ie prevazute doua varian te de admitere a candidatiler: sunt adrnis i toti candid atii care au a medie mai mare decat m ~i sunt admlsi, i n ordinea med iilor, primii k candidat i (valorile pentru m si k se citesc de la tastatu ra). Scrieti 0 aplicatie care sa asigure urrnatoa rele operatii prin intermediul unui rneniu: a. Inscrierea unui no u cand idat la concurs. b. Retragerea unui candidat din concurs. c. Completarea notelor ~ i calcularea mediei pentru fiecare candid at. d . Modifica rea infor rnatiilor despre un candidat. e. Afisarea candi datilor adrnisi i n fiecare dintre cele doua variante in ordinea descres catoa re a medi ilor. f. Afisarea candidatilor adrn isi in fiecare dintre cere dou a va riante i n ordinea alfabetica a numelui si prenumelui . 3. Intr-un depou exista 0 linie pe care se gasesc mai multe locomotive , aranjate in ordine a in care au intrat in depou, ~i a linie pe care se TRIAJ LOCOMOT IVE gasesc mai multe vagoan e, aranjate i n ordinea i n linia de linia de care au intrat in depou. Fiecare locornotiva ~i intrare i e~ i re fiecare vagon are un num ar de identificare. In plus , pentr u fiecare vagon este preciza ta ~ i clasa (clasa 1 si clasa 2) Pentr u linia care contine locomotivele exi sta un tria] cu k linii de rnanevra . Valoa rea k lin ii de rnan evra pentr u k se citeste de la tastatura. in triajul vagoanelor exista 0 linie de intra re ,,1 0 linie de iesire pe care depla- TRIAJ VAGOANE sarea se poate face numa i in sensul saqetilor si 0 linie de linia de linia de ma-nevra pe care dep!asarea se poate face in ambele intrare ies.re sensuri. Scrieti 0 aplicatie care sa asigure urrnatoarele operatii prin inter-mediul unui meniu: a. Intrarea unei locomotive in depou. l ,inia de _ b. Afi~area locomotivelor din depou . Jm anevra c. lntrarea unui vagon in depou . d. Afisarea vagoanelor din depou , precizandu-se cate vagoane sunt de c1asa 1 ~i cate sunt de clasa 2. e. Formarea unei garnituri. Garnitura este fermata dintr-o locornotiva cu numarul de iden-tificare p n vagoane , dintre care m vagoane sunt de clasa 1 (valorile pent ru p. n si m se citesc de la tastatura).
"i
Inform atica
159
2.7. Graful 2.7.1. Definitia matcmaticii a grufului Se nurneste graf (G) 0 perec he ordonata de rnultirni (X,U), unde X este 0 rnultirne finita ~i nevld a, iar U 0 multirne de perechi formate cu elem ente distincte din mu ltirnea X (familie de subrnultimi cu doua elemente din rnultimea X). Terminologie:
-7 Elem entele rnultirnii X se nume sc varfuri sau noduri. Mulfirnea X se mai nurneste
~i
multirnea varfurilor sau rnultimea nodurilor grafului G. Ea este de forma :
x = {X1J X2, X3, ... , Xi• ... , X
n}
unde Xi reprez inta nodul i al grafulu i G care are n noduri . -) Ordinul grafului reprezinta numarul de noduri ale grafului, n :
ordinul grafului = eard(X) = n
-7 Elementele rnultimii U sunt perech i de nocuri , adica submultirn i eu doua elemente din rnultirnea X ~i se noteaza cu Uk . Elementul Uk este definit de perechea de forma {x;, Xj} , unde x, XJ EX ~i X;*XJ (elemente distincte din rnultirnea X). Elementul u, leaqa nodurile x, ~ i xJ si se noteaza astfel : [X;, Xi). Multirnea U este de forma: U={U1. U2, U3 , ....
ue, "
OJ
Um}
Clasificarea grafurilor: Criteriul de clas ificare folosit este proprietatea de simetrie a rnultirnii U .
Mul\imea U are proprietatea de s imetrie daca §i numai daca, pentru orico per ee he d e noduri (x;, Xj), daca [x, Xi}E U, at un ei §i (xi ' X;}E U in functie de prop rietatea de simetrie, grafurile se clasifica In : ~ Grafuri neorientate. Un graf G=(X,U) este un graf neorientat daca multirnea U are pro prietatea de simetrie. Mu1limea U este fermata din pereehi neord onate {xi, x;}. ~ Grafuri orientate. Un graf G= (X ,U) este un graf orientat daca rnultimea U nu are proprietatea de simet rie. Mu ltimea U este fermata din pe re c hi ordo na te { Xj, Xi}. Pentru a identi fica tipu l de graf pe care 11 veti folosi pentru a repre zenta datele , daflniti rel atla dintre noduril e grafului si verificati daca relatia are proprietatea de sirnet rie, astfel: ~ Daca nodul X In relatie eu nodul y irnplica ~ i ca nodul y este In relatie cu nodul x, atunci grafu l este neoriental. ~ Daca nodul X In relatie cu nodul y nu irnplica ~i ca nodul y este In relat ie cu nodu! x, atunci grafu l este oriental.
I S1bul.dlJi.u de CSlZ I Seop: identifiear ea tipul ui de graf pe care 11 folositi pent ru a rezolva problema . Enuntul problemei 1. Pe neno unui jude! exist» mai muite locetitet) care sunt legate prin sose te pe care S8 citcule in ambele sensuti. Sa se identltice traseele pe care se poate ajunge de la localitatea A la tocalitatea B.
Irnplernentarea strueturilor de da te
160
Nodunle grafului sunt localitatile. Relatia care se stabileste lntre nodu rile grafului este: nodul x este in relatie cu nodul y, daca exista 0 sosea care lea qa direct local itatea asociata ncdului x cu localitatea asociata nodului y. Relatia are proprietatea de simetrie, deoa rece soseaua care leaqa direct localitatea asociata nodului x cu localitatea asociata nodului y leaqa direct ~i localitatea asociata nodului y cu localitatea asociata nodului x. Pentru reprezen tarea caller de cornunicatie dintre lccalitati S8 va folosi un graf nooriontat . Enuntul problem ei 2. Pe haria unui cartier existe rna! multe itite rsectii care sun! legate de strezi. Pe unele strezi S8 paale circula in ambefe sensuri. pe alte strez! numei tnu-u» anumit sens . Sa S8 identifice traseele prin care se poate ajunge de la iniersectie A la intersectie B.
Nodurile grafului sunt intersectii'e. Relatia care se stabileste lntre nodur ile gralului este: nodul x este In relatie cu nodul y , daca exists trafic care leaga direct intersectia asociata nodului x cu intersectia asociata nodu!ui y (se poate circula de la nodul x la nodul V). Relatia nu are proprietatea de simetrie deoarece, daca exista 0 strada care leaga direct intersect.a asociata nodului x cu intersectia asociata nodului y §i pe aceasta strada exista trafic de la nodul x la nodul y , nu este obligatoriu ca pe acea straca sa existe trafic si de la nodul y la nodul x. Pentru reprezentarea traficului auto dintre intersectii S8va folosi un graf ori entat . En u ntul p rob lemel 3. La nivelul unui grup de persoene se face un studiu social. intre persoane se stabilesc retetii de prietenie, dar §i releti: de simpatie . Sa se descrie eu ajutorul grafului rotntiile dintre porsoane.
Nodurile grafului sunt membrii grupului de persoane. intre persoane se pot stabili relatiile: -j- Relatia de prietenie este 0 relatie definita astfel : persoana x este In relatie cu persoana y , daca este prietena cu ea. Relatia este sirnetrica deoarece, daca persoana x este prietena cu persoana y , atunci si persoana y este prietena cu persoana x (relatia de prietenie presupune reciprocitate ). Pentru reprezentarea relatillor de prietenie dintre membrii grupului se va folosi un graf noorientat . -j- Relatia de simpatie este 0 relatie defin ita astfel: persoana x este In relatie cu persoana y , daca 0 simpatizeaza. Relatia nu este sirnetrica deoarece , daca persoana x simpatizeaza persoana y, nu este ob ligatoriu ca persoana y sa simpatizeze persoana x (relatia de simpatie nu presupune reciprocitate ). Pentru reprezentarea relatiilor de simpatie din tre membrii grupului S8 va folosi un graf o rienta t .
~.
$
1. Prin ce tip de graf va fi reprezentat un grup de persoane lntre care s-au stabil it relat ii de vecinatate?
~. 2. Prin ce tip de g r~f va fi reprezentat un grup de persoane Intre- C>care s-au stabilit relatii de cunostinta? 1'11111 1 -j-
r
n-rri-nt:
srminoloqre
Elementele multirnii U (perech ile de noduri) S8 numesc mucn u. Multirnea U se mai nurneste si Itimea muchiilor grafului G. 0 muchie, fiind un element din rnultirnea U, este ce terrninata de 0 subrnultirne cu doua eleme nte din multimea X: muchia k a grafului ( ), care uneste nodurile Xi ~i Xj , este determinata de subrnultirnea {Xi, xi} ~i se noteaza cu x"j ' [x., Xj] ~i [ Xj , Xi ] reprezinta aceeasl muchie a grafului. Graful G are m muchii : nurnar ut de muchi i = ca rd (U) = m
161
In fo rmatica -7 Numim noduri adiac ent e orice pereche de nodu ri care forrneaza
0 muchie - {Xi,Xj} EU . Fiecare dintre cele doua noduri (x, ~ i Xj) este nod inc ident cu muchia Uk = [x;,Xj] . -7 Nodurile vec in e unui nod Xi sunt toate nodurile Xj care sunt adiacente eu el. -7 Se nurneste nod ext rem al unei muchii oricare dintre cele doua nod uri care S8 gasesc la capatul muchiei . Nodurile Xi ~ i Xj sunt extrernitatile much iei [Xi . Xj]. -7 Se numesc rnuchi i i nc iden te do ua muchii U j 9i Uj care au 0 extremitate comuns nadul Xk. Un graf neari entat G este definit de 0 pereche de rnultirnl: rn ult irnea nodurilor sale - X ~i rn u lti rnea muchi ilor sal e - U. EI poa te fi con siderat ca o rnultirne de noduri din care unele pot fi unite doua cate doua printr-o muchie.
Grafu l S8 reprez in ta In pla n prin intermediul unor elemente geometrice: n od uril e se reprezinta prin cercuri, iar muchiil e prin linii drepte care unesc anumite cercuri .
0"
~
Nodul xi al grafulu i G
Muchia Uk=[Xi,Xj] a g rafului G
' - Nodul Xj al gratului G Elemenlele mult irnii X (nadurile) se identiflca cu ajutarul unar etic hete , care pot fi numere sau litere. Pentr u simp lificare , vom folosi ca etichete un sir de numere consecutive, lncepand cu nurnarul 1. De exemplu, pentru un grat cu n noduri, vom tolosi etiche tele: 1, 2, 3, ..., n-1, n. 0 muchie se va nota cu [i ,j] , unde i ~i j sunt etichetele nodurilor incidente cu muchi a. De exemplu , muchia [2,3] este muchia care uneste noduri le cu etichetele 2 ~i 3 Exem plul 1: in gratu ! G, =(X" U, ) din figura 1: -7 Ordin ul gratu lui este 8. -7 Graful are 8 naduri (n=8) ~i rnultim ea nodurilor este X,={1,2,3A,5,6,7 ,8} -7 Graful are 9 muchii (m=9) ~i mu ltimea muchiilor este Fig . 1 U ,={[1,2]. [1,3] , [1 A], [2,3], [2,5], [3A], [3,5], [6,7]. [6,8]) . -7 Nodu l 1 este n od adia cent cu nodur ile 2, 3 ~i 4, iar nodu l 6 este adiacent cu nodurile 7 ~ i 8. Nodurile 3 ~i 4 sunt adiacente deoarece perechea de noduri [3A] EU , . Nadu rile 5 ~ i 6 nu sunt adiacente deoarece perechea de nodur i [5 ,6] ~U ,. -7 Nodul5 este nod inci dent cu muchiile [2,5] si [3,5], dar nu este incident cu muchia [1,2]. -7 Nodul 3 este nod extrem much iilar [1,3], [2,3], [3AJ ~i [3,5]. -7 Muchii le [1,21 si [2,3] sunt m uc hii inciden te deoarece au un nod comun (nodul 2). Muchiile [1 A] ~i [2 ,3] nu sunt muchii incidente deoarece nu au un nod comun .
~ ~
~
Teorema 1 Daca graful neorientat G are n noduri (x " X2, ..., xo) , atunci nu m arul total de grafuri neorientate care sepot forma cu aceste nod uri esteg:
(J= 2c~
b
Dem c nstratle. Notam cu X multimea nodurilor grafului, cu U rnultirnea muchiilor, cu A multimea tuturor subrnultirnilor de doua elemente din X ~ i cu B multimea {O,1}. Multimea A are urrnatoarete elemente (subrnu ttimi) :
162
Implemen tarea st r net u r ilor d e date [1,2J,
[1,3], [2,3].
[1,4], [2,4].
[1,n]
0- 1 sub mulpm i
[2,n]
0-2 submulturu
[0-1,0]
Nurna rut total oe su bmultirnieste: (n- I) +( n -2) + ... + 1 =
1 sub rnuhirne
n x( n - I) 2
Notarn cu a - card{A):;;i cu b - card(S). Fieca rui graf ii putem asocia 0 funcue f:A ~B de finita a taturat. lovers, unei functii f:A ~ B ii putem atasa un grat, astfel: f(1x,y})=1 daca si numai da ce [x,y]e: U, Rez ulta ca numarul total de grafuri care se pot forma cu n noduri este egal cu 3
numarut de funct ii f. Dar. numarul de functii f:A-) B este ega! cu b
,
C'
" 1' da ca [x.y]
E
U
f( { x.y l)=
_
unde b=2:;;i a=
{ O. caca [x ,yJ e. U
C~
in gra!ul G , - cu ce noduri este adiacent nodu l1? i n gra!ul G, - cu ce muchii este incident nodu l 1? 3. Dati exemple de doua noduri adiacente ~i de ooua noduri care nu sunt adiacente in gra!ul G,. Dati exe mplu de doua muchii incidente ~i de doua muchii care nu sunt incidente in gra!ul G ,. Desenati gra!ul G,=(X" U, ) definit astfel: X, ={1 .2 ,3,4 ,5,6,7 ,8} U, ={[1,2J, [1 ,3), [1 ,5], [2,3]. [2 ,5J, [3,4), [4 ,5J, [4 ,6], [4 .7)}. Desenati gra!ul traseelor rutiere care la c legatura int re localitati le Brasov, Bucuresti, Buzau, Ploiesti ~ i Constanta. Oaca exists mai multe trase e rutiere i ntre doua localitati (de exemplu, Bucuresti ~i Brasov), adauqati la gra! noduri pentru localitatile care identifica unic aceste trasee (de exemplu , Valenl i de Munt e, Tarqoviste si Pitesti), Desenati gra!ul judetelor din Roman ia (intre doua jude te exista a muchie daca cele 1.
4. Go 5.
6.
7.
~ 2 doua judete sunt invecinate). Cate grafuri se pot construi cu 3 rnuchii? Desenati toate grafurile care se pot construi cu 3 muchii. 4 3 5 9. Pentru graful G J din figura 2, precizau ordinul, num arul de noduri, nurnarul de muchii ~i multimile X3 ~i U3 . 6 7 10. Structura unei molecule de substanta chimica poate fi reprezentata Fig . 2 printr-un gra! neorientat , i n care nodurile sunt atomii ~ i grupa rile din care este cornpus a molecula, iar muchiile sunt leqaturile dintre ele . in figura 3 este prezentat gra!ul rnoleculei de apa H20 . Reprezentati gra!urile moleculelor de H2S04 , NH3, CH4 ~i C2H4. H H
8. C;'~J'
/\
2.4.2.2. Gradul unui nod al grafului neorientat
Fig. 3
Nodul unui gra! este cara cterizat pnn grad. Gradul unui nod Xkal gra!ului G esle egal cu nurn arul muchiilor incidente c u nodul ~i se not oaza c u d(xk) ' Tcrminologie : ~ ~
Se nurneste nod terminal un nod care are gradul egal cu 1 - d(xk) = 1 (este incident cu 0 sinqu ra muchie). Se nurneste nod izolat un nod care are gradu l ega l cu 0 - d(xk) = 0 (nu este adiacent cu nici un alt nod al grafului, adica nu S8 g a se ~ te in extremitatea nici unei muchil) .
Info rmat ica
163
Exemplul1 :
®
Graful G 4 =(X 4 ,U 4 ) din figura 4 este defin it astfel : X 4={1 ,2,3,4 ,5,6 ,7,8,9, 10,11} U,={[ 1,2], [1,4J, [2,3J, [2,5], [3,4J, [3,5], [5,6J, [5,7J , [5,8J, Fig . 4 [7,9] }, in graful G 4 : -7 G rad u l nodu lui 5 este 5, deoar ece are 5 muchii incide nte: [2,5J, [3,5], [5 ,6J, [5,7] ~i [5,8J -7 Nodu l 9 este nod te rm inal, de oarece are gradul 1 (0 sinqura muchie tncide nta: [7,9]) . -7 Nodu l 10 este no d izolat, de oarece are gradul 0 (nic io mu chie incidental.
G4,
@
Exe mplul2 : Fie graful G5=(X S.Us), unde X s={1 ,2.3,4,5,6.7,8} si Us={[1 ,2J, [1,5], [2,3], [2,5J, [3,4], [3,5J, [4,5], G, .,,",," [4,6], [4,7J). Din lista much iilor unu i graf neorientat , putef preciza urmatoarele inforrnatii: -7 Determinati gr adul unu i nod - nurnarand de cate on apare eticheta nodului i n lista de muchii. Nodul 5 are gradul 3 (in multirnea muchiilor, eticheta 5 apare de 3 on: [1.5J, [2,5J, [3,5J). -7 Det errninati dace un nod este terminal - verificand da ca eticheta lui apare 0 singura data . Nodul 7 este no d terminal (eticheta lui apare numai intr-o sinqura muchie : [4 ,7]) . -7 Deterrninati da ca un nod este izo lal - verificand daca eticheta lui nu apa re i n lista de muchii. Nod ul 8 este nod izol at (eticheta lui nu apare in lista muchiilo r). -7 Deterrnin ati nu rn aru l de nod uri izolatc (n -) astfel: nurna rati etichetele distincte care apar in lista mu ch iilor (n 2) ~i n1=n-n2 . i n graful G s, i n lista de muchii exista 7 etichete distincte. Nurn arul de noduri izo late este 1 (8-7).
Observatie: intr-un graf cu n noduri, oricare ar fi nodul egal cu 0 ~i m ai mic sa u egal cu n-1 (O';d (xk)'; n -1).
Xk ,
gradul sau este rnai mare sau
-------------- .-----.. 1. in g raful G 4 : precizali gradul nodu lui 3 ~ i identificati nodu l cu gradul cel
mai mare, nodurile izolate si nodurile terminale. 2. in graful G 3 : identiflcati nodu rile care au gradul 2, precizati cate noduri au gradul impar si care este nodul cu gradul eel mai mare. 3. in graful G s: precizat i grad ul nodulu i 3, identificati nodurile izolate si nodurile term inale , precizati cate noduri au grad ul 2 ~i cate noduri au gradu l impar.
Teorerna 2 Daca gra ful G are m rnu chl i (Ul, U2, ... , um) ~i n noduri (x-, X2, .. . , Xo ) , atunci in tre gradul nodu rilc r si numarul de muchii exista urrnatoarea relatie: suma gra dalor tuturor noduriJ or
grafului este cgala cu dublul numarului de muchii:
i: d( 'J ~ 2 m
;,- 1
Dem on stratie. Fiecare muchie Uk = [xj, Xi] coresounde unei unitati din gradul nodului Xi ~i unei unita\i din gradul nodului Xj . Rezulta ca fiecare muchie contribute cu 2 unitati la sum a gradelor.
Exemplu . in gratul G 4 : d(1) + d(2) + d(3) + d(4) + d(5) + d(6) + d(7) + d(8) + d(9) + d(10) + d(l l ) = 2+2+3+2+4+1+2+ 1+1+0+0 = 18 = 2x9 = 2xm
... Propozltla 1. Pentru orice graf G , nurnaru l nodu rilor de grad impar es te par. Demon st ratie. Suma gradeJor nodurilor fiind un numar par, aceast a surna trebuie sa contina un numar par de termeni care sunt numere impare.
Exemplu . in graful G 3 exista 4 noduri cu grad impar (3, 6 , 8 ~i 9).
164
Imp lcmcntarca st r ucturilor d c da tc
Propozitia 2. Numarul minim de much ii, rnm tn, pe care trebuie sa Ie aiba un graf neorien tat, cu n noduri, ca sa nu existe noduri izola te, este: III "''''
=[
II ;
I]
sa
sa
Dernon stratl e. Pentru ca un nod X j nu fie izolat , trebuie ca d(X r);:::.1. Pentru ca toate noduri le nu fie izolate, trebuie ca suma gradelor sa fie mai mare sau egala cu n . Dar, suma gradelor este dub lul nurnarului de muchii - m . Insearnna ca , pentru n par - mmin=n/2 , jar pentru n impar - m min=(n+1 )/2 .
Teorema 3 Daca gralul G are
n nod uri (na), atunci eel putin doua noduri au acetasi grad.
Dernonstratte - prin reducere la absurd. Presupunem cit nu este adevarat. Cum, oricare ar fi nodul xe. O ~d( xk)~ n -1 , ln searnna eel sinqurul sir de n numere, diferite intre ele doua cate c oua. care pot reprezenta gradele unghiurilor este 0, 1, 2, ... , n-l . Deoarece un nod es te lzotat, eel ma i mare grad al unu i nod nu poate fi decat n-2 (nodul nu se poate lega de el Insusi s! de nodul izolat). Rezulta ca sirul de numere definit mai sus (singurul ~ir care se poate defin i) nu poate reprezenta sirul gradelor in graf.
1. in graiul G, ,, verificati ca este Indeplinita relatia dintre gradul nodurilor si nurnarul de muchii ale gralului . ldentiflcati nodurile cu grad impar ~i verificati ca nurnarul lor este par. 2. Daca un graf are 8 noduri, care este nurnarul minim de muchii pe care trebuie sa Ie aiba, ca sa nu fie noduri izolate. Oesenati un graf care, avand nurnarul minim de muchii stabilit, nu contine noduri izolate . Daca un graf are 9 noduri, care este nurnarui minim de muchii pe care trebuie sa Ie alba, ca sa nu fie noduri izolate. Desenati un graf care avand numarul minim de rnuchii stabilit nu contine noduri izolate.
,}
2,7,2.3, $irul grafic Se nurneste sir g rafi c un sir s de n numere intregi pazilive (d" d" .." do) care pot reprezenta gradele unui graf neorientat, cu n noduri. Propozitia 3
Cond itllle necesare ca un ~ir de n numere intregi pozitive (d" d" ..., dol sa fie un sir grafic sunt: (1) d,,; n-r , penlru once i=1,n; (2) suma d, + d, + ... + do trebu ie sa fie un numar par. Demo nstratle. Neces itatea ccn ditiei (1) rezutta din faptul ca grad ul ma xim al unui nod dintr-un graf cu n noduri poate fi n -t . Necesitatea conditie i (2) rezulta din Teo rema 2 - suma gradelor fiind ega la cu dub lul numa rului de rnuch!i, este un nurnar par .
Ac es te conditil nu sunt intotdeaun a ~i suficientc . Pentru a verifica dac e sirul de numere este sir graf ic, se face ana liza sirului de numere . Exem ple: (a) s=(1,1,2,3,3,4,5,5,7,8) Acest sir nu indeplineste una dintre conditiile necesare - (2) " suma numerelar este 39. (b) s=(1,1,1,2,2.3,5,6,8,9) Acest sir lndeplineste condltiile necesare (suma numerel or este 38 l}i fiecare nurnar este mai mic sau egal cu 9: 9=1 0~1 ) . Aceste cond itii nu sunt tnsa suficiente . Din analiza sirului rezutta ca nodul 10, avand gradul 9, este legal de toate celelalte 9 naduri . Nadurile 1, 2 si 3 sunt naduri l erminale. Ele nu pot f leqate decat de nadul 10. Rezulta ca gradul maxim
165
III fo r illa Iicii
pe care i l poate avea oricare dintre celela lte sase noduri este 6 (ele nu se pot lega de ere insele si de nodurile 1, 2 ~i 3). Dar nodul 9 are gradul 8, ceea ce este imposibil. (c) s=(1,1,1,2,3,4,5,6,6,9) Si aeest ~i r Ind eplin este conditiile necesare (suma numerelor este 38 ~i fiecare numar este mal mic sau egal cu 9). i n plu s, fala de sirul (b), avand aceleasi gra de pent ru nod urile 1, 2, 3 ~ i 10, i nde plineste ~ i condit ia ca celelalte nod uri sa alba grad ul mai mic sau ega I cu grad ul max im posibil (6). Dar , exis ts doua nod uri cu grad ul 6. Ele trebuie sa se leg e arnandoua de nodul 4, la care este legat si nodul 10. Nodul 4 trebu ie sa aiba eel putin gra dul 3. Dar nodul 4 are gradu l 2, cee a ce este impo sibil. (d) s=(1,1,1,3,3,4,4,5,5,9) Acest ~ i r i ndeplineste conditiile nec esare (suma numerelor este 38 si fiecar e numar este ma i rnic sau ega l cu 9) ~i este un sir grafic caruia i se poa te asocia grat ul G, =(X6 ,U6 ) , cu 18 muchii , definit astfel. X6 ={1,2,3,4,5,6,7,8,9,1O} U6 ={[1 ,10], [2,10], [3.1OJ, [4,8J, [4,9J, [4,10), [5.8], [5,9], [5.1OJ. [6,7J , [6,8J, [6 ,9], [6,10). [7,8J, [7,9J, [7,10), [8,10J, [9,10]}. ~
Precizat i daca sirurile s,= ( l ,1,2,2,4) ~i s,=(0,1,1,1,4) pot fi siruri gratice. Pentru sir ul care este sir grafic, gasiti un graf care i S8 poate as ocia .
2.7.3. Graful oricntat Spre deosebire de gratul neorienta!, In gratul orientat pere c hile de nod uri s unl ordo nale . Gratul orientat se mai nurneste ~i digraf.
2.7.3.1. Terminologie ~
Elementele rnultirnii U (perechile de nodur i) se nume sc arce. Mul\imea U se mai nurneste ~i rnultirnea arcel or gratului G. Un arc, fiind un element din multirn ea U, este determinat de 0 submultirne ordonata, cu doua elemente, din multimea X: arcul k al gratului (Uk), ce uneste nodurile x; ~ i Xi ' este determinat de subrnultimea {x;,x,} ~i se noteaza cu [x ;, xi] ' [ x;, xi] ~i [Xi, Xi] nu roprezinta ace las i arc aJ g rafulu i. Gratul G are m aree: nu m aru l de arce = ca rd( U) = m
-7 Se numesc n oduri adia ccntc in graful G oricare din perechile de noduri care tormeaza un arc - (X"X,) EU sau (xj,x,)e U. Fiecare dintre cele doua noduri (x, si xi) este nod inc ide nt cu arcul U k =
[ Xii Xj]
sau cu arcul U k
=[ Xj , X i].
Xj sunt ex trem itati le arcului [ Xi, Xj]. Nodul X i este extrcrnitatea initial a a arcului, iar nodul Xj este extremitatea finala a arcului . Se numesc arce incidcnte co ua arce u, ~i Uj care au 0 extremitate com uns - nodul Xk. Se num este suc cesor al nodului Xi orice nod la care ajunge un arc care iese din nodul Xi. MUI~ime a succcsorilor nodului Xi este fermata din rnultirne a nodurilor la care ajung arcele care ies din nodul Xi. Se noteaza cu S ( Xj) si se defineste ca multirnea: S(x) = {Xi EX (X;, xj)e U}
-7 Nodurile Xi si ~ ~
I
~
Se nurneste prcdcccsor al nodului Xi orice nod de la care intra un arc in nodul Xi Mul1imea predecesor ilor nodului Xi este fermata din multimea nodurilor de la care ajung arcele care intra in nodul Xi . Se noteaz a CU P(' si S 8 defineste ca m uttimea: P(x) = { Xi e X I (xj, x;)e U)
e,
166
IlIIplclllcntarca st r nct ur ilor dc datc
-7 Mul~irnea arce lor care ies din nodul U+(x,) = {u=(x,.
Xj)
Xi S8
IUEU} .
-7 Multimea arcelor care intra in nodul x,
I
noteaz a S8
CU
U+(X i) ~j
noteaza cu
U -(X i)
S8
!?i
de fine ste ca rnultimea S8
define ste ca rnutti-
mea U"(x ,) = {u=(x;. x,) UEU}
-7 Nodul sursa a l grafului este nodul care are rnultimea succesorilo r fermata din toate celelalte noduri, mai putin el, jar mu ltimea predecesorilor sai este mul timea vida.
-7 Nodul destinatie al gralu lui este nodul care are multimea predeceso rilor fermata din toate celelalte noduri, mai putin el, iar rnultimea succesorilor sai este rnultirne a vida. Observatii 1. card(S(x))=card(U+( x)) ~i card(P (x ))=card(U"(x)) 2. Pentru nodul sursa al qrafului card(S (x))=c ard(X).1 ~i card( P(x ))=O. 3. Pentru nodul destinatie al gralului card( P(x))=ca rd (X)- 1 ~i car d (S( x))=O. 4. Daca un graf are un nod sursa , atunei nu poate ave a un nod destinatie, ~i inve rs. Un g raf o rientat G es te d efinit de 0 per eche de rnulti m i : rnultim ea nodurilor sal e - X m ultlmea a rcelo r sa le - U . EI p o ate fi co ns ide ra t ca 0 multirn e d e noduri din ca re un el e pot fi unite doua ca te dou a, p ri n unul sa u d ou a arce .
~j
G raful orientat se rep rezinta in plan prin intermed iul unor elemente geometrice: nodurile se reprezinta prin ce rcuri, ia r arcel e prin linii drepte care unesc a numite cercuri si care a u 0 saqsata la ca patul ca re core spunde extrernitatii finale a arcului.
0 "'- Nodul x i al g rafu l u i G
~ ' - Nodu l
Xj
Arc ul uk=[xi,X j] al g ra ru l u i G
al grafului G
Exemplu :
:;>
t; , in graiul G, =(X" U, ) - din figur a 5: -7 Ordinul grafului este 5. -7 Gral ul are 5 nod uri (n=5) si rnultim ea nodurilor este X, ={ 1,2,3,4,5} . -7 Gralul are 7 arce (m=7) si multirnea arce lo r este U, ={[1 ,2], [1,4 J, -7
-7 -7 -7
~ 2 5
3 Fig 5 {2,3J, [4,1], [4,3], [5,2], [5,31}. . Nod ul 1 este nod ad iacent cu noduri le 2 si 4, iar nodul 3 este adiacent cu nodurile 2, 4 ~i 5. Nodurile 3 si 4 sunt adiacente deoarece perechea de noduri [4 ,3JEU, . Nodurile 5 ~ i 4 nu sun t adiacente, deoa rece nici una dintre perech ile de noduri [4,5J si [5,4] ~ U, . Nodul 4 este nod in cident cu arcele [1,4], [4,1J ~i [4,3]. dar nu este incident cu arcul [1,2]. Nodul 2 este ex t re m itatea initial a a arcului [2,3J ~i ex tr em ita tea fln al a a arculu i [1,2Jsi [5,2J. Arcele [1 ,2J ~ i [5 .2] sunt ar ce in cide nte deoarece au un nod comun (nodul 2). Arce le [1,4J ~i [2,3] nu sunt arce incidente, deoarece nu au un nod comun. 4
-7 Multim ea s uccesori lo r nodu lui 1 este fermata din noduri le 2 si 4. Nodul 2 este no d s uccosor al nodului 1, dar si al nodului 5. Nodul 1 este nod succesor al nodu lui 4, dar ~i
nodul4 este nod succesor al nodului 1. Nodu l 3 nu are succesori.
-7 Mul!im ea pred eces oril or nodului 3 este fermata din nodurile 2, 4 si 5. Nodul 2 este nod pred ecesor al nodului 3. Nodul 1 este nod predecesor al nodului 4 , dar si nodul 4 este nod pred ecesor al nodului 1. Nodul 5 nu are prede cesori .
167
Inform a ti ca Tcorema 4 Daca graful oriental G are fI noduri (X" X2, "', xo), atunci nu rnarut total de grafllri orientate care se pot fanna ell acoste noduri osto g:
g ='"
.~~I':'U 2
Dem onstratie. Se dernon strea za la fel ca Teorcma 1, eu deosebirea ca multimea Beste {D,1,2,3} card( B)=4 , ia r fu nctia f este de finita atatur at
f(l x.Y I) =
3' daca [x,Y]
E
U ~ i [y,x]
2, daca [x,y)
E
U
E
U
{ 1, oaca [y,x) E U 0, daca [x,y] e U ~ i [y.xj e U
1. 2.
in graful G, - cu ce noduri este adiaeent nodul 2? i n graful G, - cu ee arce este incident nodul 2? 3. Dati exemplu de doua nodur i adiacente in graful G, . 4. Dati exemplu de doua noduri care nu sunt adiacente in grafu l G, . 5. Da!i exe rnplu de doua aree incidente i n graful G, . 6. Dati exemplu de doua aree care nu sunt incidente in graful G7. 7. in graful G, precizati ce fel de extremitate este nodul 4 pentru fiecare arc cu care este incident. Preciaati rnultirne a succesorilor ~i rnultirnea predecesorilor nodului 4. 8. Desen ati qraful G, =(X" U, ), defimt asttel. G, X, ={ 1,2 ,3,4 ,5,6,7} . U, ={[ 1,2]. [1,5], [2 ,1J, [2,4J, [3,4J, [4,3J, [5 ,3], [6 ,5J, [6,7], [7,5] }. 9. Cate grafur; orientate se pot eonstrui cu 3 aree? Desenali 10 dintre aceste grafuri. . 10. Pentru graful G, din figura 6, precizati ordinul, numarul de ( \ II G, noduri, nurnarul de aree ~j rnultirn ile Xg ~i Ug.
(JF-
2.7.3.2. Gradele unui nod al grafului orientat Nodul unui graf orientat este caracterizat prin grad ul intern
Fig. 6 ~i
gra du l ex te rn .
Gradul intern al unui nod Xi al grafului G este egal eu nurnarul arcelor care intra in nodul x, (arce de forma [x" x,)) ~i se noteaza cu d(x). Gradul extern al unui nod Xi al grafului G este ega I cu nurna rul arcelor care ies din nod ul
x, (arce de forma
[ Xi, Xj))
~i se noteaz a Cll d+(x).
Tcrrninologie :
-7 Se nurneste nod terminal un nod care are surna gradelo r eqala cu 1 (gradul intern sau gradul extern ega l cu 1 ~i gradul extern , respectiv gradul intern, ega l eu 0 - d+(x,) = 1 ~i d'( x,) = 0 sau d"(x,) = 1 si d+(x,j = 0). Nodul terminal este incident cu un singu r arc.
-7 Se nurneste nod izolat un nod care are surna gradelor eqala eu 0 (gradul intern si gradul extern egal e eu 0 - d+(x,) = d'( x,) = 0). Nodul izolat nu este adiacent cu niei un alt nod al grafului, adica nu se g as e ~t e la extremitatea niciunui arc.
Observ atii: + ' . • 1. d (x)=ea rd( S(x)) ~ I d (x) =c ard( P{x)). 2. Daca graful are n noduri , pentru un nod sursa al grafului d+(x)=n-1 ~i d"{x)=O, iar pentru un nod destinatie al grafului d-(x)=n -1 ~i d+(x) =O.
168 Exemplul 1:
l mplemcnta r ca structuri lor de d a te 5
Gra!ul G , 0 =(X lO,U lO ) din figura 7 este definit astfel: X lO={ 1,2,3,4,5,6,7,8,9, 1OJ UlO={[ l,2] , [1,4]. [2,1], [2,3], [2,5]. [2,6], [2,7]. [4,l J, [7,2], [8,9), [9,8] j . in gra!ul G lO : -') Gradu l intern al nodului 2 este 2, deoarece are 2 arce care intra: [1,2J ~ i [7,2]. Grad ul ext ern al nodului 2 este 4, deoarece are 4 arce care ies: [2,1J, (2,3], [2,5] ~ i (2,7]. -') Nodul 5 este nod terminal deoarece are suma gradel or eqala cu 1 (gradul intern este 1 ~i gradul extern este 0) ~ i un singur arc incident: [2,5]). -7 Nodul 10 este nod lzo tat , deoarece are gradul 0 (niciun arc incident). Exemplul2 : (." Fie graful Gl1=(X ll ,U l1), unde X ll={ l ,2,3,4,5,6,7,8) si Ull={[l ,2J, (1,5]. [2,1], [2 ,3], [2,5], [3,4], [3,5], [4,3]. [4,5J , [4,6], [4,7], [5,4]). Din lista arcelo r unui graf orientat, puteti preciza urma toarele inforrnatii: -7 Gradu l ex tern al unui nod - numarand de cate ori apare eticheta nodului in Iista de arce, ca prim elemen t din perec he. Nodul 3 are gradul extern 2 (in rnultirnea arcelor, eliche ta 3 apare de 2 ori ca prim elem ent: (3,4J ~i (3,5]). -') Gradul intern al unui nod - nurnarand de cate ori apare eticheta nodului in lista de arce, ca al doilea element din pereche . Nodul 5 are gradul 4 (i n multirn ea arcelor, eticheta 5 apare de 4 ori ca al doilea element: (l ,5J , [2,5), (3,5J ~ i (4,5]) . -7 Mul~ im ea succesorilor un ui nod este fermata din nodurile a carer etich eta apare ca al doilea element i n perechile i n care primul element este nodul preciza!. Mul\imea succeso rilor nodului ± este p , 5, 6, 7) .- arcele: [1,3]. [1 ,5], [1,6] si [1,7]. --7 M u l~imea pre dccc so rilor unui nod este fermat a din nodurile a carer eticheta apare ca prim elem ent in pe rechile in care al doilea ele me nt e ste nodu l precizat. M ulttrnea predec esorilor nodu!ui ;). este {2, 4) - arcele: [2,;).] si [4 ,;).J. Exe mplu l3 C " Fie gra!urile G 12 =(X 12 ,U12), unde X 2={1,2.3,4} si U' 2={[l ,2], [1,3], [l,4J (2,3J, [3,4J, (4 ,3]), ~i G13 =(X 13,U"j, unde X13={1,2,3,4) ' ~i U13={[2,1]. [2,3J, (3,1], [3,4J, [4,lJ, [4,3]). Din lista r: IJ muchiilorunui graf, puteti preciza urmatoare le informatii: -') Nodul s urs a al unui gra! apare pe primul lac din pereche de n -t ori - ~i niciodata pe locul al doilea. i n gra!ul G 12 , nodul 1 este nod sursa. Desenati gra!ul G 2 pen tru a ' veri fica ace asta afirrnatie . -') Nodu l destinati e al unui gra! apare pe al doilea lac din pereche de n-l ori - si niciodata pe primul lac. In gra!ul G 13 , nodul 1 este nod destinatie. Oesenati gra!ul G13 pentru a verifica aceasta afirm atie . Observatie l ntr-un gra! cu n noduri, oricare ar fi nodul Xk, oricar e dintre gradele sale este mai rnaresau egal cu 0 ~i mai mic sau egal cu n -1 (O,;d+(xk) s n -t ~i O,;d -(xk) s n-t ). 1, In graful Gg - preciza ti gradul intern ~i gradu l extern ale nodul ui 5, identificati nodul cu gradul extern eel rnai mare si nodunle cu gradul intern eel rnai rnic. 2. in graful G lO - identificati nodurile care au gradul intern 1, precizati cate noduri au gra dul intern egal cu gradut extern, care sunt nodurile terminale ~i care sunt nodurile izolate.
Info rm atica
169
3, i n gralu l G l l - preciza ti gradu l intern si gradul extern ale nodulu i 4, ldenti flcati nodurile izolate ~ i nodurile terminate, identificati nodurile care au gradul extern maxim ~i nodurile care au grad ul intern ega l cu gradul extern . Tcororna 5
Daca gralul orienta t G are m ar ce (u, . U2, .... Um) ~ i n no duri (x-, X2..... Xo) . atunci i ntre gradele nodurilor ~ i nurnarul de muchii exista urma toarea relatie: suma gradelor interne ale tuturor noduriJor este egala cu suma gradelor exteme ale tuturor nodurilor ~i cu numarui de arco : II
II
L d +( \j)= L d -( \ i)= m j,.,1
j"' l
Demons tratl e. Fiecare arc Uk ;; [Xi. Xj] corespu nde unei un ttati din gradul extern al nodului Xi ~ j unei unitali din gradul intern al nodului Xj_ Rezulta ca fiecare arc contribuie eu 0 unitate la suma gradelor interne ~j eu 0 unitale la suma gradelor externe.
=
Exem p lu. i n gralul G g : d+(1 ) + d+(2) + d+(3) + d+(4) + d+(5) + d+(6) 1+3 +1+2+2+ 1 d' (1) + d' (2) + d' (3) + d' (4) + d'(5) + d' (6) = 1+2+ 2+2+2+1 = 10, m fiind ega l cu 10 --------
=10 si
~ In graful G 11 verificati ca este Indeplinita relatia dintre gradurile nodurilor
~
si nurna rul de arce ale grafului .
2.7.4. Rcprezcntarca
~i
implemcntarca grafllilli
Exista ma i multe moduri de reprezentare la nivel logic a unui graf, care pot fi implem entate i n memoria unui calculat or, lolosind diverse tipuri de structun de date . Aceste reprezentari pot fi folosite in algoritmii care pre lucreaz a grafuri si, implicit, in programele prin care vor fi impJernentati in calculator acesti algoritmi. Printre rnodurile de reprezentare a unui graf se numara: -7 re preze ntarea prin ma tricea de a d iaconta : -7 reprezenta rea prin ma tricea de incidon ta : -7 reprezentarea prin Iista muehiilor (areelo r) ; -7 reprezentarea prin Iista de adiacenta (Iistele veeinilor); -7 reprezentarea prin matricca costurilor. Fiecare reprezentare prezinta avantaje in ceea ce prives te utilizarea efi cienta a memoriei interne , in fun ctie de tipul grafului (cu noduri put ine . dar cu muchii mu lte - sa u cu noduri mu lte , dar cu mue hii putine) ~i din punet de vede re al eficientei algoritmilor de prelucrare (i n functie de aplica tie). in urrnatoa rele rep rezent ari se con side ra ca gralu l G= (X.U) are n nod u r i ~i m mu chii.
2,7.4,1, Reprezentarea prin matricea de adiaccnta Matricea de ediaccnta a unu i gra f es te 0 matrice patrata binara de ordinul n (A,I,Il), a le care i e lemente a iJ sunt definite astfel :
I. dad Ii, il E U a j,J = { o.Jacali."j Jrl U Implementarea qraf ului prin matricea de adiacent a se face printr-un tablou bidimensional (0 matrice patrata cu dimens iunea n), asttet: i nt
a «r:>]l< :1> ] ;
170
Implemcutarca structurrln r de datc ;
Exempl e: Graful ncorientat G 1
2 1
0
1
2 3
1
0
1
1
4
1
0
5 6 7
0
1
8
.s. 0 0
0 0 0
3
4
1
1
5 - 60 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 .z, .,Jl._ 0 0 0 -~ 1 0 0 0 1 -,-::,-
7 0 0 0 0 0
8 0 0 0 0 0
--~-
1
0 0
- 1,-.s,
G ra fu l oriental Gg
1 - '-_ 2 . 3 --'-" 0 1 1 0 0 2 1 1 3 0 0 0 4 0 1 0 5 1 0 0 0 0 0 6
4 0 1 0 0
5 0 0
0 0
0
1 1 1
6 0 0 0 0 1 0
0
Proprietati le matricei de adiacenta : 1. Ele mentele de pe dia go nala pr incip als au val oa rea 0 - din definitia grafului re zulta ca
oriee muehie (arc) [i. j) trebuie sa respeete conditi a i,.j . 2. i n cazul unui g ra f n eorientat , matricea de adiac erita este 0 m atri c e s irne t ric a fata de diagonala principa ta. deoarece , dac a exista rnuchia [i , j] , atu nci exis ta ~i muchia U, i]. Accas ta r e prez entare es te recorn and ata p en t r u probl em ele in c are se tc stc aza pre zenta u n c i m u c hii sa u a unui ar c in tre d ou a n o duri , se ca lcu loa z a gradul unui n od etc . - deoa rece pe r mi te un ac c es r apid la n odu r i le s i m u chi i le (arc ele) unui graf.
Algoritmi pentru reprczenta rea grafurilor fo losind matricea de adiacenta Din matr icea de ad ia centa pute ti obt ine urrnato arel e inform at ii: Graf neoricntat Suma elemente lo r matr ice i de aotacenta esle eqala eu 2xm (dubtul numarului de muchii ). Gradul unu! nod i este egal cu suma elementelor de pc lin ia i (sau cu su ma eleme nte lor din colo ana I). Nodurile adiaccntc nodului i sunt nodurile j U=1 .n) pentru care clc me ntc le din linia i sun t eqale c u 1 (altl l lls t l Mal pot f definite ca ncdurile j U=1,n) pc ntru care clemente lc din co loa rta is unt c gale ell 1 (aU][iJ=1)
Numaru! de vcctn! at nodului i este egal eu cradul nodului. Muchia [i,j] a grafului reprezmta un element al matrieei de adtacenta care Indephneste conditia: afiJOl = 1 (sau aUlfil = 1)
Graf orientat Suma elcmcnte lor m atrj c ot de adiacen ta este ecala cu m (numaru! de arc e). Gradul extern al nodului i este egal eu suma oreme nte tor de pe linia i Gradul intern alnodulul i este egal cu suma eleme nte lor din co loana i. Succcsorii nodului i sunt nodurile j (j=1,n) pentru care elementele din lini a i sunt egale cu 1 (a[ilUl =1) Predeeesorii nodului i sunt nodurile j U=1 ,n) pentru care elementele din eoloa na i sunt egale cu 1 (aUJ[i] =1). Noduri le adiacunte nodului i sunt nodurile j U=1 ,n) pentru care elementele din linla i sau din col oan a i sunt egale cu 1 (a[i]U]=1 sau a(j][i]=1 ) - reuniunea dintre multimea succesorilo r si multimea predeceso rilor nodutui. Numarul de vecini ai nodu lui i este egal eu eardinalul multimii de noduri adiacente nodului i. Arcul [l,j] al grafului reprezinta un element al matricei de adiacenta care lnd eplineste conditia: afilfil = 1
171
Inform aticii Exemplu Se considera graful din FIgura alaturata . ldentificati matricea de adiace nta a gratului a)
0 1 1 1
1 0 1 0
1 1 0 1
1 0 1 0
b)
0 1 1 1
1 1 1 0
1 1 0 1
1 0 1 0
c)
0 1 1 1
1 0 1 0
1 1 0 1
1 0 0 0
dI
0 1 0 1
~
1 0 1 0
0 1 0 1
1 0 1 0
(Bacalaureat - Sesiunea specia ls 2003) Raspunsul coreet este matricea a). Pentru a identifica mat ricea de adiacenta a grafului din fiqura , S8 vor elimina pe rand variantele incorecte, prin verifica rea urrnatoa relor conditii: 1. Matricea trebuie sa fie binara - toate matriceJe indeplinesc aceas ta con ditie ; 2. Elemen tele de pe diagonala principala trebuie sa aiba v aloarea 0 - matricea b) nu Indeplineste ace asta conditie . 3. Deoarece graful este neorient at, matricea trebuie sa fie s irnetr ic a - matricea c) nu lndeplineste acea sta conditie 4. Din analiza grafu lui S8 observa ca doua noduri au gradul 2 si dou a nodu ri au gradu l 3; in matricea de adiacenta treb uie sa existe dou a linii care sa contina doua elemente cu valoarea 1 $i doua linii care sa cantina trei element e cu valoarea 1 matricea d) nu ind epllnes te aceasta conditie.
2. 3.
4.
1. Scrieti matric ea de adiacen ta a gratului G4 . Folosin d informatiile din matrice a de adiacenta , deterrninati: gradul noduJui 5, nodu rile izolate si nodu rile terminale . Scrieti matricea de adiacenta a gratului neorientat G14=(X ,4,U 14 ), unde X 14={1 ,2,3,4} si U 14 ={[1,2]. [2,3], [3,4], [4,1]). Ce prop rietate are acest qraf? Scrieti matricea de adia centa a grafului Ga. Folosind inforrnatiile din matricea de adiacenta, deterrninati: gradul intern al nodului 5, gradul extern al nodului 4, succe sorii si predecesorii nodului 2 ~i predecesorii nodului 3. Scrieti matricea de adiacenta a grafului G 11. Folosind intorrnatiile din matricea de adiacenta, deterrninati: gradul intern al nodului 5, gradul extern al nodului 2, nodurile adiacente nodului 5, succesorii ~ i predecesorii nodului 4, nodurile terminale ~j nodurile izolate. Scrieti matricea de adiace nta a qrafului orientat G1 5 din figura 8. Scrieti matricea de adiac enta a grafului G 12. Cum iden:05 tificati in matricea de adiacenta nodul sursa al grafului? Fig. 8 Scrie ti matr icea de adiacenta a gratului G 13. Cum identificati i n matricea de adiacenta nodul destinatie al grafu lui?
@
5. 6. 7.
®
Implcmentarea algoritmilor pcntru reprczentarea grafurilor cu matricca de adiacenta 1.
Crearea matricei de adlaconta prin introducerea dateler d e la tastatura , Det erminarea gradului unui ned. Salv area matricei de adiaconta intr-un fisier te xt.
Se citesc de la tastatura muchiile (arcele) unui graf orientat (neo rientat) , se creeaza matricea de adiacent a a grafului, se aflseaza nodu rile izolate $i terminale $i se salveaza matricea de adiace nta in fisierul text grall.txt, pentr u gratul neorientat, si graI2.txt , pentru gratul orientat. In fisierul text se scriu, pe primu! rand, ordinul grafului, si pe urrnato arele randuri, li /matrtcei de adiacen ta. Functia sc rie () se foloseste pentru a scrie matricea de
172
Implcm eutu re n st ru ct u r ilor d e da te
adiacenta in fisier. Deoarece matricea de adiacenta a lost dectarata ca va riabila ql oba la, elerne nte le ei sunl initlatlzate cu valoarea O. Pentru testarea programelor se lolosesc gralul neorienlat G, ;;i gralu l orientat G, . Gralul neorienlat Functia grad () se 10105e;;te pentru a determina gradul unui nod. #include
int a[10J [10J , n, :C.; fstr eam f( "grafl .t xt " , i o s : . ou ti j , v oid .sc r i e t ) t i n t i ,j ; f «n« e n d l ; f o r {i = l; i < = n; i + T ) (for ( j - l ; j ] [ ] ;
,;fD ~
Grafu l G, Fig .9
Graful ncoricntat G 1 1
2 3 4
5
6 Proprletatile matricci de lncidonta a 7 grafului neorientat:
1
2
34
5
6
7
8
9
1 1 0 0 0
1 0 1 0 0 0 0 0
1 0 0 1 0 0
0 1 0 0 1 0 0 0
0 0 1 1 0 0 0 0
0 0 1 0 1 0 0 0
0 0 0 0 0 1 1 0
0 0 0 0 0 1
~ 0 0
.s, 0
0 1 1 0 0 0 0 0
.s,
1 1. Pe fiecare coloana exista doua ele- 8 mente cu valoarea 1 (pe liniile i ~i j care corespund nodurilor incidente cu much ia), iar restul elementelor au valoarea O.
176
lmplcm entarca st r uct u r ilor de d a te
2. Matrieea de incidenta are 2xm etement e egale eu 1, deoareee fieeare muehie este incidenta cu doua nodur i.
Matricca de incidenta a unui graf orientat este 0 matrice cu n linii §oi m caloane (A n,m), ale carei c leme nte au s unt definite as tfe l: 1' dac a nodul i este extremitat ea final a a arcului j a
i, J
=
-1 , dac a nodul j este extremitat ea in il ni~i a arcului j { 0, dac a nodul i nu este extremitat e a arc ulu i j
lmplementarea grafului neorientat prin matricea de incidenta bidimensional (0 matr ice cu dim ens iunea n xrn ), astfel : int
a [ < ~ >]
S8
face printr-un tablou
[ ] ; Gralnl orientat G,
1
Gralnl G,
2 3 4 5
Fig.10
6
1 r-'1 -1 0 0
ri10
2 --1 1 0 0 0 0
3 0 -1 1 0
ri10
4 0 -1 0 1 0 0
5 0 1 0 -1 0 0
6 0 0 1 0 -1 0
7 0 0 -1 0
r-10
8 0 0 0 -1 1 0
9 0 0 0 0 1 -1
10 0 0 0 0 -1 1
Proprietatile matricei de incidenta a grafuJui orientat: 1. Pe fiecare coloana exista un element cu valoarea 1 (pe linia i care corespunde extrernitatii finale a areului) o;i un element eu valoarea -1 (pe linia j care care eorespunde extrerrutatn initials a arcului), iar restul eleme ntelor au valoarea O. 2. Matricea de incident a are m elemente egale cu 1 ~ i m elemente egale cu -1 , deoarece fiecare arc are 0 extrem itate finala ~ i 0 extremitate in i~ial 21. Suma elementelor matricei este O. A ceast a reprezentare este roc orn and at a pe nt ru g ra f urile care a u u n nurnar ma re d e noduri ~i u n nurnar m ic de m u c h ii.
Algoritmi pentru reprezentarea grafurilo r folosind matricea de incidcnta Din matricea de inciden ta puteti obtine urrnato arele info rmatii: Graf neoricntat
Graf orientat
Gradul unul nod ; este egal eu s uma ele me ntelo r de pc linia t.
Gradu! intern al unul nod i est e ega l ell num arul de cle m ent e eu va toa rea 1 d e pe tini a; Gradu t extern at unul nod i este ega t cu num aru l de c lem ent e eu va loa rea -1 de pe lin ia i. Sucecsorii nodului i sunt nodurite j 0=1 ,n) pentru care eleme ntc lc din li nia j sunt ega lc eu 1 in cotoana k (k=1,m) in care etementele de pe
Nodurlle adiaeentc nodulu i i sunt nodurile j 0= 1,n) pentru care c lementel e di n linia j su nt eg ate eu 1 in cotoana k (k=1 ,m) in care ~i etementele de pe tinia i au valoa rea 1:
>[i][ k]
= 1 ~ i ' O][ k] = 1.
Iinia i au valoarea -1: altl lkl = -1 ~i al l lkl =1 Predcecsorii nodu fui i sunt nodur ile j 0=1,n) penru care elc mentcle di n Iinia j sunt ega Ie ell -1 in coloan a k (k=1.m } in care etemen lete de pe
linia i au varo arca 1: alll l kl
= 1 ~ j ' Ul[k] =-1.
177
Informatica .
..
~.
Grafneorientat
-
Graforientat Nodurile adiacente nodu lui i sunt date de
Numarut de vecini at noduJui j este ega l ell qradul nodului Muchia k - Il.ll a grafului este deterrninata de doua elemente ale matncef a{i}kj] ~i a[j]k;} , care
reuniunea dintre rnultimea succesorilor si multimea predecesori lor nodulu i. Numaru! de vec!n! a! nodul ui i esle egal ell cardinalul multimil de noduri adiacente nodului i. Arcul k = [i,j] al grafului este determina t de ooua elemente ale matr icei, a[i}kj] si a[j]kJJ, care
indeplinesc conditia a[i][k]
indeplinesc conditia a[i][ k]
=1 ~ i aO][k ] =1,
~i
sem nifica faptul ca mu chia k este inci denta ell n odurile j §i ~
2. 3.
4. 5.
6. 7.
=-1 ~i allllkl =1, s!
sernnifica faptul ca arc ul k les e din nodul i § i in t ra in nodulj
1. Scrieti matricea de incidenta a grafului neorientat G4 . Folosind inferrnatiile din matricea de incidenta, deterrninati: gradul nodului 5, nodurile izolate si nodurile terminale. Scrieti matricea de incidents a grafului neorientat G Ce proprietate are acest graf? Scrieti matricea de incidents a grafului G8 _ Folosind inforrnafiile din matricea de incidenta , determinati: gradul intern al nodului 5, gradul extern al nodului 4 , succesorii ~ i predecesorii nodului 2 si predecesorii nodului 3. G", Scrief matricea de incidents a grafului orientat G16 din figura 11. ~. Scrieti matricea de incidenta a grafului G 11 . Folosind informatiile din matricea de incidenta ceterm inati: gradul intern al r:t\ ("';\ nodului 5, gradul extern al nodului 2, nodurile adiacente \...'!J \...3..J nodului 5, succesor ii ~i predecesorii nodului 4, nodurile termiFig. 11 nale si nodurile izolate . Scrieti matricea de incidenta a grafului G13 . Cum identificati, in matricea de incidents, nodul sursa al unui graf? Scrieti matricea de incidenta a grafului G14 . Cum identrficati, in matricea de lncidenta, nodul destinatie al unui graf?
,4.
Implementarea algoritmilor pentru reprezentarea grafurilor cu matricea de inc identa 1. Crearea matrice i de in ci denta pr in int rod u cerea datel or de la t astat ura. Det er minarea gradului unu i nod. Salva rca matricci de in cld en ta i nt r-un fi si er text.
Se citesc de la tastatur a muchiile (arcele) unui graf orientat (neorientat). Se creeaza matrices de incidenta a grafului. Se afiseaza gradul nodului p a carui etichet a se introduce de la tastatura. Se salveaza matricea de incidents in fisierul text graf5./xt, pentru graful neorientat, si graf6.txt, pentru graful orientat. In fisierul text se scriu pe primul rand ordinul grafului si nurnarul de rnuchii, iar pe urrnatoarele rancurt, ltniile matricei de incidenta. Functia scrie ( ) se foloseste pentru a scrie matricea de incidenta in fisier . Pentru testarea programelor se folosesc graful neorientat G, ~i graful orientat Gg . Graful neorientat. Functia g ra d () se foloseste pentru a determina gradul unui nod. # include < f s t re e m . f-> i n t a[ l OJ [lO j,n ,m ; fstream f( Hgraf5 .txt " , i o s : i ou t. j • v o i d s c r i e () { i n t i , j ; .f-ocn-c-c " "« m«en d l ; for ( i = l ; i n . ccutx-cv nume r de much i i ". cin>>m; fo r ( k ~ l ; k < ~; k + + )
{CQut«" n od u l i n i t i a l al a r c ul ui "« k«" : ccu e-oc vn o d u j
It ;
cin» i;
f i n a l a I a rc u l u i "« k« " : " ; c in» j;
ali ] [kJ=- l; a[ j] [k ]=l ; }
CQut«" n odu l = " ; cin» p ; c o ut« " Gr a d u l inte r n a 1 nod ul u i "« p« " este "« g r a d_ i n t {p l«endl; c ou t «" Gr a d u l exte rn a1 n odului "« p«" est e "« g r ad_ c x t (p }«endl ; scr ie () ; } 2. Crea rea matricei de in c identa prin citi rea da te lor din un ui nod .
fi~ier.
A fi sarea v ecinil or
Se citesc din fisierele create anterior (graf5.txt, respectiv graf6.txn matricele de incidenta ale celor doua grafuri ~ i se afiseaza vecinii unui nod x a carui eticheta se introduce de la tastatura. Functia c i teste () se foloseste pentru a citi matricea de incidenta din fisier. Graf ul ncorien tat. Functia vecini. ( ) se totoseste pentru a determina vecinii unui nod. #i. nc l ude in t arlO] [lO],n ; fst ream f{ "gra£5 .txt " , i o s : : i n ) ; v o id c t t.e s r e () lint i ,k ; f »~ »m ; f or ( i = l ; i i nt n, m , ~[ 3 J [ 50J , a [ 1 0 J [10 J ; //pentru graful n e o r i e r. t a t: fstr e am £ 1 ( " qraf13 .t xt " , i o s : :in l , £ 2 ( "g r af l.') . L:{t " , i o s : :out ); // pe n t r u g r a f u l o rienta t // f s t r e a m f l ( "gru f l lJ . t x t " , i o s : :in ) , f 2 (" g r z,. f 1 6 . t z t ",ios: :ou t ); v o id c i t.e s te () tint L j , x , k ; f l »n»:n ; fo r (i = l; i < o=n; i ++ ) L[1J [ij ""i ; j =- n+l ; for ( i = l; i x , if
( F ~O) L [2 ] [i) = O; e l s e { L [ 2 ] [ i]=j ; f or ! k = l ; ~ < = x ;
k~ +1
{ f l» L [ l } [j] if ( k '~ " 1
~ [ ] [j) = j + l ; else L [ J [j; =O;
J++ ; ) ) )
::1 . close {} ; } int g rad {i n t i ) lint g ,j=L[2 ] [i] ; i f (1,[ 2J ( i. ; = =O) 9 =0 ; else { g o= "2.; while (!'[ 2j [j J ! =Ol { g ++ ; j ++ ;)} return c; ; } int ~!:"ad_ma;·; () tint i ,I;:ax=C; f or ( i = l ; i< =n ; i+f) if iq rad\ i1 >max m a x = g ~ 2 d{i) return :n2X ; l void t r aaa pune ()
lint i ,j ; f or (i =1 ; i< =n ; { j = L [ 2 J [i} ; if
i+ + )
(L[ 2j [ i. ; ! = O) {wh a Le ILl 2] [j] ~ o' O I {a l i ) [L [l ] [jJJ = l; a l L] ( L[ l J )j]]= l ; )})
j++ ; }
;
194
I m p lc m cnta rca st r ucru r llor de d ate
void s c r ie()
(int i ,j ; f 2« n« e nd l ; for {i""l ; i
ffinc l ude voi d ma i n () ( i n t m, n , n l : c o u t«" mu c h i i= " ; c in» rni ccu e .c-cvn o d a r i> " ; cin» n; nl-l i n tl{( 1+ s q r t(1+8-mIJ/ 2) ;
cou t « "Numarul ma x i m de no dur i izolate
e ~t e
"« n- n l - l ;}
1. Scrieti un program care citeste , din fisierul text graf.-cl. txt, inforrnatii despre un graf neorientat (de pe prima linie, nurnaru l de noduri, apoi mat ricea de adiacenta) , ~i care verifica daca este un graf com plet. 2. Scrieti un prog ram care citeste, din fisierul graf_c2.txt. info rrnafii des pre un graf orientat (de pe prima linie , nurnarul de noduri, apoi matricea de adiacenta) - si care verifies daca este un graf complet.
2.7.6. Grafuri derivate dintr-lIll graf Se definesc urrnatoarele grafuri : -7 graful pa rt ial; -7 su bgraful ; -7 graful c om plem en tar.
2.7.6.1 . Graful partial Fie graful G = (X,U)
~i
multimea VS;;U. Graful Gp = (X,V) se nu m csto graf partial al gratulu; G.
Altfel spus, un graf partial al grafului G esto 01In susi s au un graf ca re s-a obtinut prin climinarea unor mu chii (aree) din graful G.
Exemple : 1. Pentru graful neorientat G, = (X" U,), definit anterior , graful G, p = (X" U, p), definit astfel: -7 rnultimea n odurilor este X,={1 ,2,3,4,5,B,7,8}. -7 multim aa muchiilor este U,p ={(1,2], [1,3], [1,4J, [2,3], [2,5J, [3,41 , [B,7]}. este subqraf al grafului G , - figura 17. Grafu l
G,
~
®!Ec:> ~
~~®
Fig. 17
~'@
~
Graful partial G, p
GI (I
204
lmpl cm cn tarcu s t r uc ru r ilo r lie da te
2. Pentru graful orientat G IO=(XlO.UlO) definit anterior, grafu l G10p = (Xr o, U1CP) definit astfel: -7 rnu lt irne a nodurilor este X lO={1 ,2,3,4,5,6,7,8,9,10j, -7 rnultlm ea arcelo r este U, oP=([2,3) , [2,5J, [2,6), [2,7J. [4,1], [7,2), [8,9] , [9,8)}, este subgraf al grafului Gl 0 - figura 18.
5 Grafu l
~ ......
G, o
.J
4
~
5
Grafu i
® partial G 10P
9
Fig . 18
Teorcma 8 m Numarul de grafuri partiale al e unui gra f c u m m u chii (a rce) este eg a1cu 2 . Dcmc nstratle. Grafurile partiale se pot obtine: tara eliminarea une! much ii (arc) - obtinandu-se gratul initial; prin elim inarea unei muchii (unui arc) - obpna ndu-se grafurile partiale cu rn-1 muchii) ; ..: prin elimi narea a m- 1 muchii (arce) - cbtinandu-se grafurile partial e cu 0 muchie (un arc): ~i a tuturor muchiilor (arcelor ) - obtinandu-s u un graf partial numai cu nod uri ~ i rara rnuchi i (arce), adica gratu l vid: Numarul de grafuri partiale care se pot obtine cu m mucnu (arce):
em," cm - l
Numarul de grafuri pa rtiale care se pot obtine cu m -t muchii (arce ):
'" '"
Nurnarul de grafuri part iale care se pot obtine cu m -z muchii (arce). :
(,m -~
Nurn arul de gra fur i parti ale care se pot obtine cu 0 muchie (un arc ):
cl
Nurn arul de grafuri pa rtials care se pot obtin e Nurn arui total de grafu ri part iale este :
rara
nici 0 muchie (nici un arc ):
C::: + c:::- + c:::I
l
+ .. + C~l1 +
C: 1
=
'"
2'''.
Algoritmi pentru prelucrarea grafurilor partiale
1. Ge ne ra re a tut uror gra furilor partia le ale unui graf neorien tat. Algo ritmul. Se fotoseste m etoda backtracking . i n stiva se vor genera muchi ile partial, Deoare ce grafu l partial poate avea p much ii (O,;p,;m), se va apela repetat gramul bt ( ) , la fiecare apel qenerandu-se variantele cu p much ii. Fiecare apel al gramulu i bt ( ) trebuie sa gen ereze C:: de muchii (arce) din graf . La fiecare apel al gramului, solutia se obtine atunci cand i n stiva s-au gene rat cele p muchii ale partial . Evidenta muchiilor este pastrata i n matricea de incide nta .
grafului subpro subprosubprografului
Implc m entar ea aigoritm u lui. Se cites te din fisierul text graf i S.txt mat rice s de adiace nta a unui graf necrientat, Pe ntru fiecare graf parti al S8 afise aza muchiile . Matricea de incide nta b se obtin e din matricea de adiacenta cu functia t r an s fo rma re () . I n variabila nr se cont orizeaza nurna rul de grafuri partial e generate , in functia ti pa r () se afise aza graful partial general. Pentru testa rea programuiui se Ioloseste grafui G,. #inc lude < i 0 s t r E a~ . ~ >
f s tre a m f ( "g :::-a ::::" 3 . :x t " , ':c ,s : : i :-d ; typedef i ~t 3 t i v A [ l OOJ ; in t ;l ,ffi,p ,k , ev , as ,a lClflO] ,o[lOlf 20] ,nr ; s tiva ~l ; void ci t.e s te (}
205
III fo r ma ticii t int L j 1»n»x ; for (i= ; < =n ; i + '~ ) ; j < = n ; j + + } { f l» a [ i ] [jJ ; i f
f or { = m=~ / 2 ;
void
(a:i] [jl == l) m+-i- ; }
.c l os e () ; }
~ra n s fo ~mare(j
tint i, j , k = l;
f or
(i = l ; i < = n ; i ~ +)
for ( j ~ l ; v o i d i n i t l)
j < i ; j ++ i
if
(a[ l ]
[j ] ~ ~l i
{b [ i ]
I k ] ~l;
b[j]
I k]~ l;
b+ ; II
{ 3 t [ k ] ~ 0;}
int succ e sor- ( ) (s t [ k l : (i n t
&&
s l: [ k ] f stre a m fl ( " g l p . c x: " , i o s : : i n ) ,f2 ( " g 2 p . : xt " , i o s : :in ); in t Cl ,n , a1[ :0) [:0] , a 2[:O : [10) ; i n t g ra f p () {i f (m t e n ) r eturn 0 ; el s e f or ( i n t i=l i i< =n ;it--t-) f o r (i n t j~l ; J 12= I , . i=3 => (3+2) mod 4 + 1 = 2; dar: 13=6 ~i ;'2=5 => 13" ;'" Algoritm pentru determinarea ciclurilor elemenlare intr-un grar Alg oritmul. Se qenereaza toate lanturile elementare care pornesc din nodul x (t sxsn), tree prin eel putin trei noduri si se pot inehide eu nodul x. Pentru generarea aeestor lanturi elementare se foloseste metoda backt rack ing , care se va apela pentru fiecare nod x . Solutia se obtine atunei cane nodul adauqat in stiva formeaza 0 muehie (un arc) cu nodu x - ~i stiva contine eel putin 3 noduri. trnplem entar ea algoritm ului. Se citeste din fisierul text graft .txt matrieea de adiacenta a unui grat neorientat, respectiv , din fisierul graf2./xt matricea de adiacenta a unui graf orientat . Se cauta toate ciclu rile elementare care exista in graf ~ i se afiseaza . Daca nu exista niei un ciclu elementar, se afiseaza un mesaj. Pentru testarea programelor se lo losesc gratul neorientat G, si gratul orientat G9 .
220
Implementa rea stru cturllor d e d a t e
#in clude < f s t ream .L>
typedef s tiv a [lOO J ; int a[2 0 J [20 ] , 0 , k a s , ev , x , e s t e e O, s t i v a st ; i
fstream f( "g ra f l .txt " , i o s : :i n ) ; ( I I :;; e c i t.c s t c me t .r i cee d e e d a a cent.a d in f.i s i.e rI
void citeste() void .i n i t Cl
{ / / es t e ident i c a c:.:: cea de 1a a f i $area l a n t;:ur i lor elen;e:1tare } int s u c c e s o r ()
{! Ze s t e .i d e n t L o a CD CEa de La c L i se rce Lan t u ..ri L c r e Lemen t a r e } int va Li d () { / / s-s t e Ldent t ca ell cea c e La af t s e re a Lan t ur i.Lo r element are } i nt ~') o l 1J r, i e ( ) {return a [ s t[ k] ] j x ]== l && k>2 ; } lise ob;;:ine solut;:iaatunci canci ultimlJl nodadaugat este ad iacent //nodu lui x ~i in s t i vb cxist~ eel pu~i n troi Docturi void t Lpa r () {f or (i n t i=l , e st e= lii l ) i f (a [st [k-l IJ l sr I kl 1~~O I r e tu rn 0 ; fo r ( i n t i =l ;il ; } I /se ob t i.n e s o Lu t La a tunc i, caner ultimul nod a c t ype d e f st iva[lOOJ ; in t a[20] [20] ,n,k ,as ,ev , x , y ,v[20) ,este=O ; stiva st ; f stream f ( "gr8a£19 . txt " , ios : : in) ; void c.l t e s t e t ) { l i s e c Lt.es t;e matricea de ad i ecen t a din r Ls Le r j void init() {/ / i de nt i c a ell cea de 1a afi$area lanturilor elementare } i nt succesor() {I / i de n t i ca ell cea de 1a afi$area lan~urilor elementare l int valid (} {I l i de n t i c a eu cea de 1a afi$area lanturilor elementare } int so Lu t.Le () {re turn st l k l ==y ; } lI s e obtine solu1;.ia atunci cand ultimul nod aciaugat in stiv;§. este y void t i.pe r t ) {e s t e = l ; ~ Iidaed exista solut;.ie (un lant intre nodur ile x $i y ), ! /ve r i ab i.La este va avea v aJoarea 1. v o id bt(} { l l i d c n t i c a cu cea de 1a af i sa r ea Lant ur Ll.c r e Lemen t a r e } v oid cOffiponente{) {i n t m""' O; f or ( x ~ l; x < ~ n; x + + )
if
( v[ xJ ~~OI
(m++ ; s t [ l J ~ x; v l x l e L, c cu t -ocvCompon e n r a conexa " int
a [ l OOJ ( 100 ] , n ;
int con s t MAX ~ 50 00 ; f s tream f( " c o s t. t x t " , i o s :: i n ); v o i d in i t t I / I s e Ln i. t.La.l i z eaz a ma t r i cee c os turil o r {int L j : f» n ; for ( i = l ; i 4. Nu se rnodifica nimie. Nodu l 5. d [3] +a [ 3] [5 ] = 3+r , = r · > 4. Nu se mod ifies nimie. Ve c torii 1 2 3 4 5 1 0 1 s 0 0 4 cc d 3 0 ""0 p 0 1 0 1 Drumul eu costuI eel mai rnic este eu nodul 2: d[ 2 ] =4. Nodul 2 se va extrage din eoada Q . Se analize aza nod urile care raman in coada de prioritati: NoduI 4. d [ 2 ] +a [2 ] [4J =4+7=11 B=0 ~i ca fiecare muc hie uEU, ={[1,2J, [1,4] , [2,3J, [3,4J, [3,5J , [5,6J, [5,7], [5,8J, [7,9]} are 0 extrem ite in rnultirnea A ~i cealalta extremitate i n rnultirnea B:
1
[1,2) c> 1EA si 2 EB [3,4) c> 3EA si 4 EB [5,7) c> 5EB si 7GA
[1,4) c> 1EA si 4eB [3,5) 3EA ~i 5EB [5 ,8) c> 5EB si 8EA
[2,3) "" 2eB ~i 3eA [5,6) "" 5eB ~i 6 EA [7,9) c> t e». ~ i geB
1
, , , , , ,
, I
,, ,
1 , ' ,@ , ' @O' , , \
I
/
Obs erv ati e. Nodurile izolate pot face parte din oricare dintre cele doua rnultirn i.
Fig .3 5
257
I II fo r III a tic ii 2. Graful orientat Gg definit anterior este un graf bipartit deoarece exista ' mult irnile A ~ i B care sa i ndepllneasca cond itiile din definitie: A ; A ; (1. : 3, 4, 6) ~i B ; (2, 5). Se obse rva ca: AuB ; (1, 2, 3, 4, 5, 6) ; X g ~i I AnB;0 si ca fiecare muchie UEUg; {[1,2J, [2,1J, [2,3], [2,4], [3,5], [4,2], : [4,5J, [5,3], [5,6], [6,5]) are 0 extrernite in rnultim ea A ~i cealalta extre- I mitate in multimea B: I .
[1,2] => 1EA ~ i 2EB [2,4] => 2 EB si 4 EA [4,5] => 4 EA ~ i 5EB
-,
I
[2,1] c> 2 EB si 1EA [3,5] => 3EA si 5EB [5,3] => 5EB ~i 3EA [6,5J => 6 EA si 5EB
[2,3J => 2 EB ~i 3EA [4,2J => 4 EA ~ i 2 EB [5,6] => 5EB si 6 EA
I ~
,
I
Fig . 36
Graful bipartit G ; (X,U) se nurn ests graf bipartit cornplet dac a - pentru orice nod Xi EA §i orice nod xje B - exista 0 muchie (un arc) fe rmata din cele doua nod uri care apartine rnultimii U; [Xi, Xj]EU, Exemple: 1. Graful neorientat G,,;(X28 ,U' 8) definit astlel: X28 ;{1 , 2, 3, 4) ~i U'8;{[1,2]. ~3 [1AJ, [2,3], [2.3]) este un graf bipartit complet. deoarece exists multirnile A si B care indeplineasc conditiile din definitie: A;{1 , 3) ~i B;{2, 4). Se observa ca: 2 4 AuB; (1 ,2,3A }; X, si A,,-,B; 0 si ca fiecare nod din rnultimea A este legat cu 0 Fig . 37 muchie de fiecare nod din multimea B. 2. Graful orientat G29 ; (X 29,U29) definit astfel: X29;{1 . 2. 3, 4) ~i U, g;{[1 ,2], ~ 2 [1,4J, [2,1], [2,3], [3,2], [4,3]) este un graf bipartit complet, deoarece exists G2~ rnultimile A ~i B care sa Indeplineasca conditiile din defin itie: A;{1 , 3) si 3 4 B;{2 , 4). Se observ e ca: AuB;{1, 2, 3, 4};X, si AnB;0 ~i ca fiecare nod . din rnultimea A este legat cu cel putin un arc de fiecare nod din rnultirnea B. Fig . 38 Observatie. Graful neorientat bipartit complet se noteaza cu Ka,b ~ i are axb rnuchii, unde a; c ard (A ) ~ i b; ca rd(B). De exemplu , daca graful neorienta! are 3 noduri, S8 obt in urrnatoarele variante de grafuri bipartite complete: Elementele multimii A 8 1 2.3 1,3 2 3 1.2 1.2 3 2 1.3 2,3 1 1,2.3 0 0 1.2.3
Muchiile ar afului
[1 .2J. [1.3J [2.1J. [2.3] [3.1]. [3.2] [1.3J. [2.3] [1.2]. [3.2] [2.1]. [3.1] nu exista, deoarece 8- 0 nu exista. deo arece A- 0
Numaru! de muchii ale arafului 1/2-2 1x2=2
1/2 -2 2x1 =2
2/ 1-2 2/1-2 3xO- 0 Ox3-0
Algoritmi pentru prelucrarea grafurilor bipartite 1. Generare a tutu ror graf urile neorientate bipartite compl ete cu n noduri. Al goritmul. Problema se reduce la a genera toate subrnultimile care se pot obtine din cele n eleme nte (exceptand rnultimea inltiala ~ i multimea vida). Nurnarul total de submuln timi obtinute este 2 - 2 . Solutia este de a genera intr-un vector nodurile care apart in multimilor A ~i B. astfel: daca un element are valoarea 1, nodul care are eticheta corespunzatcare indicelu i elemen tului apartine rnultirnii A; altfel , apartine multimii B. Impl ementarea alg oritmului. Functia ge n e r are () qenereaza grafurile bipartite complete. Tn vectorul a se genereaza nodurile mult irnilor A si B. Initial elementele vectorului au
258
Implem en ta rea st r uctur ilor de date
valoarea O. Variabila po sLbd L se foloseste pentru a verifies dac a mai exista posibilitati de genera re de submultirni (are valoarea 1 - true , atunci cane mai este posibil sa se genereze subrnultirni ). # inc l ud e < i o s t r e a~ . h >
# incl u d e vo i d ge n e ra r e (i n t n) lint a [ 1 0 ] ~ { O ) , i ,j ,k~ 0 ,posi bi l ~ 1 wh i l e (po s ibil)
;
l j ~ n;
wh ile
if
(j> O & &
I j~~O I
e lse
a [ j] ~ ~ l)
{ a [ j J ~ O;
j-- ;}
po sibi l ~ O ;
{ a [ j ] ~ l ; k + +;
if
(k < ~ p ow (2 , n l - 2 1
{cout « "Cr a f u l ': « k «endl « "i'·hl l t i me a A : "; fo r (i = 1; i
typedef s t i.va [20 J ; int n,o f20 1L2 0J , v i zi t a t [ 2 0 J , v f, k , r:l , g l 2 0 1 ,p= l, cf 2 0 1 , cl I 20 j; stivu st ; fs t r eam
f ( " ':J :::- a f ~ e . t x t " , i o s ;
;i n ) ;
void c i t e s t e{ ) { / / s e c it ~~ t e matricea d e a d i a c e n t ~ } voi d i.n it( i r: t i) { v f = l ; s t j v f l e i : v .iz i t .a t Lt l e-L r } i n t e s t e j v ida ': ) {retur n vf ==O; } voi d 2 daug( i n t i ,1 { v f + +; s t j v'fl e i : v i z i t at[i ] = 1; } v o id e Li.rni n t ) {v t':"'_;}
I nfo r mat ica voi d l i nt
267
p r .eLuc r-a re t) k ~ st I v fl .
i~l ;
( i < ~n && (a[i][kJ ~~ O I I (a[ i ] ! k J~~ l && ( i = = n +1 ) el f rrun (} ; e lse {p..j'+; a d a u g ( i ): }} i n t c one'x () ( k= ).; .i n i t ( k ); whil e
vizitat[iJ ~ ~l )))
i ++ ;
if
while ( ! es te v ida () ) prel u crare \) ; r etu r n
(p==n) ; }
v o id g r a d ( )
{for (int i =l; i ( 6). Din aceste implicatii rezulta ca (1)"",(2), (2)"",(3), (3)(4), (4p(5), ( 5 )~ 6) ~i (6) c» ( 1). Din tranzitivitatea relatie i de echiva lenta rezutta oricare coua din cete 6 propozuii suntechivalente.
(1)::::)( 2). lpoteza: Graful G este cone x ~ i acic lic - din defin itia arborelui (1). Conctuzie : Graful G este aciclic ~i are "·1 muchii (2). Proprietatea ca graful G este aciciic este cornuna ipotezei ~i concluzie i, Trebuie demonstrat doar ca un graf co nex aciclic are n-1 muchii. Oaca G este conex aciclic. nu trebuie elirn inata rue 0 muctue pentru a se obune un graf partial conex acic nc. Cum nurnarul de muchii care trebuie eliminate dintr-un graf conex pentru a obt ine un graf partial conex acicuc este egaI cu m-n+1, Inseamna ca in acest caz, m-n+1=O . Rezulta ca m=n-1 . (2)=>(3 ). Ipoteza: Graful G este aciclic ~i are n-1 muchii - din de finitia arborelui (2). ConcJuzie: Graful G este conex ~i are n-1 muchii (3). Proprietatea ca graful G are n-t muchii este cornuna ipot ezei :;;i concluziei. Trebuie demonstrat doar ca un graful cu n -t muchii fiind acicl ic este ~i conex. Se stie ca intr-un graf cu p componente cone xe. numarul de muchii care trebuie eliminate pentru a obtme un graf partial aciclic este egal cu m-n+p
=2 noduri contine eel pu!in doua noduri termina le. Dcm onstralie - prin reducere la abs urd. Presupunem ca nu exista decat un singur nod terminal X. Oricare alt nod din arbore are eel pulin gradu! 2. Alegem din arbore, dintre lanturile elementare
care au
0
extremitate in nodul x, lan\ul de lungime maxima: L(x,y ). Nodul y avand gradul
mai mare decat 1, inse am na ca mai exista , in afara nodului ca re iI pr ec e de in lant , eel putin u n nod z ca re e ste ad iace nt eu el. Lantul fiind e lementar, inseamn a cil nodul y nu exista in
lan\ decat la extremitatea lui, iar muchia [y ,z] nu face parte din lan\ ~ i putem adauga aceasta much ie la lan\. Lan\ul fiind de lungime maxima, i nseamna ca nodul z aparline
283
Inform nrica lantului si prin adauqarea acestei muchii la lan t definitia arborelui (graf aciclic).
S8
inc hide un ciclu , ceea ce contrazice
-------- -----.. 1. Precizati daca este arbore graful G4 0 (x" o, U40 ) definit astfel: X40={1,2,3,4,5,6,7,8,9,1O} U4o={[1,2J, [1,31 , [1,5J, [2,6], [2,7], [3,4], [3,9J, [4,8], [8,10] }.
0 40,: 0 "
, Jr
2. Oernonstrati ca un arbore este un graf bipartit. Reciproca este adevarata? 3. Scrieti un progra m care citeste dintr-un fi~ i e r text intorrnatii despre un graf neorientat (de pe primu l rand , nurnarul de nodur i ale grafu lui - n , iar de pe urrnatcarele n randuri matricea de adiacenta a grafu lui) ~ i care: a. verifica daca graful este un arbore: b.
c.
daca nu este arbo re, verifies daca prin eliminarea muchi ilor poat e fi facut arbore ; in caz S8 specifice cate muchi i trebuie eliminate ~i care sunt aceste muchii. afirmativ daca nu este arbore , verific a dac a prin adauqarea muchiilor poate fi fac ut arbore ; in caz afirm ativ se specifice cate muchii trebuie ad aug ate si ca re sunt aceste muchii.
sa
sa
2.8.2. Arborcle partial 2.8.2.1. Definitia arborelui partial Daca un graf partial al unui graf G este arbore, el se numeste arbore partialal grafului G. G " . ti;~~~~'·
, W'
c::=) Graful G 41 Teorema 22
Fig. 48
Un graf G contine un arbore partialdaca
Arbo re partial al grafurui G 41 ~i
numai daca este un graf conex
Dernonst ra tie . Notarn cele doua propozitii, astfel: (1) - Graful G coruine un arbore partial, (2 ) - Graful G este conex .
Trebuie sa dernonstrarn ca (1)=>(2) , i (2)=>(1). (1):::;::.(2). Sa considerarn ca graful G conune arb orele part ial H. Din deflnitia arbo relu i rez ulta ca H este un gra f conex. Din de finitia arbo relui partial rezurta ca H este graf partial al gra fului G. Deoarece graful G se obtine prin adauq area de much ii la un graf conex (H), este ~i el un graf conex. (2):::;::.(1). Daca G este un graf conex minima l, inseamna ca este un arbore (din Teorema 21: (1) e> (5)) ~i H=G, Daca G nu este un graf cone x minimal , lnsearnna ca exista 0 muchie [x ,y] pe care 0 putem elimina astfel incat sa obtmem un graf partia l conex G 1 . Daca graful partial G1 este un graf conex minimal, tnseamna ca H= G1; altfe l se repeta procesul de eumtnare a cate unei mucfui pim a se obtine un graf partial conex minima l. Acesta va fi arboreJe partial H.
2.8.2.2. Definitia arborelui partial de cost minim Conside rarn un graf conex G::::(X,U), 0 funcne c :U~R+ ca re asociaza fiecarei muchii u un numar rear pozitiv cluj, numrt co stul muchiei , ~i un graf H=(X,V) care este graf partial al
grafuru; G (V,;;U). Functla c se numeste functia cost Definim: Costul grafuluieste s uma cos tu rilor muchiil or grafului .
284
Implementarea stru ct urilor de dat e -7 costulgrafuluiG : c ( G ) ~ Lc(lI )
.
-7 costul gr afului part ial H: c( II ) ~ LC( lI ) v
Se nurneste graf partial de cost minim al unui graf G conex, cu functia de cost c . un gr af partial cone x H care are co stul minim . Teorema 23 Graful partial de cost minim al unui graf conex G, cu functia de cost c, est e un arbore . Dern on stratie - prin reducere ta ab surd. Daca graful G este un arbore, atunci H=G, deoarece orice muchie am elimina din G si-ar pierde proprietatea de conexitate. Daca graful G nu este un arbore, i nseamna ca el ccn tme un numar finit de grafuri partiale conexe. Alegem dintre aceste qrafuri
partiale graful H care este graful partial de cost minim. Presupunem eel acest graf partial nu estc arbore. lnsearnna ca el corinne eel punn un ciclu !?i exista 0 rnucrue u=[x ,Y] pe care 0 putem suprim a astfel tncat sa obtinern un alt graf partial conex H1. Rezulta ca: c( H )=c( H 1)-c( u» c( H 1)
Inegalitatea c(H»c( H1) contrazice faplul ca graful partial H este de cost minim. partial H este arbore.
lnseamna ca graful
A rborel e care este un gr af partia l de co s t minim al gralu lui conex G, cu fun ctia de c ost c . se nurneste arbore partial de cost minim (APM) .
[ §mdllll.ll. de caz ) Scop: ide ntificarea aplicatiilor in care se Iolose ste arborele partial de cost minim. Enuntul probleme i . a retee de cetcutetoero este formata din 7 cetcutotoero server conoetate intre ete si calculatoare cliont conectate ta servere. Unele servere pot fi tegate direct, enete nu. Pentru ca reteaua sa tunctionezo trebuie sa se esiqure transportul date /or intre oricete aou« cetcutetoere server (daua servere trebuie sa comunice fie prin /egatura directa, fie prin intermetiiut altor servere). Fiecare legatura onect« dintre doua 2 10 4 2 setvere are asociat un cost de constructie. Legaturife care se pot 5 face intre servere §i costume asociate acestor legaturi sunt 1 1 1 prezentate in figura 49. Sa se gaseasca a sotutie de construire a 8 3 }-- n--{ reteiei de calculatoare (de a lega setvetete intre ele) astfel incet g costul de realizare a retelei sa fie minim. Fig . 4 9
0 •• 0 retea de servere este un gral neorientat G" cu n noduri (i n exemp lu, n=7) , in care nodurile sunt serverele, iar leaqaturile directe dintre doua servere, much iile galului. Gralul este conex (oricare ar fi doua serve re din rete a, i ntre ele tre buie sa existe un lant care sa Ie perrnita sa comunice intre ele). Gasirea solutiei optime de conectare a serverelor, astfel tncat costul finan ciar sa fie minim , in seamna determina rea unui graf conex de co st minim , adica gas irea arborelui partial de co st minim al grafu lui. Observatie. Orice retea de transport (de calculatoa re, rutiera , de cale terat a, aeriana. de teteco muni cat ii, de ca nalizare etc .) este un graf neorientat con ex. Construirea cu costu ri fina ncia re min ime a unei asUel de reteIe se rezolva prin gasire a arbor eJui partial de cost minim al grafului asociat retelei. ~
- m=5 0
-
0
r
Muchia cu costul min im este [QUI' j]= [Q[7] 7]= [5 , 7] 7 Nodul i 1 2 4 6 3 5 H[7]=0[7] H[i] 0 1 1 6 4 3 5 Q[i] 0 0 0[7J=0 0 0 0 0 0 Cost u l [i,Q[I]] X-A= 0 Actualizar e Q[i] ,~ 0 0 0 0 0 0 Costu l [1, Q[i]] Arborele partial H=({1,2 3,4,5,6, 7),{[1,2), [1,3], [3,6], [4,5], [4,6], [5,7} i - } m --6 ~,
o
Pentru implem entarea algoritmului S8 folosesc urrnatoarete variabile ~ i structuri de date: ~ var iabi lele n ~ i r pentru numarul de noduri, respecti v pentru nod ul radacina ; 7 matricea patranca A, cu dimeniunea n , pentru matricea cost urilor asociata grafului; 7
ve cto ru l Q, cu n elemente, pe ntru coada de priori tati;
-7 ve cto rul H, cu n ele mente , pe ntru lista much iilor d in A PM ; -7 variabila ct pe ntru a calcul a co st ul tota l a l arbo relu i:
291
In formaticii ~
varlab ila k pentru a numara muchii le adaugate la arborele partial : irntial are valoarea 0 - arborele nu co ntine nici 0 muchie - valoarea sa fina la este n-1 (nu rnarul de muchii ale unui arbore cu n noduri): -7 variabilele i si j pentru indicele cu care 58 parcurge coada de prioritati , respectiv pentr u nodul care se adauqa la arbore :
si subpro gramele: -7 functi a procedu rala ini t _ me initi alizeaza mat ric ea co sturilor: -7 func tia proced urala ci ti re_me actualizeaza matricea costu rilor cu da tele din fisie r; ~ functia procedurala i ni t _Q initializeaza caad a de prioritati Q ; -7 functia operand rnuchie cauta 0 much ie siqura in multi mea muchii lor nealese ; -7 functia procedurala actualizea za_ Q actualizea za coada de prioritati Q dupa ce a fast adauqata muchia la arbarele partial: -7 functia procedurala a f i s a.r e afiseaza APM . #i nc l ude < fs t realn .h> fs tream f {"co s t a p m. Lx t " , i o s: :in ); i nt a[SOJ [ SOJ, Q [ SOJ, H[ 50l, n , r ; cons t int VM?~~5 0 0 0 ; void ini ( ~mc () (i nt i ,j : f» n : for (i = l: i in t t[ 2 0I,pt[20I, c[ 2 0 j,fl ; f s t r e a m f{ " a r b ore .L x t " , Lo s : : i n 1; voi d c i t i re t ) / /se c i t e sc d a t.e Le d .i.n f i s Le r t i nt i ; f »n; for ( i ~ l; i i n f o); -7 adresa subarborelui stanq - (nod * s .....-+ S este adresa radacmi! subarborelui stanq), -7 adresa subarborelui drept - (nod *d .....-+ d este adresa radacinii subarborelui drept). nod { i n f o : i nod *si* d;}; nod *r ; / /r=adre sa radacin ii
struct
Trebu ie precizate in fieca re m ome nt pozi ti ile a trei co mponente : radactna (*r) !}i cei do ; subarbori ('s § i ' d).
Regula. fntotdeauna este reprezentat subarborele stanq si apoi subarborele drept. Daca un nod nu are un succesor , succesorul va fi considerat arborele vid.
Se numoste arbore vid un arbore care are adresa NULL
311
I II fo rmaticii
ExempluJ 1 - Pentru un arbore binar pe care-l construim pentru campionatul de meciuri de baschet intre echipe le rna; multor licee , informatia utila poate fi fermata din mai multe carnpuri: numele echipei (n_ e), numele liceului (n_ 1) ~ i eticheta nodului (n r): s tru c t
n od {char n _ e [ 1 5 J, n_ l [1 5] i in t n .r : nod «e , * d i } * r i
Exemplul 2 - Pentru exem plele urrnatoare, inforrnatia utila va fi fermata numai din eticheta ~ 9? 1..( nodului: struct n od t i n t nr ; , ~ _T:I l-, -.-TI=" '- rt ::"11
4 INULL I.
nod *s , *d ; } ;
nod *r;
1
-----
3 INU L L INUL~5 INULLI NULL
in figura 78 este pre zentata implementa rea dinamica a arborelui A 13 din figura 77 .
1
Fig . 78
7 I N U L L I N U ~8..J-. I N U LL I
I
9 INULL INULL I
Algoritmul pentru crearea unui arbore binar Agoritmu l pentru cr ear ea un ui arbore bin ar implementat dinamic foloseste strategia di vide et impera prin descompunerea problemei in trei subprobleme: 1. crearea nodului radacina (cazu l de baza) ; 2. crearea subarborelui sta nq: 3. crearea subarboret ui drept. Descompunerea problemei co ntinua pana can e subarborele care S8 cre eaza este arborele vid. Combin are a so lutiilo r se face prin legarea nodulu i radacina de cei doi subar bori.
Daca datele S8 citesc de la tastatura. pentru a evidentia eel nodul care se cree aza este radac l na unui arbore vid , in carnpul pen tru etic heta se introduce v aloa rea 0 (care marcheaza lipsa de informatii pentru acel nod). De exernplu, pentru a crea arborele din figura 79. se introduc in ordine. de la tastatura. etichetele: 1 2 3 0 0 6 7 0 0 8 9 0 0 0 4 0 S 0 O. Algoritmul pentru crearea arborelui binar este: PAS1. Se citest e informatia utila din nod. PAS2 . Daca nodul nu contine inforrnatie utila, at unci se creeaza arborele vid; alttel : PAS3 . Se creeaza un nod radacina prin alocarea unei zone de mernorie. PAS4. Se atribuie , carnp ului cu informatie din nod. info rmat ia citita . PASS. Se creeaza subarborele stan q. PAS6. Se creeaza subarborele drept. Subprogramul care creeaza un arbore binar poate fi implementat ca functie procedurala sau ca functle operand . Functia proc adurala voi d c rea r e (nod *& r) {i n t n ; c ou t « " E:: i c h e 1: a nod : " ; cin» r:. ; if (n~~O) r~NULL ; else {r = new nod ; r ->nr=n ; c reare (r ->s) ; c r ea re{r ->d) ; »)
Functie operand nod * cr-ee r e () ( i nt n ; nod *r; cou ti-oC'E t. L c h e t a nod :
if
"; cin» n;
(n==O) re t urn NULL; el se {r = new nod i r ->nr=n i
r - >s =c r e a r e ( ) ; r - >d=cre a r e ( } ; r e t ur n r ; }}
312
I mplementarea st ru eturil or de date
vo id main ()
v o i d ma in ( )
{c r ear c t r'j
{r e cree rer j,
;
cou t .c-C'R e d a c Ln a> " n r ; . .. }
Exempl e - Functii, implemen tate recursiv tolosind strategia di vide et impera , prin care S 8 prelucre aza arbori binari. Inattimea arborelui binar Nurnarul de "frunze" ale arborelui binar int max( i n t X, i n t y } {if (z>yl return X;
int fru nz a (n od * r }
e1 sa r e t u r n y ; } in t h ( n o d e r )
int nr:...}r(nod *r) {if Cr==NULL) retu rn 0 ; els e if ( f r unza(r)) re tu rn 1 ; else return nr.:...fr(r->s) +nr~fr(r ->d) ;
(if
(r ~ =NOLL) return 0 ; els e return 1+max(h(r ->s) ,h(r ->d)) ; } Copierea unui arbore binar
nod *c ornb {int 11 ,110d *s, n od *d ) {n o d * C i C = n ew n o d ; c ->nr=n ; c -c- a-s s , c -c-de d : re t u r n c r} nod *c o p i e (n o d *c ) {i f (c= =NULL ) r etu rn NULL; else r eturn com b tc-c-nr rc opie f c;->s ), cop.Ie (c - :>d ) } ; } v o i d main( )
{r l =c r e a r e ( ); r 2=cop i e {r l ); ... } Afisarea etichetelor de pe un nivel precizat
v o i d ni ve l(no d * r,int i , i n t k) ( if (r! =NULL) ( i f (i ==k) cout« r- >n :r«" " . n i.ve.L ( r - > s , Lr.L , k) ;
n ivel( r ->d , i +l , K) ; } } void main () {in t k ; r' s==NULL
&&
r ->d==NULL; }
Compararea a doi arbori binari int eqe Lj nod * r l , n e d * .1 2 ) ( if (r l ==NULL) retu r n r 2"='= NULL; else if
(r 2 = = NUL L ) retu r n 0 ;
el se retu rn
&& ega l( r l ->s , r2-> s) && egal(rl-> d ,r2->d) ; }
rl - > n r "=' ~ r 2 ~ > n r
void main( ) l. . . i f (eg31(d ,r2)) . .. ) Verificarea existentel unui nod cu eticheta precizata int caut(nod *r , i n t k) {if {r==NULL) return 0 ; else if (r ->nr==k ) re t urn 1 ; e lse return caut(r->s ,k) 1lcau t (r - >d, k );} v oid main () {int k ; r =creare() ; cout«" Nod ul: PI ; c in» k; if (caut (r , k l )
cout« "A fast gasit " ; else ccut.cc vtfu a r o st. gas it " ; }
2.8.4.3. Algoritmi pentru parcurgerea unui arbore binar Parcurgerea unui arbore binar se poate face prin: -7 algorilmu l de parcurgere in lalime (Ia tel ca la graturi); -7 algorilm i de parcurgere in adancirne (specifici arborilor binari): -7 algorilmul RSD (t raversarea in preordinc) ; -7 algorilmul SRD (traversarea i n inordine), -7 algorilmul SDR (traversarea in postordin e) Observatls Algoritmii pentru parcurgerea unui arbore binar pot fi folositi pentru a prelucra info rrnatiile din noduri.
313
I II for ma tica Algoritmul RSD
Meto da: se prelucreaza radacina, subarborele stanq, subarborele dre pt (pentru arborele A' 3 din figura 77 - 1 2 3 67 8 9 4 5). Implem enta rea stati ca
Implemen ta re a dinarnlca
v oid rsd ( i n t i) {cou t.c-c i -cc '' " ; i f {s t I i. ] '~ O ) s rd t s t l i j j • if ( d r[ ij ! ~C) s r d(d r[ i j) ; } v oi d ma i n () { ... r s d(r); cout«endl; . . .
voi d rsd (nod {i f ( r ! =NULL)
*r )
{c out« r- >n r « " ".
J
rsd ( r - > s) ; r sd ( r - >d) ; ) ) voi d ma i n () ( . . . r sd(r) ; cout«endl;
. . .}
Algoritmul SRD Metoda : se prelucreaza subarborele stang , radacina , subarborele drept (pentru arborele A ' 3 din figura 77 - 3 2 769 8 1 4 5). Impl em entar ea st atica Implemcntarea d ina rnica v o i d srd ( i n t i ) voi d srd (n o d * r l {if (r ! = NUL L) {if Ls ul L ] !=O) s r d t s t ll ll , {s r d j r - c- s ) ; cou t-c-c i -oc " " ; if
(d r [ i J' ~O )
cou t « r';" >n r« " ".
srd(dr[i] ) ; )
v o id main () { . . . s r d (r) ; c o u t«end l;
. . .}
s r d (r->d ) ; } } v oi d main () ( .. . s r -d t r-j , cout« e n d l;
.. . }
Algoritmul S D R Metoda : se prelucreaza subarborele stanq, subarborele drept, radacina (pentru arborele A 13 din figura 77 - 3 7 9 862 54 1): Implem entarca dtnarnica Implementarea statics void sdr ( i n t i) vo id sdr (no d * r ) {i f if
( st[ iJ ! = O) srdlst[i]) ; (d r Li j ' ~ O ) s rd(dr[ij) ;
cout« i « " "; }
{if
( r ! ~ NULL)
{ s d r ( r - > s) ;
sdr {r -e-d} ;
void main ( ) ( . . . sdr ( r ); c ou t « e n dl ;
c ou t« r - >n r «" n; }} .. . }
v o i d mai n () ( ... sdr( r);
c ou t «endl ;
. .. }
Obscrvatie . lnforrnatiile din nodurile arborelui binar, dupa prelucrare, pot f salvate intr-un fisier text. La 0 noua execute a programului ere permit restaurarea arborelui pentru a noua prelucrare . Exemplu - pentru arborele creat anterior, etichetele nodurilor sunt salvate intr-un fisier text (sunt scrise pe un rand , despartite prin spatiu ) ~ i la 0 noua executie a programului sunt readuse in memoria interna : Restaurarea arborelui din fisierul text Salvarea arborelui in fisierul text
=
( " a rbore . txt ", ios: : o u t ) ; void salva r e(nod * r ) {if (r != NULL)
fstream
( f«
r- > ~r«"
11.
r s d (:::- ->s ) ; r sd (:::- ->d ) ; }
e lse :'«0« " ";}
fstream g { " a r b o r e. txt " , i o s : :in ) ; nod * r e s t a u r a r e {)
t int n ; ned * r; g »n ; i f ( ~~=O~ r eturn NULL; els e { r = n ew ~ od ; r - >n r =n;
r - >s =r e s t a urare {};
314 void ma i n () { . .. sa l v a r e ( r ) i
Implcm enta rcu st r uctu rilor de date r- >d =re s t aurare ( ) ; • . . }
r e t urn r ; } }
vo id ma in() { .. _r = restua rare ( r ) ;
_. _ }
1. Scrieti cate un subprogram pentru urmatoarele metode de parcurgere a arborilor binari: RDS (radacina, subarbore crept. subarbore stang) , DRS (subarbore drept, radacina, suba rbore stanq) ~ i DSR (suba rbore drept, subarbore stanq , radacina). 2. Scrieti un program care citeste succesiunea nodu rilor afisa te prin parcurgerea SDR si prin parcurgerea RSD ~ i afiseaza etichetele nodurilor prin parcurgerea RSD . 3. Scrieti 0 functie iterativa pentru metoda de parcurgere RSD a arborilor bina ri. 4. Scrieti 0 functie care afisea za numa rut nivelului cu cele mai multe frunze .
sa verifice daca un arbore binar este perfect echilibrat. 6. Scrieti un program care sa furnizeze urrnatoarele informafii desp re un arbore binar: nodul radac ina, nodurile terminale, noduri le cu exact un fiu, nodurile cu exact doi fii, nodu rile frati ~ i Ina ltirnea. Arborele binar este implementat dinam ic ~i creare a lui se face prin introducerea informati ilor din noduri de la tastatura . 7. Scrieti un program care creea za un arbore binar irnplementat dinarn ic prin citirea etichetelor dintr-un fisier text (etichetele sunt scrise pe un rand , despartite prin spatiu , i n ordinea in care ar fi fost introduse de la tastatura ) si care verifica daca arborele binar este un arbore binar strict. 8. in nodurile unui arbore binar sunt memorate numere i ntregi care nu sunt distincte. Scrieti un program care creeaza un arbore binar implementat dinarnic pnn citirea numere lor dintr-un fisier text (numerele sunt scrise pe un rand. despartite prin spatiu , in ordinea i n care ar f fost introduse de la tastatura) :;;i care creeaza 0 tista dublu inla ntuita care sa cantina numai numerele distincte si, pentru fiecare nurnar, de cate on apare i n arbore, 9. in nodurile unui arbore binar sunt mem arate numere int regi care nu sunt distincte. Scrieti un program care creeaza un arbore binar implementat dinamic prin citirea numere lor din tr-un fisie r text l?i care creeaza 0 lista simpla, ordonata desc rescator, care sa cantina numai nume rele distincte . 10.f n nodurile unui arbo re binar sunt memorate numere naturale . Scrieti un program care sa realizeze urmatoarele: a. Creeaza arborele binar (implementat dinam ic) prin introducerea numerelor de la tastatura . b. Catculeaza suma numerelor pare din nodurile term inale. c. Calculeaza suma nume relor poz itive din noduril e care au exac t doi succesori . d. Determina nurnarul cu valoarea cea mai mare ~i de cate on apare in nadurile arborelui. e. Creeaza 0 lista sirnplu inl antuita cu numerele din nodurile arborelui care au ultima citra 5 sau 3. f . Afise aza pe ecran nume rele de pe un nivel k (k se citeste de la tastatura). g. Salveaza. intr-un fisier text , nume rele de pe fiecare nivel (numerele de pe acelasi nivel vor fi sense pe un rand, separate prin spatiu), h. Creeaza un arbo re cu aceeasi structura arborescen ta ca eel creat la punctul (a) dar care difera de eJ prin informatia din nodu ri: daca in prirnul arbo re nurnarul este par , i n al doilea arbore este inlocuit cu suma cifrelor sale, iar cac a in primul arbo re nurnarul este impar, in a! doilea arbore este in locuit cu inversul lui. 5. Scrieti 0 functie care
315
Informatica
2.8.4.4. Ap licat ii practice 1. Construiti arborele genealogic al stramosilor familiei pima la nivelul stra-strabunici (parintii directi ai fieca rei persoane). Se va lua ca nod radacina persoa na pentru care S8 i ntocmeste arborele. in fiecare nod S8 va memora nume le unei persoane (mama sau tat al persoanei din nodul parinte). lnformatiile despre arbore se citesc dintr-un fisier text, astfel: de pe prirnul rand, nurnarul de noduri ale arborelui, de pe urm atoa rele doua randuri vecl orii st ~i dr, ~i de pe al patrulea rand , i n ordinea etichelelor, nume le memorate in noduri. Scrieti un program care, pentru un nume citil de la tas tatura, sa afiseze numele parintilor ;;i num ele bun icilor persoanei respective. 2. Construni arborele campi onatulu i de meciur i de baschet. i n fiecare nod se vor pastra urrnatoarel e inforrnatii : eticheta nodului, numele celor doua echipe, scorul fiecarei echipe si data la care s-a jucat meciul. in nodurile terminale vor fi pastrate numai num ele echipelor. Scrieti un program care sa asigure urrnatoarea functie: oupa fiecare meci, se va cop leta inforrnatia i n fiecare nod : data la care s-a jucat meci ul ~i scorul; pe baza scorului , i n nodu l parinte va fi scris numele echipei castiqatoare. Dup a fiecare exec utie a prog ramului, arborele trebuie salvat intr-un fisier, de unde trebuie read us la urmatoarea executie.
2.8.5. Arborele binar de cautare 2.8.5.1. Def init ia arborelui binar de cautare Terminologie: ~
Se nurnes te cheie un camp din inforrnatia utila a nodului care poate fi folosit pentru a identifica unic noduriJe arborelui. ~ Se nurneste arbore binar de cautare un arbore binar care are proprietatea ca . pentr u fiecare n od , che ia din succesorul stang este m ai mica decal ch eia din nod , iar cheia din succesorul drept este mai mare dec at c heia din nod .
Ex emplu - Arbo rele binar A ' 4 din figura 79.
Fig. 79
Caracteristici : -7 Pentru orice nod , subarborele stanq contin e noduri cu valor i mai rnici ale cheii, iar subarbo rele drept coniine noduri cu valori rnai mari ale cheii.
-7 int r-un arbore binar de cautare nu exista doua nod uri cu aceeasi valoare a cheii . Pentru rnultirnea de chei {2, 5, 7, 10, 12, 15, 23} des enati arbor ii binari de caut are cu in altimea 2, 3, 4, 5 ~ i 6.
2.8.5.2 . Algoritmi pentru prelucrarea unui arbore binar de cautare Pentru prelucrarea unui arbore binar de cautare se pot folosi urmatorii algoritm i: ~ Algoritmul pentru creare, ~ Algoritmii pentru parcurgere , ~ Algoritmii pentru actuallzare.
At 4
.,
316
Imp lcmclltarca struerurllor de dare
Algoritmul pentru crearea unui arbore binar de cautare Crearea unui arbore binar de cautare S8 face prin adauqarea fiecaru i nod ca nod terminal, in
pozitia corespunzatoa re, astfel incat arborele
sa
nu-si piarda proprietatea din deflnitie.
Cau tarea nodului la care S8 va adauqa ca succesor nodul termina l ~i ce fel de succesor va fi
(stanq sau drept)
S8
face cu ajutorul unui pointer care va indica nodul curent care
S8
analizeaza. Nodul de la care se porneste este radacina arborelui. Cu ajutorul acestui pointer S8 avanseaza pe nivelurile arborelui prin succesorul stanq sau succesorul drept al nodului curent, In functie de rezultatul cornparatiei dintr e valoarea citita pentru cheie ~i valoarea cheii din nodul curent. Avansarea continua pana cand succesorul nodului curent la care a ajuns pointerul este arborele vid. Algoritmu l pentru crearea arborelui binar de cautare este :
PAS1 . Se irutia lizeaza arborele cu arborele vid, atribuind radacinii adresa NULL. PAS2. Se citeste informatia uti la, cu valoarea v pentru cheie. PAS3 Ca t tim p ex ista lnformatle utila exec uta PAS4. Se inltializeaza nodul eurent cu nodul radacina . PASS . ti ac a 'nodul curent nu este un arbore vid, atu nc i se trece la Pasul 9 . PAS6. Se creeaza un nod prin aloearea unei zone de memorie. PAS? Se atribuie, carnp ului eu informatie din nod , informatia citita . PAS8. Se atribuie , succe sorilor nodului, arborele vid. Se trece la Pasu l 11. PAS9 . Dac a v (cheia din informatie) , este mai mica dedit cheia nodului curent, at unc i nodul curent devine succesorul stanq si se revine la Pasu! 5 . PAS10. Daca v (che ia din inforrnatie) este rnai m are decal che ia nodului curent, atunc i nodul curent devine succesorul drept :?i se revi ne la Pasul 5; altle l , se afiseaza mesajul "Cnete existe deja" . PAS11. Se citeste informatia utila cu valoarea v pentru cheie . !mp lementarea subprogramului prin care se adauqa un nod la arb ore s-a facut recursiv. Observatie Daca se prelucreaza 0 multirne de valori numerics care nu sunt diferite i ntre ele, se poate folosi arborele binar de cautare, adauqand la structura nodului un camp i n care se nurnara frecventa de aparitie a numarului in sirul de valori (f r e c v) : struct n od {int n r, f r e c v; nod < e , +d ,' } ; in acest mod , este respectata conditia de che ie unica impusa de definitia arborelui binar de cautare . in nodurile lui fiind memorate numai valorile unice ale cheii. Programu l de creare a unu i arbore binar de cautare , in cele coua variante, este: Valoarea pentru chcie este unica Valoarea pentru cheie nu este unica
void c r e a r e (n od *&r, {i f
int n )
( r ! = NULL)
if ( n nr) creare(r ->s ,n) ; else if (n>r->nr) c r eare(r->d,n) ; else couts , n.) ; e lse if (n>r ->nr) creure( r - >d , n) ; else r - > f r e c v ++; else {r = new nod ; r->n r=n ; r - > f r e c v =l ; r->s=NULL ; r ->d~NULL ;
} )
void mai n () {int n ; r =NULL ; cout«" Nu:na r: ". cin» n;
317
l n form uticii wh ile (r. ! =O) ( c r e a r: e (r , r:. ) ; cout«" Numa r :
whi le (n !=O) {c r ea ze {r I n ; ; c out« " Nuna r : "; c i n » n ;}
...
...
}
It ;
c i n» n ; }
}
Observatie. inal1imea arborelui binar de cautare dep in de de ordi nea in ca re se introduc valo rile ch eil .
1. Pentru fiecare dintre arborii binari de cautare desena ti ta tema anterica ra, precizati in ce ordine au fast citite cheile, la crearea arborelui. 2. Desenati arborii binari de cautare care se creeaza atunc i cane introduceti pe ntru cheie, i n ordine, urrnatoarele valori:
-------- r-..
a . 3, 6, 2,7, 8,1 , 5,4 , 0; b. 7, 3, 1, 2, 8, 5, 4, 6, 0;
c.
1, 2, 3, 4, 5, 6, 7, 8, O.
Algoritmi pentru parcurgerea unui arbore binar de cautare Pentru parcurgerea arborilor binari de cautare arbore binar.
S8
folosesc algoritmii de parcurgere a unui
Obscrvatii 1. Prin parcurqerea arbore!ui cu al goritm ul SROcheile sunt afisate i n ordine crescatoa re 2. Prin parcurgerea arborelui eu algoritmul DRScheile sunt afisate in ordine dcscrcscatoare 3. Cheia cu vatoaroa maxima se gase;;te i n nodul eel mai din stanqa, iar cautarea sa se face parcurqand arbore le numa i pe leqatura cu succesoru l stanq, pom ind din radacina. 4. Cheia cu valoarca minima se gase~te i n nodul eel mai din dreapta, iar cautarea sa se face parcu rqanc arbore le numai pe leqatura cu succesorul drep t, pornind din radacina. Valoarea minima Valoarea maxima Implemen tare recu rs iva in t min (n o d * r ) i n t max ( nod * r ) {i f (r -> s ! =NUL L) {i f (r -> d' ~ NULLJ retu r n min (r- >s j ; return ma x(r ->d ) ; else r e t urn r - >nr ; } e l se r e tu r n r ->n r ; } v oid mai n () v oi d main () {
...
{
couti-ocend.l-oc't bti .n'i m :
in t min (nod * r )
{whi l e
( r ->s != NULL) r= ;:- >s ;
r eturn r - >nr ; } v oid main() (
" < x mi.n (r) ;
.. .
cout«endl« "r"':a x im: "d !) r =r->c : r eturn r - .: .o n r ; } v oi d main ()
. .. c Qu t «endl«"Mi n.im : "s , k) ;
t int
* ca u ~ a ( n o d
{while
i ~
el se r e r -od , r eturn r ; } vo i d ma i n ( ) t int k ;
' "
cout« "Che i a cautata : " ; c i n » k ; if (cnuta(r , k) ! ~NULL) oou cocv.s-a gasit " ; else c cutx-cvtcu s -a gasit " ; .. . }
.. .
c ou t-oc '< Ch e .i.a cautata : "; c i n» k ;
if (cauta{r ,k) !=NULL} cccccc vs - e gasit " ; else cou'coc '' Nu s -a gasit " ; . .. }
Algoritmi pentru actualizarea unui arbore bin ar de c a u t are in arborii binari de cautare se pot executa urrnatoarele operatii de actualizare: -j. inserarea unu i nod ; ~ sterqerea unni nod
~~ ~ ~
..
in urma acestor operatii de actualizare, arborele trebuie sa -si pastreze ca litatea de arbo re binar de ca utare.
Algo ritmul pentru inscrarea unui nod Cautarea pozit iei in care se insereaza nodul se face cu ajutorul unu i pointe r, care porneste din nodul radacina si care va indica nodu l curent care se ananzeaza. Point erul va avansa prin succesorul stanq sau succesorul drept al nod ului curent, i n fun ctie de rezu ltatul cornparatiei dintre valoar ea citita pentru chela care se insereaza si valoarea che ii din nodul curent. Avansarea continua pima cane se g ase~te un nod care contin e a cheie egal a cu cheia care se inser eaza (cazul in care nodul nu se poate insera, deoarece mai exista a cheie cu acee asi valoare in arbore) sau pima cand, i n nodul curent, succesorul pe care avan seaza pointerul este un arbore vid. Daca s-a ajuns la arborele vid, inseamn a ca valoarea chei i care se insereaza nu mai exista i n arbare - ~ i cheia se adau qa ca succ esor al nodului curent , drept sau stanq , in functie de valoarea cheii care se insereaza !?i de valoarea cheii din nodul curent. Variabila r este pointerul catre nodul care se insereaza. in varianta iterativa, variab ila c este pointeru l catre nodul curent, iar variabila logica x se foloseste pent ru a sti daca in arbore s-a gasit cheia care se insereaza (este initializata cu valoarea 1, presupunandu-se ca nu mai exista chela in arbore).
319
I n f ormat i ca
PAS1. Se citeste cheia k a nodului care S8 insereaza . PAS2 . Se lnitializea za pointerul r cu adresa radac inii. PAS3 . cat timp nu s-a ajuns la arbore vid si nu s-a gasit cheia care S8 insereaza executa: PAS4 . Dac a nodu l curent are cheia egala cu k , atunci se afisea za mesa jul "Cheia existe ", S8 atribuie lui x valoarea 0 si S8 trece la Pas ul 6. PASS. Dad ; nod ul curent are cheia mai mica decal k , at u nc i poin terul avanseaza la subarborele stanq : alttel , pointerul avanseaza la subarbo rele drept si S8 revine la Pasul 3. PAS6. Dac a nu s-a gasit In arbore cheia care S8 insereaza (xO), at unc i: PAS? Se creeaza un nod prin alocarea unei zone de memorie. PAS8 . Se atribuie , carnpului cu inforrnatie din nod, informatia care S8 insereaza . PAS9 . Se atribuie , succesori lor nodului , arborele vid. PAS10.Dac a nodul curent c are chei a mai mica decat k , at un c i nodul care S 8 insereaza este succesorul drept; altfel, nodul care S8 insereaza este succesorul stanq .
Valoarea pentru cheie este unica Valoarea pentru cheie nu este unica Implementare recursi va void i n s e ra r e (n o d *&r, i nt k) void inserarelnod * &r , i n t k) {if
(r'~NULL)
if (r'->nr==k) o ou t-c-C'Ch e La e x i s t a " < c e n d L:
e lse if ( r ->nr>k)
inserar e(r->s ,k) ; e lse inserare (r->d ,k) ; e l se { r = new nod ; r->nr=k ; r'->s~NULL ; r->d=NULL ; }} v o i d ma i n () {in t k , . . . cou't-oc''Che La care se msereaae : 11; c in» k; i n s e r a r e (r, k) ; . . . }
{if
( r!~NULL)
if (r ->nr ==k)r->frecv++ ; else if (r ->nr>k) inserare(r';">s ,k) ; e ls e inserare(I: - >d ,k) ;
e l s e {r ='n ew nod ; r,->nr= k ; r'->s~NULL ;
r~ > d~NULL;}}
vo i d ma i n( } {int k : cout« "Chei a care s e inserea za : cin» k; inserare(r , k) ; . . . }
11 .
Implementare it erativ a void Lnsc rcr-etnod e r , int k ) void i h s era r e (h o d * r,int k ) {int %=1; nod *c ; tin t x =l ; nod * c; while (r !=NULL && x ) while (r!=NULL && x ) i f ( r - >n r ="" k ) i f {r-'>nr="""k) {r - >f r e c v+ + ; x ~O ; } ( c o ut« " Ch e i a exista " « e n d l ; else x ~O ; ) if (x-c-n.r> k) {c = r ; r=r->s ; } else else {c =r; r =r - >d;) if (r:->nr>k) Lc e r , r =r'->s ; } if (x ) else {c = r ; r=r ->d; } { r ~new nod ; r->n r ~k ; if (x ) r ->s =NULL ; r->d= NUL L ; {r =new nod ; r->nr=k ; if (p->nr>k) c ->s=r; r->s =NULL ; r ->d ~ NULL ; else c-c-d-er r j j if (c->nr>k) c ->s=r ; void main () else c ~>d=r ; } } voi d main () t int k : ccccccvcne t e car-e se i n se r e aza: "; { i n t k ; . .. cin» k; mserare tr , k} ; . .. } cout«" Ch e i a care se .irrse.r'eaza : 11 . c in» k; inserare( r , k) ; ... }
320
Implementarea strncturilor de date
Algoritmul pentru sterqerea unui nod
La sterqerea unu i nod din arbore le binar pot sa apara trei cazu ri: 1. Nodul care se sterqo nu are fli , in nodul parinte , adresa lui este l nlocuita cu adresa arborelui vid - figura 81.
o
~
l;>tergere nod terminal k=1. P ->S= NULLi del ete ql ;
p---. 5
q,---. l'
' 7
l;>tergere nod terminat k=7. p ->d=NULL; de lete cr2 i
1
-q,
Fig. 81
Fig. 82 l;>tergere nod eu liu stang k=S. p ->s=p ->s ->s ; delete ql; 3. Nodul care se sterqe are doi fii . Se cauta, i n suba rborele drept al nodului care trebu ie sters, primul nod care nu are succesor cr ept. Acest nod are cea mai mare cheie din subarborele drept ~i . implicit. cea mai mare cheie din subarborii subordonati nodului care se sterqe. lnforrnatia utila din acest nod este copiata in nodul care trebuie sters , dupa care este sters nodul qasit ca nod cu un singu r fiu - succesorul stanq (cazul 2). Prin copierea informatiei din nodul cu chela cea mai mare , arborele i~ i pastreaza prop rietatea de arbore binar de cauta re - figura 83.
10
10
2 1
l;>tergere nod eu dol Iii: k-7. q-> i n f o = r - > in f o ; p - > s =p- > s - >d ; d e l ete r ' Fig. 83
3 PAS1 . Se cite ste chela k a nodului care se sterqe. PAS2. Se initializeaza pointerul r cu adre sa radacinii, PAS3 . Cat timp nu s-a sters nodul ~ i nu s-a ajuns la arborele vid exec uta : PAS4. Dad ; nodul eurent are cheia egala eu k , atun ei se trece la Pasul 5. pentru a se analiza ee tip de nod este; altfe l, se trece la Pasul 9. PASS . Dae ii nodul curent este nod term inal . atunei , i n nodul parinte , adresa lui este inlocuita cu arborele vid, S8 eliberea za zona de memorie ocupata de nodul curent - ~i se revine la Pasul 3. PAS6 . Dac a nodul curent are numai succe sor drept, atunc i, in nodul parinte , adresa lui este lnl c cuita cu adresa succesorului sau drept, se elibereaz a zona de memorie ocupa ta de nodul curent - si se revine la Pasul 3.
321
Informatica PAS?
Daca nodul curent are numai succesor stanq , atu nci , in nodul parinte. adresa lui este tnlocuita eu adresa sueeesorul ui sau stanq, se eltbereaza zona de memori e ocupata de nodul curent - si se revine la Pasul 3. PAsa. Se cauta, In subarborele drept al nodului curent, primul nod care nu are sueeesor drept, se copiaza inforrnatia utila din aeest nod in nodul eurent, se elibereaza zona de rnernorie ocupata de nodul gaslt - ~i se revine la Pasul 3. PAS9. Daca nodul curent are cheia mal mica decat k , atunc i se cauta nodul care trebu le sters in succesorul crept: alttel , se cauta nodul care trebuie sters In succesorul stanq. Se revlne la Pasul 3. PAS10 . Daca s-a ajuns la arborele vid, atunci se afiseaza mesajul "Cheie nu existe" , Observatie. Transmiterea adresei de la nodul curent (care se sterqe) la parintele sau, se face prin transmiterea prin referinta a parametrului eu adresa nodului. void s t e r qe._n o d( n od *&r, no d *&c ) / *58 ca uta in subarborele dr ept; &1 n odului c u ren t{ r ) p r i mu I. n od care nu are sucCe s o r d rept (cl ~/ {nod *Pi if
(c - > d ! ~NULL )
else
s t e r g e _ n o d J r, c - > d )i
t r -c-nr v c- on r.
lise ccpi a za .i.nf o r mat i a Ilg'as it i n n ociu Lccu r e n t
u ti li§.
di n
rrodu L
p~c - > s; delete c ; c =p ; } } /Is e $ t erge Dodu1 gas i t ca nod ca r e a r e numai s ucc es o r dr ept
void s t erge r e (no d *&r, irit k ) {nod 'kC ; if ( r! =NULL) if (r ..; >n r = =k) Iidacas "': ag a si t nodulc a r e t c e bu.L e s t e r s if (r"':>s=~NULL && r ->s"N'""NULL) I idaca est e nod t ermin a l (delete r ; r =NULL ; } else if { r~> s~ =;NULLr / / oe ca e s te nod ca re a re nlillla i 's ucce soz- drept {c=r- >d; delete r ; r = c ; } else i f (r -e-d NULL ) //daca. c s t c nod care a r e r usne f euccesor s tang { c ~ r - > s; de lete r ; r ~ c ; } else sterge n od(r r r -> s) ; I /daca a re ambii succes ori else I idacami s - ag a sitpodlllcare t .reb u i.e s t.e r s if (r->tu·d , k) i / /caut5. in s u c ce s c ru .I d rept else sterg e re( r ->s , K) ; IlcaU t a in succeso rul stang else cout«" Ch e i a n u ex ista" ; } void main () {int k ; ... cout«"Che i a c a r e se s t e r c e : "; cin» k; ster ger e( T , k} ; . . . } Complexitatea algoritmilor de prelucrare a arborilor binari de cautare Cautarea unei informatii identificata printr-o cheie eu valoarea k incepe de la nodul rad,"kina si se termina , in eel mai rau caz, intr-unul dintre nodurile term inale ale arborelui. Gasirea nodului presupune executarea operatiei de comparare dintre cheia eu valoarea k si cheia nodu!ui curent. Tirnpul mediu de executie al algoritmulu i se calculeaza la fel ca la algoritmul de cautare secventia la lntr-o structura liniara de n chei (reprezentate sub forma de vector sau lista lnlantuita), unde:
Tmclt -_ 11 _+1 .... 2
322
Im plcm enta r ca structurilor de date
In caz ul arborel ui binar de cauta re, dimensiunea datelor nu este n , ci nurnarul de niveluri ale arborelui de cautare (sau lnaltirnea lui). lnal\imea fiind cu 1 mai mica decat nurnarul de nive!u ri parcurse (S8 considera :;;i nivelu l radacinii), In cazul arborelui bina r de cautare: h+2 Tlll~d = -2-
Ordinul de complexitate al algoritmului este Oth) Rezulta ca timpul consumat pentru operatiile de prelucrare a arborilo r binari de cautare este direct proportional cu i nalfim ea arbore lui h . Propozitia 20
inal\imea unui arbore binar cu n noduri poate lua valori i nt re 1092(n)-1 ~i n-1. Demcnstratle. Notam cu h Inaltimea arbcrelui binar cu n noduri. Arbor ele binar are cea mai mare tna'time (h_ m a x ) atunei cand este degenerat (nodurile sunt distribuite cate unul pe fiecare nive! cu exceptia nodului terminal, ordinul fiecarui nod este 1). Rezulta ca h_max =n-1 ~i hs n-t Arborele binar are cea mai mica Inaltime (h_ min) atunc i cand este comp let (toate noduri le termin ate se qasesc pe acelasi nivel-:- ~ i ordinul fiecarui nod, cu exceptia nodurilor term inale, este 2). In acest caz, pe fiecare nivel i vor fi t noduri, iar nurnaru ! n de noduri va f ega! cu Z h_ mm +1_ 1. Rezulta ca n+1 =
2h_mio+l . i h_m in+1 = lo g2(n+1). Din ultima eqalitate rezulta ca h ~ 1092(n)-1 .
Eficienta algoritmului de prelucrare a arborilor binari depinde de modul in care a fost creat arborele. Daca el are Inaltirnea maxima (arborele binar degenerat, in care fiecare nod nu are decat un succesor), ordinul de complexitate al algoritmului va fi O(n) si este egal cu cel al algoritmului de cautare secventia'a intr-o structura de date liniara. Daca el are Inaltim ea minima (arborele complet sau aproape complet), ordinul de complexitate al algoritmului va fi 0(1092n).
2.
3. 4. 5.
6.
1. Cornparati, din punct de vedere al eficientei, algoritmii recursivi si iterativi pentru determinarea minimului, respectiv a maximului, intr-un arbore binar de cautare. Care dintre variante este mai eflcienta? Pentru arbo rele binar A '4 din figura 79, cate operatii de deplasare in structura de date se executa pentru a determina minimul? Daca valorile din arbore ar fi fost memorate intr-o structura liniara, cate operatii de deplasare s-ar fi executat pentru a determina minimul? Care dintre structurile de date este mai eficienta? Scrieti 0 functie care sa creeze un arbore binar de cautare perfect echilibrat. Scrieti 0 functie care sa verifice daca un arbore binar este un arbore binar de cautare. In nodurile unui arbore binar sunt memorate numaratorul si numitoru l unor fractii distincte. Sa se simplifice fractiile din arbore, iar daca in urma sirnplifica rii rezulta un nurnar int reg, sa se elimine din arbore. in nodurile unui arbore binar sunt memorate numere intregi . Se citeste de la tastatura un numar intreg x. Sa se caute in arbore nodul cheia x si daca se qaseste , sa se afiseze fratele sau - precizandu -se daca este fratele stanq sau fratele drept. Sa se afiseze un mesa] de informare daca nu se gase$te cheia x in arbore sau daca nodul nu are Frate.
2.8.5,3. Aplicatii practice 1. Un text contine cuvinte care se pot repeta. Textul este memorat intr-un fisler text. Scrieti un program care sa citeasca textul din fisier ~i care sa afiseze cuvinte le din text, ordonate alfabetic , ~ i frecventa lor de aparitie in text. 2. Realizati 0 agenda de telefon cu ajutorul unui arbore binar de cautare. in fiecare nod se vor pastra urrnatoarele inforrnatii; numele $i prenumele persoanei, nurnarul (numerele de telefon) si adresa de e-mail. Scrieti un program care sa permits adauqa rea de noi persoane in agenda , eliminarea unor persoane si cautarea unei persoane pentru a afla numarul de telefon si adresa de e-mail,
323
Inform a tica
2.8.6. Ansamblul Heap 2.8.6.1. Definitia ansamblului Heap Se numeste ansamblu Heap un arbors bi nar care indeplineste urrnatoarote conditl i: (1) es te un arbore aproape complet; (2) i n orice pe reche de nod uri tata-fiu cheil e sunt intr-o relatie de ordine prestabilita . Exemplu . i n figura 84 este prezent at ansamblul Hea p A 15 i n nodurile caruia sunt me morate numere natura le, relatia de ordine fiind : daca in nodu l tata este un nurnar impar, in nodul fiu nu poate fi decat tot un nurna r impar Numerele sense in exteriorul nodurilor, reprezlnta indici pentru numerotarea nodurilor.
:J.;>'
Ats
"'j' jii'
7
Fig, 84 Terminologie: -7 An samblul Hea p se mai nurneste si arbore de selectie sau arbore partial ordona!. -7 Un ansamb lu Heap maxim est e un ansamb lu Heap in care chela parintelui este ma i mare sau egala cu cheia fiului (arborel e binar A 16 din figura 85) . -7 Un ansamblu Heap minim este un ansambl u Heap In care chela parinte lui este mai mica sau eqala cu cheia fiului (arborele binar A 17 din figura 86). 5 Fig. 85 Caracteristici:
-7 i ntr-un ansamblu Heap cu n noduri, lna ltirnea arborelui h este egala cu [log2n]-1 . -7 i ntr-un ansamblu Heap (de exemplu , l nlr-un ansamblu
2
Heap minim sau Heap maxi m) pot exista chei cu aceeasl valoare. 5 7 intr-un ansamblu Heap min im cheia din orice nod este 1 mai mica sau eqala cu chei le tuturor nodurilor din eei doi subarbori ai ~a ': iar i n nodul radacina se gase'?te cheia (18: Fig. 86 cea mal mica din arbore . -7 lntr-un ansamblu Heap maxim cheia din orice nod este mai mare sau ega la cu cheile tuturor nodurilor din eel doi suba rbori a! sal, iar in nodul radacina se gase ~t e cheia cea mai mare din arbore .
-7 Un ansamblu Heap poate fi folosil pentru a implement a 0 coada de prioritati (de aici ii vine ~i de numire a de arbore de selocti e). deoarece - prin extrag erea cheilor prin nodul radac ina - se extrag datele i n conformitate cu relatia de ordine prestabilita . Pentru ans amblul Heap A15 din figura 85 , ordinea de extragere a datelor esle : mai l ntai num erele pare 'Ii apoi numerel e impare . in ansambl ul Heap A t 6 din figura 86 extragerea nodurilor se face in ordi nea descrescatoare a etiche telor, iar in ansam blul Heap A 17 din figura 86 extragerea nodurilor se face In ordinea crescatoa re a etichetelor. Proprictate : Ansamblul Heap are 0 proprietate foa rte irnportanta (pe care 0 rnosteneste de la arb orii binari cornp leti): daca nodurile arbore lui se numeroteaza cu indici, in ordinea parcurgerii In la\ime (ca In figura 84), intre indicii parintelui, al subarborelui stang 'Ii al subarb orelui drept - exista urrnatoare le relatii:
-7 Parintele nodu lui cu indicele i are indicele [~] .
Ats
Au
324
Implcmcnta rca st ru ct ur ilor dc datc -7 Fiul stanq al parln telui cu indicele i are indicele 2xi. -7 Fiul drept al parinte lui cu indicele 1are indice le 2x i+ I .
Aceasta proprietate a arbor ilor cornp leti si aproape cornplet i ne perm ite sa irnplementam static ansamblul Heap , cu ajutorul unui vector v. -7 Radaclna arborelui are eticheta v [1]. -7 Fiul stanq al nodulu i cu eticheta v[i] este nodul cu eticheta v[2 'i] . -7 Fiul drept al nodu lui cu eticheta v [i] este nodul cu eticheta v[2 'i+1] vectorul
Ind ic e A 16
v pentru
An A"
1 2 2 25
2 10
3 20
3
4
5
6
7
18 5 18
20 10 11
3 9
5 15 9
9 11 10
15
8 11 18 5
9 15 20
3
10 25 25 2
Observatii :
1. i ntr-un vector care implementeaza un ansamblu Heap Maxim : v[iJ2v[2 xi] si V[i]2V[2xi+1J pent ru \t i E{1, 2, 3, " ' , [n/2]} si daca 2xi ~n , respecliv 2xi+ 1 ~n . 2, intr-un vecto r care impleme nteaza un ansamb lu Heap Minim : v[i J~v[2xi ] "i v[iJ $v[2x i+1J pentru \t iE {1, 2,3 , "' , [n/2]} " i daca 2xi~n, respect iv 2xi+1$n. Invers, un vector v - poate fi reprezentat ca un arbore binar aproape comple!. Pentru un Indice i E{1, 2, 3, " ', [n/2]}:
I V [ill
Fig. 87 poate construi un subansamblu Heap care este format numai ~[ iJ din nodul parinte v[iJ (figura 87); -7 daca 2x i=n , S8 poate construi un subansa mblu Heap care este format din nodul parinte vIii " i fiul stanq v[2xiJ (figura 88); V [21 -7 daca 2xid - >d >- > i n f o; b. c. p = r -> s ->d ; cout« p- >d - > i n f o; d.
cout« r - >s - >s >- >i n r o ; p =r ->s->d ; c o u t «p->info ;
31.Daca se executa instructiunea: p =r - >s ->d ->d ; pointe rul p va indica che ia: a. 21 b. 20 c. 18 d . 25 sz .u rmatoarea secventa de instructiuni : per -c-d -c-d , p""V-> s; q'"'"new nod ; q ->info=5 ; q ->s""'NULI. ;
realizeaza : a. adauqa b. adauqa c. adauqa d. adauqa
nodul nodul nodul nodul
cu cu cu cu
cheia cheia cheia cheia
5 ca 5 ca 5 ca 5 ca
q ->s=NULL ; p - >s:=:q ;
succesor stanq al nodului cu cheia 30; succeso r drept al nodului cu chela 30; succesor stanq al nodului cu cheia 19; succesor crept al nodului cu cheia 19;
33.Urrnatoarea secventa de instructiuni: for {p= r ; p - >s !=NULL i P=P- >S) ; q~n ew nod ; q-> i nfo=20 ; q->s =NULL; q->s o=NULL; p->s=q ; realizeaz a: a. adauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 25; b. adauqa nodul cu cheia 20 ca succesor drept al nodului cu cheia 25; c. acauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 21; d . adauqa nodul cu cheia 20 ca succesor drept al nodului cu che ia 21; 34.Urmatoarea secventa de instructiuni : for
(p~ L; p ->d- >j! ~NULL ;p=p->j) ;
realizeaza: a. elimina nodul cu cheia 21; c. elirnina nodul cu cheia 25;
q - p -od . p - >d 'NULL;
dispose q ;
b. elimina nodul cu chela 18; d.
elirnina nodu l cu cheia 30;
Miniproiecte: 1. Pentru evidenta elevilor din clasa, se pastreaza urrnatoarele inforrnatii: nurnarul de ordine din catalog. numele si prenumele, mediile semestriale ~i media anuala la disciplina informatica. Reallzati a aplicatie care sa asigure urmatoarele functii: a. adauqarea unui nou elev;
Informatica
333
b. elirninare a unui elev; c. modificarea mediei unui elev: d. afisarea elevi lor eu med iile (semestriale, respectiv anuale), in ordinea descrescatoare a rnediilor ,
e. afisarea elevilor eu mediile (semestriale, respectiv anuale) cuprinse intre doua valori care se citesc de la tastatura . 2. lntr-o biblioteca, pentru fiecare carte se pastreaza urmatoarele lntormatii: codu l cartli, titlul, autorul, numarul total de exemplare ,i nurnarul de exemplare disponibi le la un moment dat. Realiza~i a aplicatie care sa asigure urmatoarele functii: a. reqasirea unei carti, du pa autor, pentru a afisa nurnarul de exemplare disponibile; b. adauqare a unui nou titlu: c. ad auqa rea de noi exemplare, pentru titlurile existente; d. modificarea nurnarului total de exemplare (In cazul distrugerii unora dintre ele): e. modificarea nurnarului de exemplare disponibile, in cazul in care 0 carte este imprumu tata sau tnapoiata: t. afisarea cartilor pentru care nu mai exists exemplars disponibile; g. afisarea In ordine afabetica a autorilor.
3. Pentru fi ecare articol dintr-o magazie, S8 pastreaza urmatoarele informafii: codul articolului (este unic pentru fiecare articol), denumirea articclului, unitatea de rnasura si cantitatea din stoc. Realizati a aplicatie pentru gestianarea magaziei - care sa asigure urrnatoarele fu nctii: a. adauqarea unui nou articol; b. sterqerea unui articol; c. introducerea de la tasta tura a can titatii intrate, dintr-un articol precizat prin cod , ~ i actualizarea stocului; d. introducerea de la tastura a cantitatii iesite, dintr-un articol preeizat prin cod , si cu aetualizarea stoeului; e. afisarea articolelor care au stoeul pe 0; f. afisarea stocului unui articol al carui cod se introduce de la tastatura ; g. afisarea . In ordinea codurilor, a stoeurilor din fieeare artico l.
Cup rins I. Tchnici de proprnnuu-c ••....•. ... ... .... ...... ... .............••.......•................. ..•..••....••....••. 3 1.1. Analiza algoritmilor 3 1.2. Metode de construire a algoritmilor 5 .. 6 1.3. Metoda backtracking .. 1.3.1. Descrierea metodei backtracking 6 1.3.2. Implementarea metode i backt racking 10 .. 14 1.3.3. Probleme rezolvabile prin metoda backt racking. 1.3.3.1. Generarea perrnuta rilor . .. 15 1.3.3.2. Generarea produsu lui cartezian 17 1.3.3.3. Generarea ara njamente lor .. 20 1.3.3.4. Generarea combinarilor .. 22 1.3.3.5. Ge nera rea tuturor partitiilor unui nurnar natura l 24 1.3.3.6. Generarea tuturo r partitillor une i rnultirni 27 1.3.3.7 . Generarea tuturo r functiilor surject ive 28 .. 30 1.3.3.8. Problema celor n dame . 1.3.3 .9. Pa rcurgerea tablei de sah cu un cal., . 31 1.3.3.10. Generarea tuturo r posibilitatior de iesire din labirint .. 34 .4 0 1.4. Metoda " Divide ot Impera" 1.4.1 . Descrierea metode i "Divide et Impera" .4 0 1.4.2. Implementarea metode i "Divide et Impe ra".. .. .. 41 .. .4 8 1.4.3. Cautarea binara , 1.4.4. Sortarea rapida (QuickSort) .. 50 1.4.5. Sortarea prin interclasare (MergeSort) . .. 53 1.4.6. Prob lema turnurilor din Hano i 54 1.4.7. Generarea mode le!or fracta le 56 1.5. Metoda greedy 59 1.5.1. Desc rierea metode i greedy .. . 59 1.5.2. Implementarea metode i greedy. . 61 1.6. Metoda proqramarii dinamice . . 70 1.6.1. Descrierea metodei proqrarna rii dinamice 70 1.6.2. Impleme ntarea metodei proqrarnarii dinamice ..73 1.7. Compararea metodclor de construire a algoritmilor 83 Evaluare .. 85 2 . Irnplcmcntarca structurilor de dale 90 2.1. Tipuri de date specifice pentru adrcsarea memoriei 90 2.2. Tipul de data pointer 91 2.2.1. Declarararea va ribilelei de tip point er 92 .. 92 2.2.2 . Constante de tip adresa ., 2.2.3. Ope rator i pentru variabile de tp pointe r 94 2.2.3 .1. Operatorii specifici.. . 94 2.2.3 .2. Ope ratorul de atribuire 97 2.2.3 .3. Operatorii aritmetici 100 2.2.3.4. Operatorii relation ali .. 101 2.3. Tipul de data referinta 102 2.4 . Alocarea dinamica a memorici 106 2.5 . Clasificarca structurilor de date 109 2.6. Lista liniara 113 .. 115 2.6.1. Implem entarea dina rnica a listelor in limba jul C++ . 2.62 . Clasificarea listelor 117 2.6.3. Algoritmi pentru prelucrarea liste!or simplu i nlantuite 118 2.6 .3.1. lnitia lizarea listei 118 2.6.3.2. Crearea liste i 118
2.6.3.3. Adauqarea primului nod la lista . . 118 2.6.3.4. Adauq area unui nod la tista 119 2.6.3.5. Parcurgerea listei . 121 121 2.6.3.6. Cautarea unui nod in lista 2.6.3.7. Eliminarea unui nod din lista 122 2 6.3.8. Eliberarea spatiutul de memo rie ocupat de lista 123 2.6.3.9. Liste ordonate 124 2.6.3.10. Preluc rarea listelor simplu Inlantuite .. 127 2 6.4. Algoritmi pentru prelucra rea listelor circula re simplu lnlantuite. . 137 2 .6A .1. Crearea listei ... 137 2.6A .2 . Parcurgerea listei .. . 138 2.6A .3. Elimi narea unui nod din lista 138 2.6.5. Algor itmi pentru prelucrarea listelor dublu lnlantuite 140 2.6.5.1. Adauqarea primului nod la lista 140 2.6.5.2. Adauq area unui nod la Iista ....... . 140 2.6.5.3. Parcurgerea listei 141 2 .6 .5A . Eliminarea unui nod din lista 14 1 2.6.6. Algoritmi pentru prelucrarea stivelor 145 2.6.6.1. lnitializarea stivei ... 145 2.6.6 2. Adauqarea unui nod la stiva ., .. 146 2.6.6 .3. Extragerea unui nod din stiva .. . ... 146 2.6 .6A . Prelucra rea stivei .... .... .. 146 2.6.7. Algoritmi pen tru prelucrare a cozilor 148 2.6.7.1. lnitiafizarea cozii 149 2.6.7.2 . Adauqarea unui nod la coaca 149 2.6.7.3. Extragerea unui nod din cc ada . 149 2 .6 .7 A . Prelucrarea cozii 149 2.6.8. Aplicatli practice 151 Evalu ar e .. 152 2.7. Graful 159 2.7.1. Defin itia matematica a grafului .. . 159 2.7.2. Graful neorientat .. 160 2.7. 2.1. Terminologie .... . 160 2.7.2.2. Gradul unui nod al grafului neorientat 162 2.7.2.3. $ irul grafic 164 2.7.3. Graful orient at 165 2.7.3.1. Termi nologie .. 165 2.7.3.2. Grade le unui nod al grafului orientat .. 167 2.7A . Reprezentarea si implementarea grafu lui 169 2 .7 A .1 . Reprezentarea prin matricea de adiacenta . 169 2.7 A .2 . Rep rezentarea prin matricea de incidenta . .. 175 2.7 A. 3. Reprezentarea prin lista muchiilor (arcelor) . . . 182 2.7 AA . Reprezentarea prin lista de adiacenta (Iistele vecini lor) 187 2.7 A .5. Aplicatii practice . .. 197 2.7.5. Gra furi spec iale. .. 20 1 2.7.5.1. Graful nuL 20 1 2.7 .5.2. Graful comple!.. ........ . 20 1 2.7.6. Grafu ri derivat e dintr-u n graf 203 2.7.6 .1. Graful parjial........... . 203 2.7.6.2. Subgraful 207 2.7.6.3. Graful complementar 211 2 .7 A .4 . Ap licatii practice .' 212
...
eV-((Vll. 2.7.7. Conexi tatea grafurilor. 2.7 .7.1. Lantu l . 2.7.7.2. Ciclul ........ 2.7.7.3 . Drumu!.... 2.7.7.4. Circuitu l . 2.7.7.5 Graful conex ...... . 2.7.7.6. Graful tare conex 2.7.4 .7. Aplicatii practice . 2.7.8. Parcurgerea grafului 2.7.8.1. Parcurgerea in latirne - Breadth First 2.7.8.2. Parcurgere a in adanc ime - Depth First 2.7.8 .3. Aplica\ii practice . 2.7.9. Gra ful pond erat.. .. .. . 2.7.9.1. Definitia grafului pon derat .. 2.7.9.2. Matricea costurilor .. . 2.7.9.3. Algo ritmi pentru determinarea costulu i minim (maxim) 2.7.9.4. Aplicatii practice 2.7.10. Grafuri spectate 2.7 .10.1. Grafu l bipartit 2.7 .10.2. Graful hamiltonian 2.7.10.3. Graful eulerian. .... . 2.7.10.4. Graful turneu 2.7.10.5. Apticati i practice Evaluare . 2.8. Arborele 2.8.1. Arborele liber . 2.8.1.1. Definitia arbore lui liber . 2.8.1.2. Proprietatile arbori lor liberi . 2.8.2. Arbo rele partial . 2.8.2 .1. Deli ni;ia arborelui partial, 2.8.2 .2. Defi nitia arbore lui partial de cost minim 2.8.2.3. Algoritmi de determinare a arbore lui partial de cost minim 2.8.2.4. Aplicatii pract ice 2.8.3. Arborele cu radacina .................................. . 2.8.3.1. Defin itia arborelui cu radacina 2.8.3.2. Impleme ntarea arborelui cu radacin a 2.8.3.3. Algorit mi pent ru parcurgere a unui arbore cu radacina 2.8.3.4. Aplicatii practice 2.8.4. Arborel e binar . 2.8.4.1. Defin itia arborelu i binar 2.8.4 .2. Implementarea arborelui binar 2.8.4.3. Algoritmi pentru parcurgerea unui arbore binar 2.8.4.4 . Aplicatii practice 2.8.5. Arbo rele binar de cautare . 2.8.5. 1. Definit ia arbor elui binar de cautare . 2.8.5.2. Algoritmi pentru prelucrarea unui arbore binar de cauta re 2.8.5.3. Aplicatii practice . 2.86. Ansa mblul Heap ................................................ . 2.8.6.1. Definitia ansambului Heap . 2.86 .2. Algoritmi pentru prelucrarea unui ansamblu Heap 2.8 .6.3. Algori tmul HeapSort 2.8.5.4. Aplicatii practice Evalu are
213 213 ..21 8 ..220 . 223 225 228 235 235 236 240 246 246 . 246 247 249 255 256 256 . 260 263 268 . 27 1 272 281 281 28 1 28 1 . 283 ...283 283 285 292 292 292 297 299 304 305 305 305 312 315 315 315 315 322 323 323 324 327 329 . 329
I: - 19S1 - 01: - 1: £6 ' 8£6 NaSI 6 - 19S1 - or - 1:£6 NaSI
-:»
"
-, 0,
·'