Documente Academic
Documente Profesional
Documente Cultură
Structuri de Date in C
Structuri de Date in C
N, unde lg
creste
e"trem de incet: lg
N 9 pentru orice N /
955@9
. $eoarece
numarul atomilor universului observabil este estimat la apro"imativ (*
7*
, ceea ce este mult mai
putin decat /
955@9
, vom intalni foarte rar o valoare a lui N pentru care lg
N ? 9.
$e acum incolo, atunci cand vom aplica procedurile find@ si merge@ asupra unor multimi
disjuncte de elemente, vom spune ca folosim o structura de multimi dis)uncte.
O importanta aplicatie practica a structurilor de multimi disjuncte este verificarea eficienta a
cone"itatii unui graf (<"ercitiul @.(/).
3.( )*ercitii
3.1 crieti algoritmii de inserare si de stergere a unui nod pentru o stiva implementata prin
tehnica tablourilor paralele.
3 .2 -ie % un graf neorientat cu n varfuri, n /. $emonstrati echivalenta urmatoarelor
propozitii care caracterizeaza un arbore:
i+ % este cone" si aciclic.
ii+ % este aciclic si are n-( muchii.
iii+ % este cone" si are n-( muchii.
iv+ % este aciclic si, adaugandu-se o singura muchie intre oricare doua varfuri neadiacente, se
creaza e"act un ciclu.
v+ % este cone" si, daca se suprima o muchie oarecare, nu mai este cone".
vi+ Oricare doua varfuri din % sunt unite printr-un drum unic.
3.3 <laborati si implementati un algoritm de evaluare a e"presiilor aritmetice postfi"ate.
3." $e ce procedura percolate este mai eficienta daca admitem ca un varf neterminal poate
avea mai mult de doi fiiH
3.& -ie *&( .. (/' un tablou, astfel incat *&i' , i, pentru i > (/. $eterminati starea tabloului
dupa fiecare din urmatoarele apeluri de procedura, aplicate succesiv:
make$heap(*); alter$heap(*, (/, (*); alter$heap(*, (, 9); alter$heap(*, 5, 9)
3.( Implementati un model de simulare a unei liste dinamice de prioritati folosind structura
de heap.
3.+ In situatia in care, consultarea sau modificarea unui element din tablou conteaza ca o
operatie elementara, demonstrati ca timpul de e"ecutie necesar pentru o secventa de n operatii
find( si merge(, pornind din starea initiala si pentru cazul cel mai nefavorabil, este in ordinul lui
n
/
. $emonstrati aceeasi proprietate pentru find/ si merge/.
Solutie, find( necesita un timp constant si cel mai nefavorabil caz il reprezinta secventa:
merge((N, N-(); find((N)
merge((N-(, N-/); find((N)
D
merge((N-n4(, N-n); find((N)
In aceasta secventa, merge((N-i4(, N-i) necesita un timp in ordinul lui i. Eimpul total este in
ordinul lui (4/4D4n , n(n4()!/, deci in ordinul lui n
/
. imetric, merge/ necesita un timp
constant si cel mai nefavorabil caz il reprezinta secventa:
merge/(N, N-(); find/(N)
merge/(N-(, N-/); find/(N),
D
merge/(N-n4(, N-n); find/(N)
in care find/(i) necesita un timp in ordinul lui i etc.
3.- $e ce am presupus in procedura merge@ ca a bH
3.. $emonstrati prin inductie ca, folosind regula de ponderare (procedura merge@), un arbore
cu k varfuri va avea dupa un numar arbitrar de fuzionari si pornind de la starea initiala, inaltimea
ma"ima lg k.
Solutie, Proprietatea este adevarata pentru k , (. Presupunem ca proprietatea este adevarata
pentru i k-( si demonstram ca este adevarata si pentru k.
-ie * arborele (cu k varfuri si de inaltime h) rezultat din aplicarea procedurii merge@ asupra
arborilor *
(
(cu m varfuri si de inaltime h
(
) si *
/
(cu k-m varfuri si de inaltime h
/
). e observa ca
cel putin unul din arborii *
(
si *
/
are cel mult k!/ varfuri, deoarece este imposibil sa avem
m ? k!/ si k-m ? k!/. Presupunand ca *
(
are cel mult k!/ varfuri, avem doua posibilitati:
i+ h
(
h
/
h lg (k-m) lg k
ii+ h
(
, h
/
h , h
(
4( lg m4( lg (k!/)4( , lg k
3.1/ $emonstrati ca o serie de n operatii find/ si merge@ necesita, pentru cazul cel mai
nefavorabil si pornind de la starea initiala, un timp in ordinul lui n log n.
Indicatie, Eineti cont de <"ercitiul @.6 si aratati ca timpul este in ordinul lui n lg n. #ratati apoi
ca baza logaritmului poate fi oarecare, ordinul timpului fiind n log n.
3.11 In locul regulii de ponderare, putem adopta urmatoarea tactica de fuzionare: radacina
arborelui cu mai putine varfuri devine fiu al radacinii celuilalt arbore. +omprimarea drumului nu
modifica numarul de varfuri intr-un arbore, astfel incat este usor sa memoram aceasta valoare in
mod e"act (in cazul folosirii regulii de ponderare, dupa comprimarea drumului, nu se pastreaza
inaltimea e"acta a unui arbore).
crieti o procedura merge8 care urmeaza aceasta tactica si demonstrati un rezultat corespunzator
<"ercitiului @.6.
3 .12 Iasiti un algoritm pentru a determina daca un graf neorientat este cone". -olositi o
structura de multimi disjuncte.
Indicatie, Presupunem ca graful este reprezentat printr-o lista de muchii. +onsideram initial ca
fiecare varf formeaza o submultime (in acest caz, o componenta cone"a a grafului). $upa fiecare
citire a unei muchii 0a, b1 operam fuzionarea merge@(find@(a), find@(b)), obtinand astfel o noua
componenta cone"a. Procedeul se repeta, pana cand terminam de citit toate muchiile grafului.
Iraful este cone", daca si numai daca tabloul set devine constant. #nalizati eficienta
algoritmului.
In general, prin acest algoritm obtinem o partitionare a varfurilor grafului in submultimi doua
cate doua disjuncte, fiecare submultime continand e"act varfurile cate unei componente cone"e a
grafului.
3.13 Intr-o structura de multimi disjuncte, un element ! este canonic, daca nu are tata. In
procedurile find@ si merge@ observam urmatoarele:
i+ $aca ! este un element canonic, atunci informatia din set&!' este folosita doar pentru a
preciza ca ! este canonic.
ii+ $aca elementul ! nu este canonic, atunci informatia din -&!' nu este folosita.
Einand cont de i+ si ii+, modificati procedurile find@ si merge@ astfel incat, in locul tablourilor set
si -, sa folositi un singur tablou de N elemente.
Indicatie, =tilizati in noul tablou si valori negative.