I. NEUTRIEDENÝ SÚBOR S PRIAMYM PRÍSTUPOM (HEAP ...
I. NEUTRIEDENÝ SÚBOR S PRIAMYM PRÍSTUPOM (HEAP ...
I. NEUTRIEDENÝ SÚBOR S PRIAMYM PRÍSTUPOM (HEAP ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
I. <strong>NEUTRIEDENÝ</strong> <strong>SÚBOR</strong> S <strong>PRIAMYM</strong> <strong>PRÍSTUPOM</strong> (<strong>HEAP</strong>)<br />
- implicitná neutriedená tabuľka na disku (neefektívne vyhľadávanie)<br />
Organizácia:<br />
- záznamy v ľubovoľnom poradí bez ohľadu na hodnotu kľúča<br />
- manažment blokov statický (v ďalšom)<br />
- po zrušení sa už miesto neprideľuje,ostáva nevyužité (zjednodušenie)<br />
Spracovanie:<br />
1) Priamy prístup<br />
a) sprístupnenie podľa kľúča:<br />
CitajHeap (Subor, K, Oblast) - záznam s kľúčom K Oblast (ak ex.)<br />
a) sprístupnenie podľa poradia:<br />
CitajHeapPor (Subor, I, Oblast) - I-tý záznam Oblast<br />
ďalšie (dynamické) operácie:<br />
ZapisHeap (Subor, Oblast)<br />
ZrusHeap (Subor, K)<br />
ModifHeap (Subor, Oblast) - ak ex. záznam s kľúčom Oblast.Kľúč,<br />
nahraď ho záznamom Oblast<br />
VytvorHeap<br />
OtvorHeap organizačné operácie<br />
ZatvorHeap<br />
2) Sekvenčný prístup<br />
operáciou OtvorHeapSeq otvoríme existujúci heap pre sekvenčné<br />
čítanie (nastavia sa buffery a mechanizmy pre anticipovaný vstup)<br />
operáciou CitajHeapSeq (Oblast) sa sprístupňujú nasledujúce záznamy<br />
operáciou ZatvorHeapSeq sa ukončí možnosť sekvenč. prístupu<br />
Takéto spracovanie v neutriedenom poradí sa nazýva aj „sériové“.<br />
Zložitosť: Pri čítaní podľa kľúča sa v najhoršom prípade prenesú všetky<br />
bloky, v priemernom prípade polovica.<br />
Fixovanie: Záznamy môžu byť fixované.<br />
Užitočnosť: pre malé súbory alebo ako súčasť inak organizovaných súborov<br />
(pozri súbory s úplným indexom).<br />
+Heap.doc Strana 1 z 5
Hlava (blok 0)<br />
PocBlokov 5<br />
PocZaz 5<br />
AktBlok 2<br />
AktZaznam 3<br />
PoslBlok 3<br />
PoslZaznam 2<br />
Volny 3<br />
Obsadeny 1<br />
Heap -Štruktúra riadiaceho bloku (príklad)<br />
0 1 1 1 1 3 3 66 7 15 16<br />
1 1 1 1 1 2 25 14 13 50 99<br />
0 1 1 1 1 3 3 66 7 15 16<br />
1 1 0 0 0 4 0 37 38<br />
0 0 0 0 0 5<br />
0 0 0 0 0 0<br />
Buffer<br />
Data<br />
AktBlok ... aktuálny blok (je v bufferi)<br />
AktZaznam ... práve spracovávaný záznam<br />
PoslBlok ... blok, do ktorého sa bude zapisovať (zápis na koniec)<br />
PoslZaznam ... posledne zapísaný záznam<br />
Volny ... zoznam blokov (DalsiVol), v ktorých je miesto na zápis<br />
Obsadený ... zoznam blokov (DalsiObs), v ktorých je platný záznam na čítanie<br />
type TypBloku = record<br />
Platny: array [1..Faktor] of boolean;<br />
Zaznam: array [1..Faktor] of TypZaznamu;<br />
DalsiVol, DalsiObs: integer<br />
end;<br />
type TypRiadiaci = record<br />
PocBlok, PocZaz, AktBlok, AktZaznam, PoslBlok, PoslZaznam,<br />
Volny, Obsadeny : integer<br />
end;<br />
+Heap.doc Strana 2 z 5<br />
B1<br />
B2<br />
B3<br />
B4<br />
B5
Heap - Implementácia niektorých operácií<br />
procedure VytvorHeap (var Subor: TypHeap; Rozsah, Fakt: integer);<br />
var i,j: integer;<br />
begin<br />
new (Subor);<br />
with Subor↑ do<br />
begin<br />
rewrite (Data);<br />
with Hlava do<br />
begin {inicializacia poloziek Hlavy}<br />
PocBlokov := Rozsah; PocZaz := Fakt;<br />
AktBlok := 0; AktZaznam:= 0; PoslBlok:= 0; PoslZaznam:= 0;<br />
Volny:= 1; Obsadeny:= 0<br />
end;<br />
ZapisBlok (Data, Hlava, AktBlok);<br />
with Buffer do {inicializacia a zapis blokov}<br />
for i:= 1 to Rozsah do<br />
begin<br />
for j:=1 to Fakt do Platny[j] := false;<br />
inc (DalsiVol); DalsiObs := 0;<br />
if DalsiVol > rozsah then DalsiVol:= 0;<br />
ZapisBlok (Data, Buffer, i)<br />
end<br />
end<br />
end;<br />
procedure OtvorHeap (var Subor: TypHeap);<br />
begin<br />
with Subor↑ do<br />
begin<br />
reset (Data);<br />
CitajBlok (Data, Hlava, 0)<br />
end<br />
end;<br />
procedure ZatvorHeap (var Subor: TypHeap);<br />
begin<br />
with Subor↑ do<br />
begin<br />
if AktBlok =/= 0 then ZapisBlok (Data, Buffer, AktBlok);<br />
AktBlok:= 0; AktZaznam:= 0;<br />
close (Data)<br />
end<br />
end;<br />
+Heap.doc Strana 3 z 5
procedure ZapisHeap (var Subor:= TypHeap, Oblast: TypZaznamu,<br />
var Zapisany: boolean); {zapis vzdy na koniec suboru}<br />
{bez kontroly duplicity}<br />
begin<br />
with Subor↑, Hlava do<br />
begin<br />
Zapisany:= false;<br />
if PoslBlok = 0 then exit {subor je zaplneny}<br />
if AktBlok =/= PoslBlok then<br />
begin<br />
if AktBlok =/= 0 then ZapisBlok (Data, Buffer, AktBlok);<br />
CitajBlok (Data, Buffer, PoslBlok);<br />
AktBlok:= PoslBlok; {v bufferi blok, do ktoreho zapiseme}<br />
end; {nasleduje formovanie a zapis zaznamu}<br />
inc (PoslZaznam); AktZaznam:= PoslZaznam;<br />
Buffer.Zaznam [PoslZaznam]:= Oblast;<br />
Buffer.Platny [PoslZaznam]:= true;<br />
if PoslZaznam = PocZaz then {blok sa zaplnil}<br />
begin<br />
PoslBlok:= Buffer.DalsiVol {prechod na dalsi blok}<br />
Volny:=PoslBlok;<br />
Buffer.DalsiObs:= PoslBlok; PoslZaznam:= 0<br />
end;<br />
Zapisany:= true<br />
end<br />
end;<br />
procedure CitajHeap (var Subor: TypHeap; K: TypKluca;<br />
var Oblast: TypZaznamu; var Precitany: boolean);<br />
var i, Zarazka: integer;<br />
begin<br />
with Subor↑ do<br />
begin<br />
Precitany:= false;<br />
if Hlava.Obsadeny = 0 then exit {prazdny subor}<br />
with Hlava do<br />
if AktBlok = 0 then {Buffer prazdny}<br />
begin<br />
AktBlok:= Obsadeny;<br />
CitajBlok (Data, Buffer, AktBlok)<br />
end else<br />
begin<br />
ZapisBlok (Data, Buffer, AktBlok); {zachrana aktualneho pred prepisom}<br />
Zarazka:= AktBlok {bude cyklicka prehliadka blokov od AktBlok}<br />
end;<br />
+Heap.doc Strana 4 z 5
with Buffer do {zaciatok cyklickej prehliadky}<br />
repeat {pre kazdy blok suboru}<br />
i:= 0;<br />
repeat {prehliadni Buffer}<br />
inc (i);<br />
if Platny [i] then if Zaznam [i].Kluc=K then Precitany:= true<br />
until (i >= Hlava.PocZaz) or Precitany;<br />
if not Precitany then<br />
begin<br />
if aktBlok =/= Zarazka then<br />
if DalsiObs =/= 0 then AktBlok:= DalsiObs<br />
else AktBlok:= Hlava.Obsadeny;<br />
CitajBlok (Data, Buffer, AktBlok)<br />
end else exit<br />
until Precitany;<br />
Precitany:= true;<br />
Oblast:= Buffer.Zaznam[i];<br />
Hlava. AktZaznam:=i<br />
end<br />
end;<br />
procedure CitajHeapPor (var Subor: TypHeap; I: integer;<br />
var Oblast: TypZaznamu; var Precitany:<br />
boolean);<br />
{ v poradi I-ty zaznam do Oblast}<br />
var Blok, Zazn: integer;<br />
begin<br />
with Subor↑ do<br />
begin<br />
Precitany:= false;<br />
if Obsadeny = 0 then exit {prazdny subor}<br />
Blok:= (I div PocZaz) +1; Zazn:= I mod PocZaz;<br />
if Blok =/= AktBlok then<br />
begin<br />
ZapisBlok (Data, Buffer, AktBlok);<br />
AktBlok:= Blok;<br />
CitajBlok (Data, Buffer, AktBlok)<br />
end;<br />
AktZaznam:= Zazn;<br />
if Platny [AktZaznam] then<br />
begin<br />
Oblast:= Buffer.Zaznam [AktZaznam];<br />
Precitany:= true<br />
end<br />
end<br />
end;<br />
+Heap.doc Strana 5 z 5