Sunteți pe pagina 1din 19

?? ?

Algoritmi de prelucrare

Fiiere organizate indexat

Fiier indexat = o pereche de fiiere fiier index (secvenial, sortat) IS Nr.rel. Cheie fiier de date (secvenial) Cmpuri de date
Fiier index 3 - aaaa 6 - aaab 0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa 7 - baca

Fiier de date 0 1 2

10

11

12

13

Articole terse (logic)

Fiiere organizate indexat

Accesul la articole: prin intermediul fiierului index

Tipuri de acces: Secvenial urmtorul articol Direct dup cheie


Fiier index 3 - aaaa 6 - aaab 0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa 7 - baca

Fiier de date 0 1 2

10

11

12

13

Fiiere organizate indexat

Operaii de prelucrare Creare n acces secvenial


n ordinea cheilor, scriere n acces secvenial cheie invalid

Creare n acces direct


scriere n acces direct cheie invalid

Consultare n acces secvenial


n ordinea cheilor citire n acces secvenial, detectare sfrit fiier

Consultare n acces direct


cheie invalid

Fiiere organizate indexat

Operaii de prelucrare Consultare n acces mixt


domeniu de chei / sfrit fiier

Adugare (acces direct)


scriere n acces direct cheie invalid

Modificare
citire (acces secvenial sau direct), modificare rescriere

tergere n acces secvenial / direct

Fiiere organizate indexat

Operaii de baz

(implementate prin subprograme)

Deschidere ca fiier nou (creare) Deschidere ca fiier existent nchidere fiier Cutare cheie Citire articol n acces secvenial Citire articol n acces direct Scriere articol n acces secvenial Scriere articol n acces direct tergere articol n acces secvenial tergere articol n acces direct Sortare (i curare) tabel index

Fiiere organizate indexat


Deschidere fiier existent
Deschide (nume) nume_i=nume+.idx nume_d=nume+.dat deschide nume_i, rb+ deschide nume_d, rb+ Stop

Creare fiier nou


Fiier nou (nume) nume_i=nume+.idx nume_d=nume+.dat deschide nume_i, wb deschide nume_d, wb Stop

nchidere fiier
nchide nchide nume_i nchide nume_d Stop

Fiiere organizate indexat


Cutare cheie
Cauta_cheie(cheie, gsit) gsit = 0 Calcul nr. articole din fiierul index n ls = 0, ld = n - 1 ls<=ld i !gsit
Nu Nu Nu Da Da

m = (ls + ld) / 2 Poziionare n index la poziia m Articol din index a


Nu

a.cheie == cheie
Da

Da

a.cheie > cheie

gsit = 1

gsit == 1

ls = m + 1

ld = m - 1

Poziionare n index la poziia m Stop

Fiiere organizate indexat


Citire n acces secvenial Citire n acces direct

citire_sec(a, r) Articol din index (ind) ai


Nu

citire_cheie(a, cheie, r) Cutare cheie n index


Da

feof( ind )

Nu

Succes?

Da

Poziionare n fi. de date (f) la poziia indicat de art. citit din fi. index (ind) ai.poz Articol din fi. date (f) a r=1 Stop

r=0

r=0

Articol din index (ind) ai Poziionare n fi. de date (f) la poziia indicat de art. citit din fi. index (ind) ai.poz Articol din fi. de date (f) a r=1 Stop

Fiiere organizate indexat

Scriere articol n acces secvenial Articol a, cheia bacb baca < bacb
Fiier index 3 - aaaa 6 - aaab 0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa 7 - baca

14 - bacb

Fiier de date 0 1 2

10

11

12

13

14

Fiiere organizate indexat


Scrie_sec(a, r)
Da

Scriere n acces secvenial


Nu

Calcul nr. articole din fiierul index n n>0


Nu

Poziionare n index la poziia n-1 Articol din index ai ai.cheie >= a.cheie
Da

Calcul nr. art. din fiierul de date nd ai.is = 1 ai.cheie = a.cheie ai.poz = nd Articol ai n index Articol a n fi. de date r=1 Stop

Calcul nr. art. din fiierul de date nd ai.is = 1 ai.cheie = a.cheie ai.poz = nd Articol ai n index Articol a n fi. de date r=1

r=0

Fiiere organizate indexat

Fiier index 3 - aaaa 6 - aaab

Scriere articol n acces direct Articol a, cheia abab


0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa 7 - baca 14 - abab

Fiier de date 0 1 2
Fiier index 3 - aaaa 6 - aaab

10

11

12

13

14

0 - aaac

12 - aaba 8 - abaa 14 - abab 13 - abba 4 - baaa

7 - baca

Fiier de date 0 1 2

10

11

12

13

14

Fiiere organizate indexat


Scriere n acces direct
Nu

Scrie_cheie(a, r) Cutare a.cheie n index Succes?


Da

Calcul nr. art. din fiierul de date nd ai.is = 1 ai.cheie = a.cheie ai.poz = nd Poziionare n index la sfrit Articol ai n index Articol a n fi. de date r=1 Sortare index Stop

r=0

Fiiere organizate indexat

tergere articol n acces secvenial


Fiier index 3 - aaaa 6 - aaab 0 - aaac 12 - aaba 8is abaa 13 - abba 4 - baaa -=0 7 - baca

Fiier de date 0 1 2

10

11

12

13

Fiier index 3 - aaaa 6 - aaab

0 - aaac

12 - aaba 13 - abba 4 - baaa

7 - baca

Fiier de date 0 1 2

10

11

12

13

Fiiere organizate indexat


terge_sec(r)

tergere n acces secvenial


Nu

Calcul poziie curent n index pos Articol ai din index feof( ind )
Da

Poziionare n index la poziia pos ai.is = 0 Articol ai n index r=1 Sortare index Stop

r=0

Fiiere organizate indexat


tergere n acces direct

terge_cheie(cheie,r) Cutare cheie n index


Nu

Succes?

Da

r=0

terge_sec(r)

Stop

Fiiere organizate indexat


Sortare (i curare) fiier index
Sortare() Creare fiier temporar (temp) Copiere articole valide din index (ind) n temp nchidere index Sortare temp dup cmpul cheie terge index vechi (ind) Redenumete temp cu numele fiierului index vechi Stop

Fiiere organizate indexat

Alte probleme de rezolvat (tem)


Recuperare articole terse
Adugarea unui articol n fiierul index, apoi sortare

Compactare fiier de date (eliminare articole terse)


Parcurgere index, cu copierea articolelor de date ntr-un fiier nou i actualizarea articolelor din fiierul index cu noile poziii

mbuntirea sortrii fiierului index


La tergere: e suficient copierea articolelor valide ntr-un fiier nou La adugare: e suficient mutarea unui grup de articole i inserarea articolului nou pe poziia corect n cazul tergerii repetate n acces secvenial, sortarea e necesar doar o dat, la sfrit

Ho,
Prelucrarea fiierelor indexate Algoritmi de prelucrare

Ho,

Ho!

S-ar putea să vă placă și