24.07.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!