Professional Documents
Culture Documents
archivos
Tema5:Indexacindearchivos
1.Bsquedayordenacineficientesobreunarchivo
2.ndicessimplessobreunarchivo
3.Operacionesdemantenimientodeunarchivoindexado
1.Creacin,cargayescritura
2.Agregacinderegistros
3.Actualizacin
4.Eliminacin
4.ndicessecundarios
5.Listasinvertidas
6.VentajaseInconvenientes
1
Indexacinde
archivos
Bsquedayordenacineficientesobreun
archivo
Elmanejodirectodearchivosparaalmacenar
informacinplanteavariosproblemasalahorade
buscarinformacin
Sielarchivonoestordenadoelnicomtododebsquedaposiblees
secuencial,locualnoresultanieficienteniimpracticableenmuchoscasos.
Sielarchivoestordenadopuedeaplicarseunabsquedabinaria,peroen
cualquiercasopuederesultarcostosa,ysielficherorecibemuchasaltasybajas
noresultafactiblemantenerloordenado
Ordenarficherosnoresultaeficiente,ademsdeno
serfactibleenmuchoscasos
SenecesitarandelordendeO(nlogn)accesosadisco.
Pasarlosdatosdediscoamemoriaparaserordenadosesimpracticable
sielarchivoesexcesivamentegrande
2
Indexacinde
archivos
Paratrabajareficientementeconarchivossehace
necesarioelmanejodendices
Unndiceesunaestructuradedatos(enmemoria)
quepermiteelaccesoalainformacinalmacenada
enunarchivoimponiendoalgntipodeorden
Elndicemantieneenmemoria:(1)undatoque
identificaciertainformacin(2)ladireccinfsica(o
lgico)delregistroenelficheroqueguardala
informacincompleta
Normalmenteelndiceguardaladupla(<clave>,<direccin_fsica_fichero>),es
decir,laclaveyladireccinfsicadelfichero(olgica)quepermiteconunnico
accesoleerlainformacincompletaenelfichero
3
Indexacinde
archivos
Laestructuradedatoselegidaparaelndiceen
memoriaesnormalmenteunvectorordenado,peroes
mseficienteutilizaralgntipoderbolbinariode
bsqueda(p.e.unmapadeSTL)
Elnmerodeaccesosaficheroeselmnimoposible
Sloseaccedeunavezconocidalaposicinexactadeldato(parabsquedas,
actualizacionesyborrados)
Lasinsercionesdenuevosdatostambinserealizarnenposicionesconcretasdel
fichero(alfinaloaprovechandohuecosvacos)
Unmismoarchivopuedetenerasociadosdistintos
ndices,dependiendodelcampoasociadoalndicese
denominandiceprimarioondicesecundario
4
Indexacinde
archivos
ndicessimplessobreunarchivo
Unndicesimpleoprimarioesaquelqueguarda
nicamentelallaveprimaria,identificandodeforma
nicaaunregistroalmacenadoenunfichero
Seaelsiguienteficheroconinformacindecanciones:
Clave TtuloIntrpreteAoDuracin
AbbChi01 ChiquititaAbba19793:34
BeaMyb01 MyBonnieBeatles19643:45
BeaCal01 CaliforniaGirlsBeachBoys19651:27
PriIwa01 IWannaBeYourLoverPrince19791:40
EagThe01 TheLongRunEagles19791:15
AbbFer01 FernandoAbba19763:35
BeaTha01 ThankYouGirlBeatles19642:07
BobLik01 LikeARollingStoneBobDylan19651:28
BeaShe01 SheLovesYouBeatles19643:36
RoxLov01 LoveIsTheDrugRoxyMusic19763:03
FleSar01 SaraFleetwoodMac19792:13
EagHot01 HotelCaliforniaEagles19773:28
QueWea01 WeAreTheChampionsQueen19772:16
BeaShe02 She'sAWomanBeatles19643:50
5
Indexacinde
archivos
Elndiceguardaelcampoclaveyladireccinfsicadefichero.Elficheroguarda
losregistrossinordenestablecido
ClaveDireccionfich. ClaveRestodecampos
6
Indexacinde
archivos
Operacionesdemantenimientodeun
archivoindexado
Elmanejodeunndiceimplicarealizarlassiguientes
tareas:
Crearunnuevondiceapartirdeunficherodedatos
Cargarunndiceyaexistenteenmemoriadesdeunficherodendice
Reescribirelficherodendicealfinal
Aadirregistrosalficherodedatos
Eliminarregistrosdelficherodedatos
Modificarregistrosdelfichero
7
Indexacinde
archivos
Crearunndice
Crearunnuevondicesiguelossiguientespasos:
1Recorrerelficherodedatossecuencialmenteeirextrayendodecadaregistroel
campoclave
2Crearladupla<clave,dir_fichero>,siendodir_ficheroladireccinfsicadel
ficherodondeseencuentraenregistrocondichaclave
3Insertardichaduplaenelndiceenmemoria
4Enestemomentoesconvenienteguardarelndiceenficheroparamantenerla
integridaddelsistema.Sehaceunrecorridosecuencialdelndiceyseguardala
dupla<clave,dir_fichero>enelficherodendices
8
Indexacinde
archivos
Cargarelndiceamemoria/Guardarelndiceafichero
Cargarelndiceenmemoria
Recorrerelficherodendicessecuencialmenteconlasduplas<clave,
dir_fichero>,einsertarlosdirectamenteenelndiceenmemoria
Guardarelndiceendisco
Salvarelndicedememoriaalficherodendicesantesdeterminarlaaplicacin
Elficherodedatossiemprepermaneceactualizadoperoelficherodendices
puedeestarcorruptosinosehasalvadocorrectamentedebidoaunainterrupcin
inesperadadelaaplicacin.Pararesolveresteproblemapuedemarcarseel
ficherondiceconalgunaetiquetacuandostesemodificaenmemoria.Siel
sistemafallayseencuentradichamarcaenelficherondice,sesabequehayque
regenerartodoelndiceapartirdelficherodedatos
9
Indexacinde
archivos
Aadirunnuevoregistroalfichero
Aadirunnuevoregistroalficherodedatostambin
implicaaadirunanuevaentradaalndice
1Seextraelaclavedelregistroainsertar
2Sebuscaunaposicinvlidaparainsertarelregistroenelficherodedatos(ver
insercinyactualizadoderegistrosenelTema5)yseinsertaenregistroendicha
posicin
3Seinsertaladupla<clave,dir_fichero>enelndiceenmemoria
AbbChi01 0
... ...
AbbFer01 170
340 FleSar01| Sara|FleetwoodMac|1979|2:13
BeaCal01 68
374 EagHot01| HotelCalifornia|Eagles|1977|3:28
BeaLet01 476
408 QueWea01| WeAreTheChampions|Queen|1977|2:16
BeaMyb01 34
442 BeaShe02| She'sAWoman|Beatles|1964|3:50
BeaShe01 272
476 BeaLet01| Letitbe|Beatles|1970|2:55
BeaShe02 714
BeaTha01 204
... ...
10
Indexacinde
archivos
Eliminarunregistrodefichero
Eliminarunregistroenunficherodedatostambin
implicaeliminarlaentradacorrespondienteenel
ndice
1Sebuscalaclavedeldatoaborrarenelndice,paraconocersulocalizacinen
fichero
2Segnlascaractersticasydisposicindelosdatosenficheroseutilizarun
mtododeborradouotro(verborradoderegistrosenelTema5)
3Seeliminaenmemorialadupla<clave,dir_fichero>delndice
11
Indexacinde
archivos
Actualizarunregistrodefichero
Laactualizacindeunregistroimplicados
situacionesdiferentes:
Sicambiaelvalordelcampoclave,entonces
cambiasuposicinenelndice
Quenormalmenteseimplementaabasederealizarunaoperacindeborrado,
seguidadeunaoperacindeinsercindelregistromodificado
Laactualizacinnoafectaalcampoclave,porlo
quenoelndicenosemodifica
Segneltipoderegistros(registrosdelongitudfijaovariable)elnuevoregistro
seubicaronoenlamismaposicin.Dependiendodeestoserealizaruna
simplemodificacinounaoperacindeborrado/insertado.
12
Indexacinde
archivos
Unaclaseparagestionarunndicesimple.EltipoClavePidentificaeltipode
claveprimaria.Elenterolargoidentificalaposicinfsicadelficherodondese
albergaeldato.Silosregistrosenficherotienenelmismotamaopuedeutilizarse
laposicinlgicaenlugardelafsica:
#include<map>
usingnamespacestd;
template<classClaveP>
classIndice{
map<ClaveP,longint>ind;
public:
Indice();
voidcargar(stringfDatos);
voidsalvar(stringfDatos);
voidinsertar(ClavePclave,longintpos);
longinteliminar(ClavePclave);
longintbuscar(ClavePclave);
};
13
Indexacinde
archivos
ndicessecundarios
Unndicesimplenopermitebsquedasporotros
campos,esdecir,porllavessecundarias
ElndicesimplenoesvlidoparaencontrartodoslosxitosdelosBeatles
Paraellodefinimosunndicesecundariocompuesto
porladupla:<clave_secundaria,clave_primaria>
Comovariosregistrospuedencontenerelmismo
valorenlallavesecundaria,existirnmltiples
entradasenelndicesecundarioporcadaposible
valordelallavesecundaria
14
Indexacinde
archivos
Laconsultaahorasedivideendospasos:
1Localizarla/sclave/ssecundaria/senelndicesecundario.
2Paracadaunadelasclavessecundariascoincidenteslocalizarelrestodelos
datosenelndiceprimario.
Clave_sec.Clave_prim
... ....
Beatles BeaCal01
Beatles BeaIsa01
Beatles BeaIwa01
Beatles BeaMyb01
Beatles BeaPle01
Beatles BeaShe01
Beatles BeaTwi01
... ...
15
Indexacinde
archivos
Operacionesconndicessecundarios
Aadirregistrosimplicaaadirnuevasentradasen
elficherodedatos,ndiceprimarioendices
secundarios
Elborradodeunregistrosuponeeliminartodaslas
referenciasaeseregistroenelsistemadeficheros
Espreferiblequeelndicesecundarioreferenciealaclaveprimariaenvezde
hacerlodirectamentealadireccindefichero.Deestemodopuedeevitarsela
eliminacinenlosndicessecundariossisteprocesoresultasemuyengorroso.El
ndiceprimariodetectaentonceslasincoherenciasalpermanecersiempre
actualizado
16
Indexacinde
archivos
Enlaactualizacinpodemosencontrartrescasos:
Silaactualizacinmodificalaclaveprimaria,entonceshayquemodificartodoel
sistemadeficheros
Sisloafectaalaclavesecundaria,seactualizadichondice.Existensistemas
deficherosqueoptanpornoactualizarlosndicessecundarios.Lasposibles
inconsistenciassonentoncesdetectadasalconsultarelndiceprimario.Estosuele
hacersecuandoelcostedeencontrarincoherenciasesmenorqueelcostede
actualizarlosndices
Sielcampodelndicesecundarionoseveafectadonilaclaveprimariatampoco,
laactualizacinseresuelvesinmscomovimoseneltemaanterior
17
Indexacinde
archivos
Unaclaseparalagestindeunndicesecundario:
#include<multimap>
#include<list>
usingnamespacestd;
template<classClaveS,classClaveP>
classIndiceSec{
multimap<ClaveS,ClaveP>indSec;
public:
IndiceSec();
voidcargar(stringfDatos);
voidsalvar(stringfDatos);
voidinsertar(ClaveSclaveS,ClavePclaveP);
booleliminar(ClaveSclaveS,ClavePclaveP);
list<ClaveP>buscar(ClaveSclaveS);
};
18
Indexacinde
archivos
ndicessecundariosconlistasinvertidas
Laestructuradelndicesecundariointroduceuna
entradaparacadaclavesecundariaduplicada
Paraevitarlodefinimosunnuevondicesecundario
queincluyaparacadaclaveunalistadeclaves
primarias
... ..
..
Beach BeaShu01 BeaSur01 BeaSur02 BeaSur03
Boys
Beatles BeaCal01 Bealsa01 Bealwa01 BeaMyb01
Belmonts BelCom01 BelTel01
BenE
King BenAmo01 BenSta01 BenSpa01 BenSup01
Bert
Kaempfert BerRed01 BerTen01 BerThr01 BenWon01
...
19
Indexacinde
archivos
Sielnmerodeclavessecundariasrepetidasse
esperaqueseaelevadoyelsistemaespera
bsquedasadicionalesporclaveprimaria,podra
optarsepordefinirunmapadeconjuntoscomo
ndicesecundario
Elndicesecundarioseguardaendosficheros
Elficherodendicessecundarioguardaparacada
clavesecundarialadupla<clave_sec,dir_fclave>
Siendoclave_seclaclavesecundariaydir_fclaveladireccindelficherodel
listadodeclavesdondecomienzalaprimeraetiquetadelalistainversa
20
Indexacinde
archivos
Elficherodellistadodeclavesposeeunaentrada
porcadaclaveprimaria<clave_prim,dir_fclave>
Siendoclave_primlaclaveprimariaydir_fclaveladireccindeficherodonde
aparecelasiguienteclaveprimariadelalistainvertida
....
11 BeaCal01 14
12 BeaShu01 24
... .... 13 BemAmo01 15
BeachBoys 12 14 BeaIsa01 17
Beatles 14 15 BenSta01 20
Belmonts 19 16 BeaSur02 22
BenEKing 13 17 BeaIwa01 18
... 18 BeaMyb01 1
19 BelTel01 1
20 BenSpa01 21
21 BenSup01 1
22 BeaSur03 1
23 BelCom01 19
24 BeaSur01 16
21
Indexacinde
archivos
Unaclaseparalagestindeunndicesecundariomediantelistasinvertidas:
#include<map>
#include<list>
usingnamespacestd;
template<classClaveS,classClaveP>
classIndiceSec{
map<ClaveS,list<ClaveP>>indSec;
public:
IndiceSec();
voidcargar(stringfDatos);
voidsalvar(stringfDatos);
voidinsertar(ClaveSclaveS,ClavePclaveP);
booleliminar(ClaveSclaveS,ClavePclaveP);
list<ClaveP>buscar(ClaveSclaveS);
};
22
Indexacinde
archivos
LasdiversasclasesdelSistemadeFicheros,ndice
Primario,ndicesSecundariosyFicherodeDatos
seramanejadoporlaclaseFicheroIndices
SupongamosunSistemadeFicherosenelquesemanejaunnicondice
secundario,unaposibledefinicindelaclaseFicheroIndicesseralasiguiente:
#include<map>
#include<list>
usingnamespacestd;
template<classRegistro,classClaveP,classClaveS>
classFicheroIndices{
Fichero<Registro>fDatos;
Indice<ClaveP>indPrim;
IndiceSec<ClaveS,ClaveP>indSec;
public:
FicheroIndices(stringfDatos);
~FicheroIndices();
voidinsertar(ClavePclaveP,ClaveSclaveS,constRegistro&dato);
voideliminar(ClavePclaveP);
Registrobuscar(ClavePclavep);
list<ClaveP>buscar(ClaveSclaveS);
};
23
Indexacinde
archivos
Ventajaseinconvenientesdelosndices
Losndicespermitenunaccesorpidoyeficientea
losdatosalbergadosendisco.Suestructuraes
relativamentesencillayfcildemantener
Sinembargonosonfactiblescuandoelndicees
demasiadograndeparaalbergarseenmemoria
Esposiblemantenerlosndicesendiscoconla
mismafilosofaquesemanejanenmemoria,pero
dejandesertaneficientesyrpidos
LasolucinaestoscasossonlosrbolesB
24