Beruflich Dokumente
Kultur Dokumente
Structuri de Date
şi
Tehnici de Programare
c
Cuprins
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Cuprins
c
ccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccc
Structuri de date si tehnici de programare c
Cuprins
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Unitatea de învăţare Nr. 8
METODA DIVIDE ET IMPERA
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccc
c
Structuri de date si tehnici de programare c
Prezentarea modulului
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
PREZENTAREA MODULULUI
c
ccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccc
Structuri de date si tehnici de pro gramare c
1¦ Arbori binari
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Cuprins
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccc
c
Structuri de date si tehnici de programare c
1¦ Arbori binari
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Daca ambii subarbori binari ai radacinii sunt nevizi,radacinile lor se
mai numesc Ñradacinii,iar cei doi fii se numesc Ñ {¦
Arborii binari se pot reprezenta in felul urmator : fiecare nod este
reprezentat printr-un camp INFO care contine informatia memorata in acel
nod,precum si prin doua alte campuri LLINK si RLIN K,care contin pointeri
catre adresele radacinilor subarborilor stang,respectiv drept (L de la left si
R de la right)¦Daca unul dintre acestia este vid, campul de legatura
respectiv va fi reprezentat prin { {¦
Un arbore binar se numeste
daca fiecare nod are zero sau doi
fii ; nodurile cu zero fii se numesc Ñ
sau {¦
x
G ´
´
!"
#
´ $
%
&
c
ccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccc
Structuri de date si tehnici de programare c
1¦ Arbori binari
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
½
' ' ( "
#
) !"
#
c
Daca se face vizitarea nodului NOD(×) la pasul ,inainte de
depunerea valorii lui × in stiva,se obtine un algoritm pentru vizitarea
arborelui in ordinea RSD¦
Deoarece in reprezentarea cu legaturi LLIN K si RLINK a unui
arbore binar multe campuri sunt { {,adica nu contin nicio informatie
utila,se poate utiliza o reprezentare insailata a arborelui¦Daca insailarea se
face relativ la ordinea simetrica,atunci daca LLINK(×)={ { ea se va
inlocui cu adresa predecesorului nodului NOD(×) relativa la ordinea
simetrica,iar daca RLINK(×)= { {,atunci vom defini RLINK(×) ca fiind
egal cu adresa succesorului nodului NOD(×) relativ la aceeasi
ordine¦Pentru a distinge legaturile de insailare de cele obisnuite vom folosi
un camp de un singur bit in fiecare nod,care va avea valoarea TAG( ×)=1
daca legatura este obisnuita si TAG(×)=0 daca legatura a fost creata prin
insailare¦
Sa mai observam ca este necesara prezenta unui nou nod care sa
joace rolul unui nod cap de l ista si la care sa mearga lagatura de insailare
stanga a primului nod,respectiv legatura de insailare dreapta a ultimului
nod al arborelui in ordinea simetrica¦Radacina arborelui poata fi gasita in
campul LLINK al acestui nod,a carui adresa trebuie memorata printr-un
pointer ¦
In felul acesta unele operatii asupra arborelui pot fi simplificate,de
exemplu gasirea succesorului simetric al lui NOD(×) intr-un astfel de
arbore,care poate fi gasit facand o parcurgere partiala a unui drum din
arbore,fara a mai folosi o stiva auxiliara¦
c
Algoritmul lui Huffman construieste un arbore optim plecandu-se
cu o multime formata din frunze , carora li se asociaza
ponderile pentru 1 si cu o multime de noduri interne ;
este initial multimea vida¦Variabila ,initial egala cu 0 este un contor care
numara nodurile interne construite pana in acel moment¦
Algoritmul se scrie astfel :
Ú x
' *x * +
$
*x *
´ ,x$
*x * +
öntrebare: 9{
{{ {
Ñ{{
ÑÑ{?
c
c
ccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccc
Structuri de date si tehnici de programare c
1¦ Arbori binari
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccc
c
Structuri de date si tehnici de programare c
1¦ Arbori binari
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
- însoţiţi programul de o documentaţie privind problema tratată,
c
modul de introducere a datelor şi aspecte deosebite folosite la
elaborarea programelor¦
¯
/ { 0 Ñ/- 12{ Ñ { {
"
1.6. Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccc
c
Structuri de date si tehnici de programare c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------
c
Cuprins
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccc
Structuri de date si tehnici de programare
c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------c
c
acestora¦IBM a estimat ca in jur de 5% din timpul total de calcul se
consuma cu operatii de sortare in aplicatiile comerciale ale calculatoarelor¦
In multe cazuri nu se doreste rearanjarea fizica a inregistrarilor in
memorie astfel incat cheile lor sa fie in ordine,ci numai existenta unui tabel
auxiliar care sa specifice ordinea inregistrarilor¦ Astfel pozitia a tabelului
indica adresa inregistrarii 3 dupa sortare;aceasta metoda se numeste
{ { {
¦
O alta varianta este
{ {
¦Se pastreaza inregistrarile sub
forma unei liste simplu inlantuite cu nod cap de lista¦Campul de legatura al
acestuia indica inregistrarea cu cheia cea mai mica,de care se inlantuie
toate celelalte inregistrari,in ordinea crescatoare a cheilor ; ultimul camp
de legatura este { {,care indica sfarsitul listei¦
In ceea ce urmeaza vom considera numai sortarea interna,care se
desfasoara numai in unitatea centrala a calculatorului ; pentru acest tip de
sortare criteriul de performanta va fi minimizarea numarului de comparatii
de chei necesare in procesul de sortare¦In cazul sortarii externe,cand
inregistrarile sunt asa de numeroase incat nu incap in me moria
interna,strategia de sortare este alcatuirea de siruri sortate cat mai lungi in
memoria interna,apoi depunerea ace stora pe memorii externe si in final
sortarea acestora prin interclasare¦Deoarece timpul de acces la memoria
externa este de sute de ori mai mare decat timpul necesitat de operatiile
din memoria interna,criteriul de eficienta in acest caz este minimizarea
numarului de citiri si scrieri de pe /in memoria externa,nu numarul de
comparatii de chei din memoria interna¦
Exista mai multe clase de algoritmi de sortare : prin { { ,prin
(
{ si {),prin
+ { (metoda si
{ { { {),
{ { {
{,
{ { {
{
{
etc¦
Sa mai amintim ca sortarea a avut un rol important in evolutia
calculatoarelor,datorita importantei practice a manipularii unor volume mari
de date,cum sunt cele rezultate de exemplu din recensamintele populatiei :
primele masini de prelucrarea automata a datelor,primele memorii
tampon,primii algoritmi folositi la prelucrarea datelor,primele studii privind
complexitatea algoritmilor au fost legate de algoritmii de sortare¦
c
c
c
Algoritmul sortarii de ansamble c
x /60,x´
5x´ 3x´!!*$!!*´
!*!*x 3x$x!*x!
7
7 7 7 71 ½$ 7
8 75 9
½ !*71!*:7,x;´<77,x
8 !2!*7´ 9
= !* !*7
9 !* !
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare c
c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------
c
c
La pasul daca >1 suntem in faza de construire a ansamblului si
adaugam cheia 3 ;in caz contrar suntem in faza de selectie,cheia 3_1
este cea mai mare cheie dintre 3_1,«,3 ,interschimbam pe 3_1 cu 3
si trebuie sa restabilim proprietatea de ansamblu in multimea d e chei
3_1,«,3_{ -1},interschimband pe 3 in mod repetat cu cel mai mare
dintre fiii sai¦In faza de constructie si descreste la 1 ;in faza de
selectie =1 si descreste de la la 1¦
öntrebare: c
9{
{{ {
{ {
{ {
{ { {
+6"
c
c
c
c
c
cRăspuns:
c
c
{ { {
{ { { +
c {!{{{ {{ {
{{{Ñ{ Ñ{
{{
c
c
{ {
7 "{
Ñ{
{{
c {{{{
{{7"
c
c
c
c
c
c
c
cc Algoritmul de sortare prin
{
x < ½7´´´
73x´!!*7´))*7
!2!* ´½
)*: ,x;)* $ 3x 5>´"
>´ !
´ ) ' ' #
½ )*: ,x;)
D¦Shell a propus metoda de sortare prin insertie multipla,care
foloseste un sir de incrementi ++_{-1}, «, +_1 =1 pentru a sorta prin
aceasta metoda cheile situate la o distanta egala cu +_,«,+_1¦Prin
suprapunerea acestor sortari prin insertie in final se obtine sirul
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccc
Structuri de date si tehnici de programare
c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------c
c
sortat,deoarece +_1=1¦Algoritmul de sortare prin
{ se poate
scrie astfel :
x <´ 3x´´x
* < 87 ,x´ ´
"
´ !* 4!*: , ;x4
43 #
73 ´!!*7´))*7
!2!* 8
½ )*: , ;)* $ 3 5>´
8 )*: , ;)
Printr-o alegere convenabila a incrementilor +,«,+_1 se pot
imbunatati performantele algoritmului de sortare prin insertie simpla,prin
micsorarea numarului de comparatii de chei¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccc
Structuri de date si tehnici de programare
c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------c
c
Răspunsurile
la test se vor
da în spaţiul 2. Se considera doua siruri de chei sortate _1 _ « si
liber din :_1 :_ « :¦Sa se scrie un algoritm care sa
chenar, în {
cele doua siruri de chei intr -un singur sir
continuarea sortat,continand ' chei,prin compararea de fiecare data a
enunţurilor celor mai mici chei din cele doua siruri¦Sa se arate ca un astfel
de algoritm face cel mult '-1 operatii de comparatii de chei¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare c
c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------
c
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccc
Structuri de date si tehnici de programare
c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------c
c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
- însoţiţi programul de o documentaţie privind problema tratată,
modul de introducere a datelor şi aspecte deosebite fo losite la
c
elaborarea programului¦
¯
/ { 0 Ñ/- 12 { Ñ { {
"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare c
c
¦ Sortare optima
------------------------------------------------------------------------------------------------------------------------
c
2.7. Bibliografie
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccc
Structuri de date si tehnici de programare
c
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
Cuprins
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
"@# !/<0 ABA
B
Cautarea liniara se obtine alegand next ĸlow;cautarea binara luand
next ĸ [(low+high)/ ] si cautarea prin interpolare alegand next ĸ low -
1+[({-3[low-1])(high-low+1)/(3[high+1]-3[low-1])]¦Corectitudinea
algoritmului este independenta de alegerea particulara facuta in liniile ( )
si (7)¦Daca {=3[next] atunci cautarea a fost cu succes,cheia fiind
gasita¦Daca { 3[next] stim ca { apartine lui * implica faptul ca { se
gaseste in multimea {3[low],«,3[high]}¦Daca high < low atunci { nu se
gaseste in *¦Daca high = low atunci next = high si deci { nu se gaseste in
*¦In aceste cazuri cautarea a fost fara succes¦Aplicarea algoritmului se
termina deoarece diferenta high ± low descreste cu cel putin o unitate la
fiecare executie a ciclului¦
La cautarea prin interpolare se presupun e ca s-au adaugat pozitiile
3[0] si 3[+1] si au fost completate cu chei artificiale¦Cazul cel mai
nefavorabil pentru algoritmul de cautare prin interpolare este O( ) (se
poate alege 3[0]=0,3[+1]=1,{=1/(+1) si * inclusa in intervalul deschis
(0,{))¦In acest caz avem mereu next=low si cautarea prin interpolare se
reduce la cautarea liniara¦Complexitatea medie este mult mai buna,ca si in
cazul cautarii binare,al carui algoritm il rescriem in conti nuare¦
c c
Algoritmul de cautare care urmeaza realizeaza cautarea unei chei 3
intr-un tabel de inregistrari ¯_1,¯_ ,«,¯ ale caror chei sunt in ordine
crescatoare : 3_1<3_ < «<3n¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
cautare fara succes,presupunand ca fiecare dintre cele +1 intervale
dintre chei sunt de asemenea egal probabile¦Vom avea 9= 1+( )/ si
9 = #( )/(+1)¦Deoarece #(T) = ( )+ ,mai obtinem relatia
9 = (1+1/)9 ± 1¦
Aceasta formula are loc pentru toate metodele de cautare care corespund
unor arbori binari,adica metode care nu fac comparatii redundante de
chei¦Rezulta ca 9 este minim daca si numai daca 9 este minim¦Dar
lungimea drumului extern #( ) este minima numai daca toate frunzele se
gasesc pe cel mult doua nivele consecutive (ele se pot gasi pe un singur
nivel numai daca arborele este complet si = ^-1)¦Am vazut ca algoritmul
cautarii binare satisface aceasta cerinta,deci el minimizeaza numarul
mediu de comparatii atat in cazul cautarii cu succes cat si al cautarii fara
succes¦Singurul neajuns major al acestui algoritm es te caracterul static al
fisierului in care se face cautarea ;daca se fac multe inserari si stergeri de
chei trebuie sa folosim alte structuri de date arborescente mai putin
performante,dar care au de asemenea o complexitate logaritmica,cum
sunt { + {,pe care ii vom introduce in paragrafele urmatoare¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
Ecuatia (1) ne da posibilit atea sa evaluam pe () succesiv,pentru %
= 1, , « ,¦Exista (-1)/ = O(^ ) astfel de valori,iar operatia de
minimizare se efectueaza de (-) = ^/+O(^ ) = O(^) ori,unde
suma se face dupa = 1, « ,-1¦Deci un arbore de cautare minim se poate
obtine cu complexitatea timp O(^) si complexitatea spatiu
O(^ )¦Complexitatea timp se poate inca reduce la O( ^ ),folosind o
proprietate de monotonie a multimii de indici ¯()¦
öntrebare: Va functiona corect algoritmul de cautare binara daca se modifica:
a) pasul 5 in l ĸ i in loc de l ĸ i+1 sau
b) pasul in u ĸ i in loc de u ĸ i -1?
c
c
Răspuns: c
cccccc
a)Nu,se intra intr-un ciclu infinit cand l = u si K>K_u ;
b)Da¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Regasirea informatiei
------------------------------------------------------------------------------------------------------------------------
c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
c- însoţiţi programul de o documentaţie privind problema tratată,
modul de introducere a datelor şi aspecte deosebite fo losite la
elaborarea programului ¦
¯
/ { 0 Ñ/- 12{ Ñ { {
"
3.7. Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
Cuprins
c c
Algoritmul de cautare care urmeaza realizeaza cautarea unei chei 3
intr-un arbore binar de cautare ,care poate fi accesat printr-un pointer ¯
catre radacina lui ¦Daca cheia 3 nu este in arbore,ea se va insera astfel
incat arborele extins sa ramana arbore de cautare¦Nodurile arborelui
contin urmatoarele campuri :
KEY(×) - cheia memorata in NOD(×) ;
LLINK(×) - pointer catre radacina subarborelui stang al lui NOD( ×);
RLINK(×) - pointer catre radacina subarborelui drept al lui NOD( ×)¦
Daca un subarbore este vid,atunci legatura catre radacina lui are
valoarea { {¦Se presupune ca este nevid,adica ¯={ {¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
numesc { + {¦O prima clasa de arbori echilibrati sunt { i
${care vor fi prezentati in continuare¦Alte clase sunt {
+ { { { ô~+ { { {
%
etc¦
cccccccccccccccccccccc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
dezechilibre in arbore¦Acum nodurile ô si > au ambele factorul de echilibru
egal cu 0,iar pentru realizarea rotatiei simple a trebuit sa modificam exact
campuri de legatura¦Desigur,pentru descoperirea nodurilor ô si > in
arbore,a trebuit sa memorizam ultimul nod parcurs cu un factor de
echilibru egal cu 1 in acest caz si sa modificam toti factorii de echilibru ai
nodurilor pe drumul de la ô la nodul nou inserat in arbore¦ Aceasta
operatie are de asemenea complexitatea O(log n ),inaltimea arborelui fiind
logaritmica¦
-cazul : factorul de echilibru al nodului ô a crescut la prin
cresterea cu o unitate a inaltimii subarborelui stang al lui >¦In acest caz
trebuie sa punem in evidenta radacina ? a subarborelui stang al lui >,care
are subarborii si ;inaltimea unuia dintre ei a crescut de la +-1 la
+¦Subarborele stang al lui ô este {,de inaltime + si subarborele drept al lui
> este de inaltime +¦Fiul drept al lui ô este >,iar fiul stang al lui > este ?¦
Rotatia dubla reface echilibrul facandu-l pe ? radacina a
subarborelui,cu fiul stang ô,care are subarborele stang { si subarborele
drept si fiul drept > cu subarborele stang si subarborele drept ,astfel
incat ordinea subarborilor este tot { ,deci ramane arbore de
cautare¦Factorul de echilibru al radacinii ? devine 0,iar inaltimea intregului
subarbore dupa rotatia dubla este tot ++ ¦Numarul de legaturi modificate
este egal cu 5¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
c
c
c
c
Răspuns: Se c insereaza cele chei intr-un arbore binar de cautare,initial vid si apoi
se aplica algoritmul de traversare cin inordine (ordinea simetrica),ceea
ccccc
c c
c
ce va produce sirul sortat al celor chei¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
c
c 1. Cum se definesc si ce performante au arborii de
cautare echilibrati dupa pondere,pondere care se
defineste in functie de numarul de frunze din cei
doi subarbori,stang si drept¦
c 2. Cum se pot folosi arborii echilibrati indexati
c
pentru reprezentarea listelor liniare,astfel incat
atat insertia cheilor cat si accesul dupa pozitie in
lista sa se faca rapid,combinand astfel avantajele
alocarii secventiale si ale alocarii inlantuite¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
- însoţiţi programul de o documentaţie privind problema tratată, modul de
c introducere a datelor şi aspecte deosebite folosite la elaborarea
programului¦
¯
/ { 0 Ñ/- 12{ Ñ { {
"
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Arbori binari de cautare
------------------------------------------------------------------------------------------------------------------------
c
4.7. Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Stucturi de date si tehnici de programare
c 5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
c
Cuprins
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
c 5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
c
5.2. Un prim exemplu : Algoritm de cautare si insertie in tabele
dispersate si inlantuite
c c
In cazul rezolvarii coliziunilor prin inlantuire se depun toate inregistrarile
ale caror chei disperseaza la aceeasi adresa intr-o lista inlantuita¦
Subtabelul (0 -1) contine un pointer catre capul de lista al
elementelor pentru care cheia 3 verifica +3)=¦Daca sunt chei si liste
inlantuite umplute uniform,lungimea medie a unei liste in care trebuie sa
facem cautarea este ;,deci dispersarea poate reduce numarul de
comparatii secventiale de chei cu un factor de ordinul lui ¦
Pentru a accesa o cheie calculam mai intai +apoi cautam cheia
in lista +"Operatiile de insertie sau stergere ale cheii se
implementeaza la fel ca aceste operatii in listele inlantuite folosind
legaturile de inlantuire¦Aceste liste se pot pastra ca arbori binari de
cautare indexati,astfel incat sa putem regasi rapid o cheie sau putem folosi
ideea de fisiere cu autoorganizare¦
Urmatorul algoritm propune o rezolvare posibila acestei probleme,
permitand listelor inlantuite ale inregistrarilor ale caror chei disperseaza la
aceeasi adresa sa se intrepatrunda¦In acest algoritm se lucreaza numai c u
cheile inregistrarilor¦Se cauta intr-un tabel cu noduri o cheie 3¦Daca
aceasta cheie nu este in tabel si tabelul nu este plin,ea se insereaza¦
Nodurile tabelului se noteaza cu TABLE[ ] pentru 0 si ele
sunt de doua feluri : libere si ocupate¦Un nod ocupat contine campul
KEY[],campul LINK[] si eventual si alte campuri¦Algoritmul foloseste o
functie de dispersare +3 si o variabila auxiliara ¯ pentru a gasi spatiile
libere¦Atunci cand tabelul este vid avem ¯'¦Dupa ce se vor face
insertii,TABLE[] este ocupat pentru toti care verifica inegalitatile ¯
¦Se mai presupune ca TABLE[0] este intotdeauna liber¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
insereaza pe rand,obtinandu -seTABLE[1]= ,TABLE[ ]=50, TABLE[]= ,
TABLE[]=18, TABLE[5]=75, TABLE[6]=5 si TABLE[7]=1¦
Pentru gasirea cheilor ,50, si 5 se face cate o comparatie de
chei, pentru 1 se fac comparatii,pentru 75 se fac comparatii si pentru
gasirea cheii 18 se fac comparatii,rezultand o medie de 1/7=1¦857
comparatii de chei¦Daca se cautau cheile prin cautare secventiala intr -o
lista liniara numarul mediu de comparatii era de (1+ +++5+6+7)/7=¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
c 5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
c
c
%
x "!#
IC/ 0 % '
!CD/ 0!´ " 3
!#
ĸ 3x$ 1>´ ĸ ,
E 3x´
! "
% 3x´ # '
ĸ,x´ 'IC/ 0 !CD/ 0 ĸ!
Reluand exemplul precedent cu =7,+33 ( 7),tabelul initial
neocupat si sirul de chei 5,1, ,75, ,18,50,aceste chei s e insereaza pe
rand in tabel si vom avea : TABLE[0]= ,TABLE[1]=18,TABLE[ ]= ,
TABLE[]= 75,TABLE[]=1,TABLE[5]=5 si TABLE[6] liber;cheia 50 nu
mai poate fi inserata in tabel¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
Atunci cand folosim adresarea deschisa vom impune cerinta ca
pentru orice cheie 3, sirul pozitiilor unde facem cautari,
<+(3,0),+(3,1),«,+(3,-1)> sa fie o permutare a multimii {0,1, « ,-
1},pentru a putea avea acces la toate pozitiile tabelului de dispersare
atunci cand facem cautarea¦Folosind aceasta idee de cautare si
insertie,algoritmul de cautare si insertie in tabele dispersate si inlantuite
folosind o functie de dispersare de doua variabile devine :
x >
7 "!´ #
IC/70´½ $ '
!CD/70!
3x´
,x
½ 'IC/70 !CD/70!" 3
! %#
{ { { este una dintre cele mai bune metode pentru
adresarea deschisa deoarece permutarile pozitiilor din tabelul datelor in
care se fac cautarile succesive au caracteristicile unor permutari
aleatoare¦Dispersarea dubla foloseste o functie de dispersare de forma
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
c 5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
c
+3+3'+!3
unde al doilea argument ia valorile naturale =0,1, ,«,iar +_1 si +_ sunt
doua functii de dispersare auxiliare astfel incat +_ (3) apartine multimii
{1, ,«,-1} pentru orice cheie 3¦
Prima pozitie din tabelul unde se cauta cheia 3 este
+3 celelalte pozitii unde se face cautarea se obtin din aceasta la
care se adauga succesiv valoarea +!3 ¦
De exemplu,se poate lua =7 (numar prim),+ 7) si
+!' ))¦
Pentru =7 si sirul de chei 5 , 1 , , 75 , , 18 , 50 si tabela
initial neocupata, cautarea (fara succes) a acestora in tabel va determina
insertia lor in tabelul astfel incat (0)= , (1)=50 , ( )=1 , ()= ,
()=18 , (5)=5 si (6) =75,in pozitii destul de imprastiate in tabel¦Intr -
adevar,+CC'! 7) ;pentru =0 avem pozitie libera in tabel si
inseram acolo cheia 5 +(1,)=5+ ( 7) ;pentru i=0 pozitia din tabel
este ocupata,dar pentru =1 pozitia este libera si inseram acolo cheia 1¦In
mod analog gasim + ,= ( 7) si =0 conduce la o pozitie
libera,+(75,)=5+ ( 7) si numai = conduce la o pozitie libera ;
+( ,)= + ( 7) si = este bun ; +(18,)=+ (mod 7) si =0 este
bun,iar +(50,)=1+ (mod 7) si =0 este bun¦
Cand facem cautarea pentru a gasi cheile ,18,50 si 5 facem o
singura comparatie de chei,pentru 1 facem comparatii,iar pentru si
75 facem cate comparatii¦
Pentru a putea face cautari in tot tabelul valoarea +_ (3) trebuie
sa fie un numar relativ prim cu ;acest lucru se realizeaza daca de
exemplu este numar prim,ca in exemplul anterior,deoarece conform
ipotezei avem 1 +_ (3) -1 pentru orice cheie 3¦
Daca si +_ (3) un un cel mai mare divizor comun >1 pentru o
anumita cheie 3,cautarea pentru 3 va examina numai a 1/ -a parte din
tabelul de dispersare ¦
Intr-adevar,daca cel mai mare divizor comun (+_ (3),)=1,atunci
<+(3,0),+(3,1),«, +(3,-1)> este o permutare a multimii {0,1,«, -1}¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
Răspunsurile
la test se vor
da în spaţiul 2. Sa se arate ca daca este o putere a lui , = ^
,in cazul
liber din dispersarii cu adresare deschisa si cautare patratica ,cu o
chenar, în functie de dispersare de forma
continuarea +3+ 3';!'@!;!
enunţurilor iar + 3 este o functie de dispersare auxiliara, atunci pentru
orice cheie 3+3A+3+3%8 este o permutare
a multimii {0,1,«,-1}¦
ccccc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
c 5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
c
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
5¦ Dispersarea memoriei
------------------------------------------------------------------------------------------------------------------------
c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
c - însoţiţi programul de o documentaţie privind problema tratată,
modul de introducere a datelor şi aspecte deosebite fo losite la
elaborarea programului ¦
¯
/ { 0 Ñ/- 12 { Ñ { {
"
5.7. Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
c
METODA GREEDY
Cuprins
c
£ cc
c
Metoda Greedycgreedymlacom) este aplicabilă problemelor de optim¦
Considerăm mulţimea finităc :x´ ´ ;c şi o proprietate p definită
pe mulţimea submulţimilor luicDc
"# x
c &×"#3:>´x; cuc c
¿"# "D#´ D
O submulţimeccse numeştecJ e dacăc"#xc
Dintre soluţii aleg una care optimizează o funcţie c&×"#3¯cdată¦cc
Metoda urmăreşte evitarea parcurgerii tuturor submulţimilor (ceea
ce ar necesita un timp de calcul exponenţial), mergându -se "direct" spre
soluţia optim㦠Nu este însă garantată obţinerea unei soluţii optime; de
aceea aplicarea metodei Greedy trebuie însoţită neapărat de o
demonstraţie¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
Distingem două variante generale de aplicare a metodei Greedy:
c
À "#
x´ À
<À"#$ ÀJ:<; x´
" :<;#x " : ;#
À :<;c À : ;c
c
:
c
c a în algoritm nu apare funcţia ccc
a timpul de calcul este liniar (exceptând prelucrările efectuate de
procedurileccşic c
a dificultatea constă în a concepe procedurilec ´c respectivc ´c în
care este "ascunsă" funcţia c
c
c
c Se consideră mulţimea de valori reale c : x´ ´ ;c Se caută
submulţimea a cărei sumă a elementelor este maximă¦
Vom parcurge mulţimea şi vom selecta numai elementele pozitive¦
.À>
x´
5>
. À.,x$ .À
Ú "#
c Caut cel mai scurt şir crescător cu elemente din mulţimea c:x´
ccccccccccccccccccccccccccc ´ ;c
öncepem prin a ordona crescător elementele mulţimii (corespunzător
proceduriic cApoi:c
.Àx$ xÀx$ À x$%' Àx
´
5. . À.,x$ .À
.5 À.$%' À 3.
.Àx$ xÀ
Astfel, dacă în urma ordonării a rezultatc "x´x´´´´´½´8´=´9´9; ´c
vom obţine succesiv:
%'x$x$"x#
%'$$"x´´´#
%'8$½$"´½´8´=´9# c
c
c
c
cc Fie mulţimeac :x´ ´ ;c cu elemente pozitive¦ Caut submulţimea de
sumă maximă, dar cel mult egală cucFcdat¦c
c
Dacă procedez ca în exemplul 1, pentruc "8´´´# c şic F=c obţinc :8;c
Dar soluţia optimă estec:´; ccu suma egală cucc
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
Din fiecare obiect poate fi încărcată orice fracţiune a sa¦
Se cere o modalitate de încărcare de (fracţiuni de) obiecte în
rucsac, astfel încât câştigul total să fie maxim¦
< `/>´x0´
O
Prin
- înţelegem un vectorc<"<x´´< #ccuc c
Oó < H
¿ x
c cccccO
- / este soluţie care maximizează funcţiac
À
ó
c
c c
Dacă suma greutăţilor obiectelor este mai mică decât G, atunci
încarc toate obiectele:c <"x´ ´x# cDe aceea presupunem în continuare
căcx, , 5Hc
Conform strategiei Greedy, ordonez obiectele descrescător după
câştigul la unitatea de greutate, deci lucrăm în situaţia:
x
cc c c
c
x
c
Algoritmul constă în încărcarea în această ordine a obiectelor, atâta
timp cât nu se depăşeşte greutatea c Hc (ultimul obiect pote fi eventual
încărcat parţial):
cc
HxÀH{ G1 reprezintă greutatea disponibilă } c
x´
Hx < Àx$Hx ÀHx3
< ÀHx6 $
7 ,x´
<7À >
Ú "<#
c
Am obţinut decic<"x´ ´x´< 7´>´ ´># ccuc<7`/>´x#c
Arătăm că soluţia astfel obţinută este optimă¦
À
Oó
O
ccccccccccccFie y soluţia optimă:cù" ´ù .´ #ccuc c
À
Oó
O
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
c
c c c
cc c
c c c c c
c
c c c
c c c c
c c
c c c
c c c c c c
c c c c c
c c c
c
Conform algoritmului lui Kruskal, vor fi alese în ordine muchiile:
(1, ), (1,), (,5), (,)
cu costul total egal cu 10¦ Muchia (1,5) nu a fost aleasă deoarece
formează cu precedentele un ciclu¦
À ´ x´
À x$ À>$ À>
Ú O13x
xÀ"´x#$ À"´#
xÀ x$À
x
À,x$ À,"´#$
Ú " x´ #
.x´
. .Àx
À,x
13x Ú "KH<K#
Ú "KH< EL´#
/1{ {{ 3
{"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
Fc se numeşte - -/{ + dacă nu conţine
cicluri şi poate fi extinsă la un arbore parţial ×cde cost minim¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
Testul 1.
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
6¦ Metoda Greedy
------------------------------------------------------------------------------------------------------------------------
c
6.6. Lucrare de verificare pentru studenţi
* - 2 { Ñ
{ . :
{
9
"Să se interclaseze vectori ordonaţi, obţinând un singur vector ce
conţine toate elementele vectorilor iniţiali¦
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
- însoţiţi programul de o documentaţie privind problema tratată,
modul de introducere a datelor şi aspecte deosebite folosite la
elaborarea programelor¦
¯
/ { 0 Ñ/- 12{ Ñ { {
"
6.7. Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
METODA BACKTRACKING
c
c
Cuprins
Obiectivele Unităţii de învăţare nr. 7
c
c c
c cccccAşa cum s-a subliniat în capitolele anterioare, complexitatea în timp
a algoritmilor joacă un rol esenţial¦ ön primul rând un algoritm este
considerat "acceptabil" numai dacă timpul său de executare este
polinomial, adică de ordinul (".#c pentru un anumitc . c c reprezintă
numărul datelor de intrare¦
Pentru a ne convinge de acet lucru, vom considera un calculator
capabil să efectueze un milion de operaţii pe secundă¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Chiar dacă în prezent calculatoarele performante sunt capabile de a
efectua zeci de miliarde de operaţii pe secundă, tabelul de mai sus arată
că algoritmii exponenţiali nu sunt acceptabili¦
c
c
7.1. Descrierea metodei
c
7.2. Exemple
c
ön exemplele care urmează,c S.c va fi notatǎ în continuare prin c
".#cSe aplică algoritmul de mai sus pentru diferite forme ale funcţiei
de continuare¦
*)
Backtracking
c = parcurgerea limitată în adâncime a unui
arbore
c
c *)
conform condiţiilor de continuare
c
c
Rolul condiţiilor de continuare este ilustrat în figura ce urmează¦
Dacă pentruc<.ceste aleasă o valoare ce nu satisface condiţiile de
continuare, atunci la parcurgerea în adâncime este evitată parcurgerea
unui întreg subarbore¦
c
c
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
c
c
c
c c
c
c
c
c c
c
c
c
c
c
c
c c
c
c
c
c
c
c
c
c
c
7.4. Variante
c
Variantele cele mai uzuale întâlnite în aplicarea metodei backtracking
sunt următoarele:
a soluţia poate avea un numǎr variabil de componente 0;
{
a dintre ele alegem una care optimizeazǎ o funcţie datǎ¦ c
c
c
c Fie "x´´#`cCaut un subşir crescǎtor de lungime maximǎ¦
c
Deci cautcx<x1 1< .cccucc cc.maximc
c c c c c cc<x1<1 1 <.
c
cPentruc 9 şic"x´´´´=´½´9´8# cva rezultac.½c
c
Aici,
-{
G: care nu poate fi continuată; exemplu: c"´=´9# c
c
Notǎm princ<cşic.csoluţia optimǎ şi lungimea sa¦c
Completez cuc3cşic,cDc>À3$À,x$ À ,$
Funcţiac care următoarea formă:
".#
À<.3x1.
$
Procedurac care forma:
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
".#
.5. < À<$. À.$
$
Algoritmul backtracking se modifică astfel:
.Àx$<>À >$<xÀ>$. À>$
Ú .5>
<.1
< .À<.,x$
".#
< .
c,$
".#$. À .3x
. À.,x$< .À<.3x
. À.3x$c
c
Se face tot o parcurgere limitatǎ în adâncime a unui arbore¦
c
c
7.5. Varianta recursivǎ
xÀL"L$ Àx$%."#$
Procedurac%.care următoarea formă: c
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
%.".#
.,x
cccccccccccccc {scrie soluţia} c
c .ÀL"L$ ,,$
3. %.".,x#
33$
.ÀL#L$ 33$
cc c > %.".,x#
,,$
ön exemplul tratat backtracking -ul este optimal! : se avansează
dacă şi numai dacă există şanse de obţinere a unei soluţii¦ Cu alte cuvinte,
condiţiile de continuare nu sunt numai necesare, dar şi suficiente¦
c
c
c
7.6. Metoda backtracking în plan
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
7.7. Comentarii şi răspunsuri la testele de autoevaluare
Testul 1.
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
7¦ Metoda Backtracking
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
7.8. Lucrare de verificare pentru studenţi
* -2 {Ñ
0 {>{ {
{
9
" Plata sumei în monede. Se consideră tipuri de monede¦ Pentru
fiecare tip = 1, valoarea unei monede este {() iar numărul de
monede de acest tip este ()¦ Dată fiind o sumă de bani , se
cer toate modalităţile în care ea poate fi achitată cu monedele
disponibile¦
c
!" Ghicirea numărului ascuns. Să ne imaginăm următorul joc: Fie
un număr natural în tre 0 şi 1000 care este ascuns de o persoană¦
O altă persoană va trebui să ghicească numărul ascuns prin cât
mai puţine încercări, pe baza informaţiilor date de persoana care
a ascuns numărul, aceasta precizând dacă numărul ascuns este
mai mare sau mai mic decât numărul presupus¦ Realizaţi o
strategie de alegere a încercărilor astfel încât oricare ar fi numărul
ascuns să se facă cât mai puţine încercări¦ Simulaţi un astfel de
joc!c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
- însoţiţi programul de o documentaţie privind problema tratată,
7.9. Bibliografie
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Cuprins
Obiectivele Unităţii de învăţare nr. 8
c
Metoda { ("desparte şi stăpâneşte") constă în
împărţirea repetată a unei probleme de dimensiuni mari în mai multe
subprobleme de acelaşi tip, urmată de rezolvarea acestora şi combinarea
rezultatelor obţinute pentre a determina rezultatul corespunzător problemei
iniţiale¦ Pentru fiecare subproblemă procedăm în acelaşi mod, cu excepţia
cazului în care dimensiunea ei este suficient de mică pentru a fi rezolvată
direct¦
Este evident caracterul recursiv al acestei metode¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
8.1. Schema generală
"´#
Q1R
"´#
"´#$
x
"´#$
",x´#$
E% "x´#
$
unde:
- funcţia Interm întoarce un indice în intervalul (de obicei
}",#6 )¦
- funcţia
este capabilă să întoarcă rezultatul subsecvenţei ,
dacă aceasta este suficient de mică;
- funcţia E% întoarce rezultatul asamblării rezultatelor parţiale x şi
¦
#:
Calculul maximului elementelor unui vector;
Parcurgerile în preordine, inordine şi postordine ale u nui arbore binar;
Sortarea folosind arbori de sortare¦
Vom adăuga
3S´,x,S ¦ Căutăm perechea "%´ # dată de:
"´ # dacă <;
"´ # dacă 3x1<1 ¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Deoarece problema se reduce la o singură subproblemă, nu mai
este necesar să folosim recursivitatea¦
Fie X"$ ´7# şirul de mutări prin care cele discuri din vârful tijei
sunt mutate peste cele de pe tija 7, folosind şi a treia tijă, al cărei număr
este evident 83 37¦ Problema constă în a determina X"$x´# ¦
Se observă că este satisfăcută relaţia:
X"$ ´7#X"3x$ ´7# " ´7#X"3x$ ´7# (*)
respectându-se condiţia din enunţ¦ Deci p roblema pentru discuri a fost
redusă la două probleme pentru 3x discuri, al căror rezultat este
asamblat conform (*)¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
8.4. Sortare prin interclasare
Fie "x´ ´ # vectorul care trebuie ordonat crescător¦
Ideea este următoarea: împărţim vectorul în doi subvectori,
ordonăm crescător fiecare subvector şi asamblăm rezultatele prin
{
{ ¦ Se observă că este aplicată tocmai metoda Divide et Impera¦
"´´#
.xÀ$.À ,x$. À$
Ú .x O.
.x1. .x À .x,x$% .À.x
. À.,x$% .À.
.À .,x
.x5 { au fost epuizate elementelei primei subsecvenţe }
.´
%.À $. À.,x
{ au fost epuizate elementelei primei subsecvenţe }
.x´
%.À $. À.,x
´
À%
Timpul de calcul este de ordinul ("3#, adică liniar în lungimea
secvenţei analizate¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
"´#
À}",#6 $
"´#$",x´#$
"´´#
".3 #, .
.">#,. .>, ¦
Rezultă că "#>" #¦
Se observă că s-a obţinut acelaşi timp ca şi pentru sortarea cu
ansamble¦
-¦ Se poate demonstra că acest timp este optim¦
8.5. Metoda Quicksort
Prezentăm încă o metodă de sortare a unui vector " x´ ´ #¦
Va fi aplicată tot metoda Divide et Impera¦ Şi de această dată fiecare
problemă va fi descompusă în două subprobleme mai mici de aceeaşi
natură, dar nu va mai fi necesară combinarea (asamblarea) rezultatelor
rezolvării subproblemelor¦
Fie "´ ´ # secvenţa curentă care trebuie sortat㦠Vom
-{ pe în secvenţa "´ ´ #, adică printr-o permutare a
elementelor secvenţei:
< va trece pe o poziţie .;
toate elementele aflate la stânga poziţiei . vor fi mai mici decât <;
toate elementele aflate la dreapta poziţiei . vor fi mai mari decât <¦
ön acest mod ap va apărea pe poziţia sa finală, rămânând apoi să
ordonăm crescător elementele aflate la stânga sa, precum şi pe cele aflate
la dreapta sa¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Fie ' funcţia cu parametrii ´ care întoarce indicele . pe care va
fi poziţionat în cadrul secvenţei "´ ´ #¦
Atunci sortarea se realizează prin apelul - ."x´# , unde
procedura - . are forma:
- ."´#
. À'"´#$- ."´. 3x#$- .".,x´#
.
Cazul cel mai defavorabil pentru metoda Quicksort este cel în care
vectorul este deja ordonat crescător: se compară x cu ´ ´
rezultând că el se află pe poziţia finală, apoi se compară cu ´ ´
rezultând că el se află pe poziţia finală etc¦
x "# x
" x# " # x
]
" x# x
"# "x# x
]
,x
c c
<)¦
Deci "#>" #¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
8.6. Comentarii şi răspunsuri la testele de autoevaluare
Testul 1.
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
8¦ Metoda Divide et Impera
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
* -2 {Ñ
0 { {
{
9
" Problema plierii ¦ Se consideră un vector de lungime ¦ Definim
plierea vectorului prin suprapunerea unei jumătăţi numită
{{ peste cealaltă jumătate numită { cu
precizarea că dacă numărul de elemente este impar, elementul
din mijloc este eliminat¦ ön acest mod se ajunge la un subşir ale
c cărui elemente au numerotarea corespunzătoare jumătă ţii
receptoare¦ Se cer următoarele:
- Fiind dat `{1, , ¦¦¦, } să se determine dacă elementul poate fi
Ñ{ ca rezultat al unor plieri succesive¦
- Să se precizeze toate Ñ{ posibile¦
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
- însoţiţi programul de o documentaţie privind problema tratată,
modul de introducere a datelor şi aspecte deosebite folosite la
elaborarea programelor¦
8.8. Bibliografie
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Cuprins
Obiectivele Unităţii de învăţare nr. 9
1 c 1 c
5c 7 8c 5 6 7 8c
6 10 11c 10 11 1 c
1 1 15 1 c 1 1 15
unde locul liber mai poate fi considerat drept conţinând plăcuţa imaginară
cu eticheta 16¦
Cum locul liber poate fi mutat spre N, S, E, V (fără a ieşi din cadru),
rezultă că fiecare configuraţie (stare) are cel mult descendenţi¦ Se
observă că arborele astfel construit este infinit¦ Stările finale sunt stări
rezultat şi corespund configuraţiei finale¦
c 9 +{{
"
Se consideră un graf orientat cu arcele etichetate cu costuri
pozitive¦ Inexistenţa unui arc între două vârfuri este identificată prin
"prezenţa" sa cu costul +¦ Presupunem că graful este dat prin matricea C
a costurilor sale¦ Se cere să se determine, dacă există, un circuit
hamiltonian de cost minim¦
Să considerăm de exemplu graful dat de matricea de costuri:
]
]
9
]
]
]
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
x
xx x x x x x
¯{
{ > {+{ > ¦
Ştim că şi metoda backtracking este aplicabilă pr oblemelor
reprezentabile pe arbori¦ Există însă multe deosebiri, dintre care
menţionăm următoarele:
- ordinea de parcurgere a arborelui;
- modul în care sunt eliminaţi subarborii care nu pot conduce la o
soluţie;
- faptul că arborele poate fi infinit (prin natur a sa sau prin faptul că mai
multe vârfuri pot corespunde la o aceeaşi stare)¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Legat de modul prin care alegem un vârf activ drept vârf curent,
deci implicit legat de modul de parcurgere a arborelui, facem următoarele
remarci:
parcurgerea DF nu este adecvată, deoarece pe de o parte arborele
poate fi infinit, iar pe de altă parte soluţia căutată poate fi de exemplu un
fiu al rădăcinii diferit de primul fiu şi parcurgerea în adâncime ar fi
ineficientă: se parcurg inutil stări, în lo c de a avansa direct spre soluţie;
parcurgerea pe lăţime conduce totdeauna la soluţie (dacă aceasta
există), dar poate fi ineficientă dacă vârfurile au mulţi fii¦
. Totdeauna costul unui vârf va fi mai mic decât cel al descendenţilor (fiilor)¦
De fiecare dată drept vârf curent este ales cel de cost minim (cel
considerat ca fiind cel mai "aproape" de soluţie)¦ De a ceea ~ va fi în
general un min-ansamblu: costul fiecărui vârf este mai mic decât costul
descendenţilor¦
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
) T"<# să poată fi calculată doar pe baza informaţilor din drumul de la
rădăcină la < ;
) este indicat ca T4 pentru a ne asigura că dacă T"<#5 , atunci şi
"<#5 , deci < nu va mai fi dezvoltat¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
. La (*) am ţinut cont de faptul că dacă 7 este descendent al lui ,
atunci T" #1T"7# ¦
Pentru rădăcină:
- reduc liniile în ordine cu , 1, , ;
- reduc prima coloană cu 1;
- în acest mod obţin T"x#@ , iar matricea M1 este:
]
]
]
]
]
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Pentru vârful :
- plec de la Fx şi pun pe linia 1 şi coloana ;
- reduc linia cu ;
- în acest mod obţin T"#,@,xx , iar matricea F este:
]]
]
]]
Pentru vârful :
- plec de la Fx şi pun pe linia 1 şi coloana ;
- reduc linia cu ;
- în acest mod obţin T"#,@,½x= , iar matricea M este:
]]
]
]]
Pentru vârful :
- plec de la Fx şi pun pe linia 1 şi coloana ;
- nu este necesară vreo reducere;
- în acest mod obţin T"#>,@,>@ , iar matricea M este
]]
]
]]
Acum ~:´´; cu T"#x, T"#x=, T"#@¦ Devine activ vârful
¦
Pentru vârful :
- plec de la F şi pun pe linia şi coloana ;
- nu este necesară vreo reducere;
- în acest mod obţin T"@#>,@,>@ , iar matricea M este:
]]
]
]]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Pentru vârful 10:
- plec de la F şi pun pe linia şi coloana ;
- reduc linia cu , iar linia cu 5;
- în acest mod obţin T"x>#9,@,x , iar matricea M10 este:
]]
]
]]
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Testul 1.
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor;
- însoţiţi programul de o documentaţie privind pro blema tratată,
modul de introducere a datelor şi aspecte deosebite folosite la
elaborarea programelor¦
¯
/ { 0 Ñ/- 12{ Ñ { {
"
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
¦ Metoda Branch and Bound
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
9.5. Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Cuprins
c
c
c
c
c c
c
u
Problema enunţată nu are totdeauna soluţie, aşa cum se vede pe
graful de dependenţe de mai jos, în care există un circuit¦ '¦
c
c
c
:
3 poate fi chiar infinită;
3 I este de obicei N, Z, R, :>´x; sau un produs cartezian;
3 < poate fi un minim, un maxim, o sumă etc¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
>
.,x. :<`<.;´.5>
Evident, >x ..,x
c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Metoda şirului crescător de mulţimi este larg folosită în teoria
limbajelor formale, unde de cele mai multe ori ne interesează existenţa
unui algoritm şi nu performanţele sale¦
:
3 problema are soluţie dacă şi numai dacă graful este aciclic;
3 dacă există soluţie, ea nu este neapărat unică¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa c
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Algoritmul propriu-zis, adaptat la problema generală, este următorul:
Ú 9
q9$Ú " #$
calculează
"<# conform funcţiei <
'
Ú
" #$
toţi 7`Æ
7À 73x
7> 7 9
1 Ú "K #
X"<#
<'
toţi ù`<
ù/' "ù´<# F'$X"ù#
$
caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
c c
c
c
c c
u u
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
c
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Vom începe cu câteva exemple foarte simple, dar care pun în
evidenţă anumite caracteristici ale metodei programării dinamice¦
caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Arborele liniar constituit din vârfurile cu x¦ Obţinem relaţiile de
recurenţă:
x´xx;
x´7x´73x,7 , 7
care corespund asociativităţii la stânga: " "" x,#,#, #¦
c
{ {
0
/ {/"
Se consideră vectorul " x´ ´ #¦ Se cer lungimea celui mai
lung şir crescător, precum şi toate subşirurile crescătoare de lungime
maximă¦
Introducem notaţiile:
= lungimea maximă căutată;
" # = lungimea maximă a subşirului crescător ce începe cu ¦
:x´´ ´; ; :;; : ,x´ ´; , 1;
" #
Evident, suntem în prezenţa unui PD -arbore de rădăcină 1¦
x´
" #
Àx$"x# À $ " #
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
c
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
. Dacă dorim să obţinem un singur subşir crescător de lungime , este
suficient să eliminăm instrucţiunea À 3x¦
7 7
x
" ´7#
" ´ #
"7´7#
caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
7´
73x´x´3x
" ´7# calculat ca mai sus;
fie k valoarea pentru care se realizează minimul
"7´ # À.
Ú "x´#
(se observă că am folosit partea inferior triunghiulară a matricii pentru a
memora indicii pentru care se realizează minimul)¦
Dacă dorim numai costul final, nu este nevoie să memorăm întreaga
matrice, ci este suficient să folosim un vector¦
Dacă dorim să producem şi o ordine de înmulţire optimă, avem
nevoie de întreaga matrice¦ Vom apela "x´# , unde procedura are
forma:
"´#
Ú "#
. À"´#
Ú "K"K#$"´.#$Ú "K´K#$
".,x´#$Ú "K#K#
$
è
ó
À
cc
{ +1/ {
Se consideră un dreptunghi cu laturile de , respectiv unităţi (1)¦
Asupra sa se pot face tăieturi pe orizontală sau vertical㦠Se
cere numărul minim de pătrate în care poate fi descompus dreptung hiul¦
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
c
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Testul 1.
.
3.
7
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
c
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
3 o tăietură pe verticală; costurile sunt: ., ´73., .}76 ;
3 o tăietură pe orizontală; costurile sunt: .´7, 3.´7, . } 6 ¦
Rezultă că valoarea 7 a unui vârf " ´7# depinde de valorile
vârfurilor din stânga sa şi de cele aflate deasupra sa¦ Se observă
că graful de dependenţe este un PD -arbore¦
7
" ´7#
´
7 ,x´
calculul lui 7 conform celei de a patra dependenţ e de mai sus
7 7 À 7
caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare
10¦ Metoda programării dinamice
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
Indicaţii de redactare:
- introduceţi în program un număr suficient de comentarii pentru buna
înţelegere a programelor¦
- însoţiţi programul de o documentaţie privind problema tratată,
modul de introducere a datelor şi aspecte deosebite folosite la
elaborarea programelor¦
¯
/ { 0 Ñ/- 12{ Ñ { {
"
10.8. Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
c
Structuri de date si tehnici de programare
Bibliografie
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
c
BIBLIOGRAFIE
[1] D¦ E¦ Knuth, {{ {{ {{{{ , Vol¦ I,Editura Tehnica, Bucuresti,
17; retiparit, Editura Teora, 000¦
[ ] K¦Mehlhorn, {{*
{ ô +
, Springer-Verlag, Berlin,18¦
[] S¦ Sahni, {{*
ô +
{ ô{
9 ++, Mc Graw Hill,18¦
[] S¦ Sahni, {{*
ô +
{ ô{
,{{ , Mc Graw Hill, 000¦
[5] I¦ Tomescu, {{*
, Editura Universitatii din Bucuresti, 008¦
[6] Georgescu Horia, + {{ , Editura Universităţii Bucureşti, 005
[7] Cormen T¦ H¦ et al¦ 1{ , Computer Libris Agora, 000
[8] Parberry Ian, Gasarch William, ×
ô +
( nd Edition), 00
[] Skiena Steven, +ô
{{, Springer 18
caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccc
Structuri de date si tehnici de programare