Fişiere indexate Algoritmi și operații de bază ?? ? ? Fişiere organizate indexat  Fişier indexat = o pereche de fişiere C.

Download Report

Transcript Fişiere indexate Algoritmi și operații de bază ?? ? ? Fişiere organizate indexat  Fişier indexat = o pereche de fişiere C.

Fişiere indexate
Algoritmi și operații de bază
?? ?
?
Fişiere organizate indexat
 Fişier indexat = o pereche de fişiere
C. Cîmpuri de date
▪ fişier de date (secvenţial)
▪ fişier index (secvenţial, sortat)
Nr.rel. Cheie
Fişier index
3 - aaaa 6 - aaab
Fişier de date
0
1
2
0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa
3
4
5
6
7
8
Articole şterse
(logic)
9
10
11
7 - baca
12
13
Fişiere organizate indexat
 Accesul la articole: prin intermediul fișierului index
 Tipuri de acces:
▪ Secvențial  următorul articol (în ordinea cheilor)
▪ Direct  după cheie
▪ Mixt
Fişier index
3 - aaaa 6 - aaab
Fişier de date
0
1
2
0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa
3
4
5
6
7
8
9
10
11
7 - baca
12
13
Fişiere organizate indexat
 Operaţii de prelucrare
▪ Populare în acces secvenţial
 în ordinea cheilor, scriere în acces secvenţial
 cheie invalidă
▪ Populare în acces direct
 scriere în acces direct
 cheie invalidă
▪ Consultare în acces secvenţial
 în ordinea cheilor
 citire în acces secvenţial, detectare sfîrşit fişier
▪ Consultare în acces direct
 cheie invalidă
Fişiere organizate indexat
 Operaţii de prelucrare
▪ Consultare în acces mixt
 domeniu de chei / sfîrşit fişier
▪ Adăugare (acces direct)
 scriere în acces direct
 cheie invalidă
▪ Modificare
 citire (acces secvenţial sau direct), modificare
 rescriere
▪ Ştergere în acces secvenţial / direct
Fişiere organizate indexat
 Operaţii de bază
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
(implementate prin subprograme)
Deschidere ca fişier nou (creare)
Deschidere ca fişier existent
Închidere fișier
Căutare cheie
Citire articol în acces secvenţial
Citire articol în acces direct
Scriere articol în acces secvenţial
Scriere articol în acces direct
Ştergere articol în acces secvenţial
Ştergere articol în acces direct
Sortare (şi curăţare) tabelă index
Fişiere organizate indexat
Creare fişier nou
Deschidere
fişier existent
Închidere fişier
Fișier nou (nume)
Deschide (nume)
Închide
nume_i=nume+”.idx”
nume_i=nume+”.idx”
închide nume_i
nume_d=nume+”.dat”
nume_d=nume+”.dat”
închide nume_d
deschide nume_i, “wb”
deschide nume_d, “wb”
Stop
deschide nume_i, “rb+”
deschide nume_d, “rb+”
Stop
Stop
Fişiere organizate indexat
Căutare cheie
Cauta_cheie(cheie, găsit)
Da
găsit = 0
m = (ls + ld) / 2
Calcul nr. articole din
fișierul index n
Poziționare în
index la poziția m
ls = 0, ld = n - 1
Articol din
index a
ls<=ld
și !găsit
Nu
Nu
Nu
găsit==1
Nu
Da
Poziționare în
index la poziția m
Stop
ls = m + 1
a.cheie > cheie
a.cheie == cheie
Da
ld = m - 1
Da
găsit = 1
Fişiere organizate indexat
Citire în
acces
secvenţial
citire_sec(a, r)
citire_cheie(a, cheie, r)
Articol din
index (ind) ai
Nu
! feof( ind )
Poziționare în fiș.
de date (f) la
poziția indicată de
art. citit din fiș.
index (ind) ai.poz
Citire în
acces
direct
Căutare cheie în
index
Da
r=0
Nu
Succes?
Da
Articol din
index (ind) ai
r=0
Poziționare în fiș. de date (f)
la poziția indicată de art. citit
din fiș. index (ind) ai.poz
Articol din
fiş. date (f) a
Articol din fiș.
de date (f) a
r=1
r=1
Stop
Stop
Fişiere organizate indexat
 Scriere articol în acces secvențial
▪ Articol a, cheia bacb
baca < bacb
Fişier index
3 - aaaa 6 - aaab
Fişier de date
0
1
2
0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa
3
4
5
6
7
8
9
10
11
7 - baca
12
14 - bacb
13
14
Fişiere organizate indexat
Scrie_sec(a, r)
Scriere în
acces
secvenţial
Da
Poziționare în
index la poziția n-1
Calcul nr. articole din
fișierul index n
Nu
Articol din
index ai
n>0
Nu
ai.cheie>=a.cheie
Calcul nr. art. din
fișierul de date nd
Calcul nr. art. din
fișierul de date nd
ai.is = 1
ai.cheie = a.cheie
ai.poz = nd
ai.is = 1
ai.cheie = a.cheie
ai.poz = nd
Articol ai în index
Articol a în fiș. de date
Articol ai în index
Articol a în fiș. de date
r=1
r=1
Stop
Da
r=0
Fişiere organizate indexat
 Scriere articol în acces direct
▪ Articol a, cheia abab
Fişier index
3 - aaaa 6 - aaab
Fişier de date
0
1
2
0 - aaac 12 - aaba 8 - abaa 13 - abba 4 - baaa
3
Fişier index
3 - aaaa 6 - aaab
Fişier de date
0
1
2
4
0 - aaac
3
4
5
6
7
8
9
10
11
7 - baca 14 - abab
12
13
12 - aaba 8 - abaa 14 - abab 13 - abba 4 - baaa
5
6
7
8
9
10
11
12
14
7 - baca
13
14
Fişiere organizate indexat
Scrie_cheie(a, r)
Scriere în
acces direct
Căutare a.cheie în
index
Nu
Succes?
Calcul nr. art. din
fișierul de date nd
Da
r=0
ai.is = 1
ai.cheie = a.cheie
ai.poz = nd
Poziționare în
index la sfîrșit
Articol ai în index
Articol a în fiș. de date
r=1
Sortare index
Stop
Fişiere organizate indexat
 Ștergere articol în acces secvențial
Fişier index
3 - aaaa 6 - aaab
Fişier de date
0
1
2
= 0 13 - abba 4 - baaa
0 - aaac 12 - aaba 8is- abaa
3
Fişier index
3 - aaaa 6 - aaab
Fişier de date
0
1
2
4
0 - aaac
3
4
5
6
7
8
9
12 - aaba 13 - abba 4 - baaa
5
6
7
8
9
10
11
7 - baca
12
13
7 - baca
10
11
12
13
Fişiere organizate indexat
Șterge_sec(r)
Ştergere în
acces
secvenţial
Calcul poziție
curentă în index pos
Articol ai din index
Nu
feof( ind )
Poziționare în
index la poziția pos
Da
r=0
ai.is = 0
Articol ai în index
r=1
Sortare index
Stop
Fişiere organizate indexat
Ştergere în
acces direct
Șterge_cheie(cheie,r)
Căutare cheie în
index
Nu
Succes?
Da
Șterge_sec(r)
r=1
Stop
În funcție de scopul urmărit se poate interpreta astfel:
- „vreau să nu existe în fișier un articol cu cheia cheie”: dacă un astfel de articol nu
există, atunci operația de ștergere se termină cu succes, deci r=1
- „vreau să fac o ștergere”: dacă articolul cu cheia cheie nu există, atunci operația
nu se efectuează, deci se termină cu „eșec” => r=0
Fişiere organizate indexat
Sortare (şi curăţare)
fişier index
Sortare()
Creare fișier temporar (temp)
Copiere articole valide din
index (ind) în temp
Închidere index
Sortare temp
după cîmpul cheie
Șterge index vechi (ind)
Redenumește temp cu numele
fișierului index vechi
Stop
Fişiere organizate indexat

Alte probleme de rezolvat (temă)
 Recuperare articole șterse
▪
Adăugarea unui articol în fișierul index, apoi sortare
 Compactare fișier de date (eliminare articole șterse)
▪
Parcurgere index, cu copierea articolelor de date într-un fișier nou și
actualizarea articolelor din fișierul index cu noile poziții
 Îmbunătățirea sortării fișierului index
▪
▪
▪
La ștergere: e suficientă copierea articolelor valide într-un fișier nou
La adăugare: e suficientă mutarea unui grup de articole și inserarea articolului
nou pe poziția corectă
În cazul ștergerii repetate în acces secvențial, sortarea e necesară doar o
dată, la sfîrșit
Fişiere organizate indexat

Imbunătățiri
 Încărcarea fișierului index în memorie
▪
▪
▪
Încărcare imediat după deschidere
Salvare înainte de închidere
Utilizarea unor structuri de date mai potrivite căutării rapide (arbori)
▪
Probleme suplimentare legate de ordinea articolelor în fișierul index
Prelucrarea fişierelor indexate
Algoritmi de prelucrare