Fişiere indexate Algoritmi și operații de bază ?? ? ? Fişiere organizate indexat Fişier indexat = o pereche de fişiere C.
Download ReportTranscript 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