Documente Academic
Documente Profesional
Documente Cultură
procedure DIV_IMP(p, q; r)
if p q < EPS
then
call PREL(p, q; r)
else
call DIV(p, q; m)
call DIV_IMP(p, m; r1 )
call DIV_IMP(m+1, q; r2 )
call COMB( r1 , r2 ; r )
end if
return
end
n algoritmul anterior sau folosit notaiile:
EPS reprezint lungimea minim a unei secvene a p ,..., aq ,
notat prescurtat (p,q), pentru care prelucrarea se poate face direct,
fr a mai fi necesar mprirea n subprobleme;
Procedura PREL realizeaz prelucrarea secvenelor de acest
tip furniznd rezultatul n r.
Procedura DIV determin subsecvenele (p,m) i (m+1,q) n
care se mparte secvena (p,q) i furnizeaz pe m.
Procedura COMB realizeaz combinarea rezultatelor r1 i r2
ale prelucrrii a dou secvene vecine (p,m) i (m+1,q), obinnd
rezultatul m al prelucrrii secvenei (p,q).
Un exemplu tipic l constituie sortarea prin interclasare.
Trebuie sortat (ordonat cresctor) un vector A (a , a ,..., a ) .
1
p q
2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
p q
2
(1,2)
(3,4,0), (5,8,0), (9,16,0), (17,+,0)
(3,4)
(1,2)
(5,8,1), (9,16,0), (17,+,0)
(5,6)
(1,4)
(7,8,0), (9,16,1), (17,+,0)
(7,8)
(5,6), (1,4)
(9,16,2), (17,+,0)
(9,10)
(1,8)
(11,12,0), (13,16,0), (17,+,0)
(11,12)
(9,10), (1,8)
(13,16,1), (17,+,0)
(13,14)
(9,12), (1,8)
(15,16,0), (17,+,0)
(15,16)
(13,14), (9,12), (1,8)
(17,+,0)
Descendenii unui vrf etichetat cu (p, q) sunt etichetai cu (p,
m) i (m+1, q) pentru un anume m. Vrfurile terminale sunt etichetate
cu (p, q) unde p q EPS. Pentru exemplu considerat, arborele
ataat este urmtorul:
(1, +)
(1, 16)
(17, +)
(9, 16)
(1, 8)
(1, 4)
(5, 8)
(9,12)
(13,16)
procedure Combina(beta,gama:integer;var
alfa:integer);
begin
if beta<gama then alfa:=beta else alfa:=gama;
end;
procedure DivEtImp(p,q:integer; var alfa:integer);
begin
if q-p<eps then prel(p,q, alfa)
else
begin
Divide(p,q,m);
DivEtImp(p,m,beta);DivEtImp(m+1,q,gama);
Combina(beta,gama,alfa);
end;
end;
begin
citeste;
p:=1;q:=n;
DivEtImp(p,q,alfa);
writeln(alfa);
readln
end.
2. Cutare binar
Se citesc n numere ntregi sortate cresctor. De asemenea se
citete un numr ntreg nr. Se cere s se decid dac nr. se gsete n
irul celor n numere citite.
Cutarea se efectueaz ntre numerele reinute de componentele
de indice ntre valorile reinute de dou variabile li i ls (iniial li = 1
i ls = n).
Fiind date li i ls procedm astfel:
se calculeaz indicele componentei din mijloc, n cazul n care n
este impar, sau a uneia din cele dou plasate n mijloc, n cazul n
care n este par (k = (li+ls) div 2);
apar trei posibiliti:
valoarea reinut de componenta de indice calculat este egal cu
nr (caz n care cutarea se termin cu succes);
var i,k:byte;
begin
for i:=ColTija(tija1)-disc to Pred(ColTija(tija2)disc) do
begin
Delay(Pauza); if KeyPressed then Halt(1);
gotoxy(i,3); for k:=0 to disc do Write(' ');
gotoxy(i+1,3); for k:=0 to 2*disc do
Write(forma);
end
end;
procedure MutaStanga(disc, tija1, tija2 :byte);
var i,k:byte;
begin
for i:=ColTija(tija1)-disc downto
succ(ColTija(tija2)-disc) do
begin
Delay(Pauza); if KeyPressed then Halt(1);
gotoxy(i,3); for k:=0 to disc do Write(' ');
gotoxy(i-1,3); for k:=0 to 2*disc do
Write(forma);
end
end;
procedure Coboara(disc, tija:byte);
var i,k:byte;
begin
for i:=3 to Pred(Varf[tija]-1) do
begin
Delay(Pauza); if KeyPressed then Halt(1);
gotoxy(ColTija(tija)-disc,i);
for k:=0 to disc do Write(' ');
gotoxy(ColTija(tija)-disc,i+1);
for k:=0 to 2*disc do Write(forma);
end;
Dec(Varf[tija])
end;
procedure Ridica(disc, tija:byte);
var i,k:byte;
begin
for i:=Varf[tija] downto 4 do
begin
Delay(Pauza); if KeyPressed then Halt(1);
gotoxy(ColTija(tija)-disc,i);
for k:=0 to disc do Write(' ');
gotoxy(ColTija(tija)-disc,i-1);
for k:=0 to 2*disc do Write(forma);
end;
Inc(Varf[tija])
end;
procedure Muta(disc, tija1, tija2:byte);
begin
Ridica(disc,tija1);
if (tija1<tija2) then
MutaDreapta(disc,tija1,tija2);
Coboara(disc, tija2)
end;
procedure Han(n, tija1, tija2, tija3:byte);
begin
if (n=1) then Muta(1,tija1,tija2)
else
begin
Han(n-1, tija1, tija3, tija2);
Muta(n, tija1,tija2);
Han(n-1, tija3, tija2,tija1)
end
end;
procedure Initializari;
var k,disc:byte;
begin
HideCursor; Clrscr;
for disc:=1 to 9 do
begin
gotoxy(ColTija(1)-disc,varf[1]+disc-1);
for k:=0 to 2*disc do
write(forma);
end
end;
begin
Initializari; gotoxy(28,1); writeln('- Turnurile din
Hanoi -');
Han(8,1,2,3); ShowCursor;
readln
end.