Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema6:rbolesByB
rbolesByB+
Gestinmediantendicesdegrandes volmenesdeinformacin
Losndicessimplesproporcionanunmtodo sencilloyeficienteparamanejarficherosderegistros PeroQueocurresielvolmendelficheroestal quelosndicesnopuedenmantenerseenmemoria? Mantenerunndicesimpleendisco,aunque posible,esextremadamenteineficiente
Lasinsercionesdebenserordenadas,yportantoimplicanabrirhuecosy desplazarregistros Losborradosimplicaneliminarhuecos(enelficherondicenopuedeutilizarseel borradolgico) Lasbsquedasbinariasrequierendemasiadosaccesos.Buscarunregistroentre 1000000registros 20accesos
2
rbolesByB+
BeaTha01
BeaShe01 BeaShe02
BobLik01
FleSar01 QueWea01
EagHot01
Representacin lgica
Representacin fsica
rbolesByB+
rbolesByB+
Problemagrave:desequilibradodelrboltrasvarias insercionesyborrados
Solucinposible:utilizarunrbolbalanceado(p.e.AVL),aunqueresolverlas rotacionesenelficherorequierenuevosaccesos
Labsquedabinarianoessuficientementeeficiente Elusodeldiscoesmuydeficiente
Cadaaccesoimplicaleerunbloque,ydeestebloquenicamenteseutilizaun registro,cuyosndicesizquierdayderechaapuntan,conmuchaprobabilidad,aun registrodeotrobloque
rbolesByB+
Losndicesmultinivelhacenunusodeldiscomucho mseficientequelosrbolesbinarios
Sedefineunregistrodeclaves,detamaoigualaunbloquedediscooun divisordeste Elndicedeprimernivelconsisteenunficheroderegistrosdeclavescon apuntadoresalficherodedatos Elndicedesegundonivelsirveparaindexarelndicesdeprimernivelytienela mismaestructuraqueste.Cadaentradaaquincluyelaclavedelaprimera entradadecadaregistrodelndicedeprimernivelyunapuntadoraste Elndicedetercernivelindexaaldesegndonivel,etc.
Ficherondicedesegundonivel
AbbChi01|BeaShe01|EagHot01
...
Ficherondicedeprimernivel
AbbChi01|AbbFer01|BeaCal1|BeaMyb01 BeaShe01|BeaShe02|BeaTha01|BobLik01 EagHot01|EagThe01|FleSar01|PriIwa01
...
Ficherodedatos
rbolesByB+
rbolesByB+
rbolesB
Descubiertosen1972porBayeryMcCreight,sonel estndarhoyendaparalaindexacindeficheros dedatos LosrbolesBsonndicesmultinivelqueresuelven losproblemasdelainsercinyborradoderegistros ysebasanendosreglas
Permitirquelosregistrosndicenoestnllenos Nomoverndicesdeunregistroaotrocuandoestlleno.Ensulugar,dividiren doselregistro.Cuandodosregistrosestnmuyvacos,unirlosenunosolo
CadaregistrodeclavesesunnododelrbolB
Elnmeromximodeclavespornodo(m)constituyeelordendelrbolB Elnmeromnimodeclavespermitidasenunnodoesnormalmentelamitaddel ordendelrbol,conlaexcepcindelaraiz
rbolesByB+
Dospropiedadesdelashojas:
Todaslashojastienenlamismaprofundidad(pertenecenalmismonivel) Lashojasposeenapuntadoresalosregistrosenelficherodedatos,deformaque elnivelcompletodelashojasformaunndiceordenadodelficherodedatos
PriIwa01|QueWea01|RoxLov01 AbbChi01|AbbFer01|BeaCal01
BeaMyb01|BeaShe01|BeaShe02
BeaTha01|BobLik01|EagHot01|FleSar01
Ficherodedatos
9
rbolesByB+
BsquedaenunrbolB
Elprocedimientodebsquedaeselsiguiente
10
rbolesByB+
InsercinenunrbolB
Lainsercindeunaclaveserealizamediantedos pasadas:
Unapasadahaciaabajoenlaqueserealizaunabsquedaparaencontrarlahoja quelecorrespondealaclave Unapasadahaciaarribaenlaquesedividenlosnodoscuandoesnecesario
Lospasosaseguirsonlossiguientes
1Realizarlabsquedadelnodohojaquecorrespondealaclave 2Insertarlaclaveenelnodo 3Silainsercinnoesposibleporestarelnodolleno,crearunnuevonodoypasara stelamitaddelasclaves.Realizarlainsercindelaclaveenelnodoquele corresponda 4Silaclaveinsertadaeslamenordelnodo,actualizarlaclaveenelnodopadre(y realizarlomismo,siesnecesario,hastalaraiz) 5Sisehadivididoelnodooriginal,insertarlaprimeraclavedelnuevonodoenel nodopadre(paraellovolveralpaso2)
11
rbolesByB+
Ejemplo:
AbbChi01|BeaCal01
AbbChi01|AbbFer01
BeaCal01|BeaShe01|BeaShe02|BeaTha01
InsertarAbbSar02.Elnodoseinsertasinproblemas
AbbChi01|BeaCal01
AbbChi01|AbbFer01|AbbSar02
BeaCal01|BeaShe01|BeaShe02|BeaTha01
InsertarAbbCas01.Elnodoseinsertasinproblemas,aunquealsituarseenprimera posicinesnecesarioactualizarlaclavedelpadre
AbbCas01|BeaCal01
AbbCas01|AbbChi01|AbbFer01|AbbSar02
BeaCal01|BeaShe01|BeaShe02|BeaTha01
12
rbolesByB+
InsertarBeaShe03.Nohayespacioenelnodo,portantoesnecesariodividiry redistribuirlasclaves.Laclaveseinsertaenelsegundonodo
AbbCas01|BeaCal01|BeaShe02
AbbCas01|AbbChi01|AbbFer01|AbbSar02
BeaCal01|BeaShe01
BeaShe02|BeaShe03|BeaTha01
InsertarAbbBet01.Unasituacinquecombinalasdosanteriores
AbbBet01|AbbFer01|BeaCal01|BeaShe02
AbbBet01|AbbCas01|AbbChi01
BeaShe02|BeaShe03|BeaTha01
AbbFer01|AbbSar02
BeaCal01|BeaShe01
13
rbolesByB+
BorradoenunrbolB
Elborradotambinrequieredospasadas
Unapasadahaciaabajoenlaqueserealizaunabsquedaparaencontrarlahoja quecontienelaclave Unapasadahaciaarribaenlaqueseunennodoscuandosuocupacinbajadel umbralpermitidoyseredistribuyenclavescuandoloanteriornoesposible
Lospasosaseguirsonlossiguientes
1Realizarlabsquedadelnodohojaquecontienelaclave 2Eliminarlaclavedelnodo 3Silaocupacindelnodoessuperioram/2ylaclaveocupabalaprimeraposicin delnodo,actualizarlosnodosdenivelessuperioresestableciendounanueva primeraclave 4Silaocupacindelnodoesinferioram/2yelhermanoalaizquierdaoderecha tieneespaciosuficiente,pasarlasclavesalhermanoyeliminarelnodocompleto. Actualizarelpadreeliminadolaclavecorrespondiente(paraellovolveralpaso2) 5Silaocupacindelnodoesinferioram/2yloshermanosaizquierdaoderechano tienenespaciosuficiente,redistribuirlasclavesconunodelosdoshermanos. Actualizarlasclavesdelosnivelessuperioresparareflejarloscambios
14
rbolesByB+
Ejemplo:
AbbBet01|AbbFer01|BeaCal01|BeaShe02
AbbBet01|AbbCas01|AbbChi01
BeaShe02|BeaShe03|BeaTha01
AbbFer01|AbbSar02
BeaCal01|BeaShe01
BorrarBeaTha01.Laclaveseeliminatrivialmente
AbbBet01|AbbFer01|BeaCal01|BeaShe02
AbbBet01|AbbCas01|AbbChi01
BeaShe02|BeaShe03
AbbFer01|AbbSar02
BeaCal01|BeaShe01
15
rbolesByB+
BorrarBeaShe03.Laocupacindelnodocaepordebajodelumbral.Elhermanoa laizquierdatieneespacioparaalbergarlaclaverestante(BeShe02)
AbbBet01|AbbFer01|BeaCal01
AbbBet01|AbbCas01|AbbChi01
AbbFer01|AbbSar02
BeaCal01|BeaShe01|BeaShe02
BorrarAbbSar02.Situacinsimilaralaanterior
AbbBet01|BeaCal01
AbbBet01|AbbCas01|AbbChi01|AbbFer01
BeaCal01|BeaShe01|BeaShe02
16
rbolesByB+
BorrarBeaCal01.Borradotrivial,aunquealtratarsedelaprimeraclave,es necesarioactualizarelpadre
AbbBet01|BeaShe01
AbbBet01|AbbCas01|AbbChi01|AbbFer01
BeaShe01|BeaShe02
BorrarBeaShe02.Elhermanonotienesitioparaalbergarlaclaverestante. Redistribuirensulugaryactualizarlaprimeraclaveenelpadre
AbbBet01|AbbFer01
AbbBet01|AbbCas01|AbbChi01
AbbFer01|BeaShe01
17
rbolesByB+
LaclaseparaunnododeunrbolB
template<classClaveP,unsignedorden> classNodoArbolB{ ClavePclaves[orden]; longintposiciones[orden]; unsignedocupacion; boolhoja; public: NodoArbolB(); voidinsertar(ClavePclave,unsignedlongposicion); voideliminar(ClavePclave); voiddividir(NodoArbolB&nodo); voidunir(NodoArbolB&nodo); voidredistribuir(NodoArbolB&nodo); longintbuscarIgual(ClavePclave); longintbuscarIgualMenor(ClavePclave); ClavePprimeraClave(); unsignednumClaves(); boolesHoja(); };
18
rbolesByB+
LaclaseparaelrbolB
#include<string> #include<fstream> usingnamespacestd; template<classClaveP,unsignedorden> classArbolB{ Fichero<NodoArbolB<orden,ClaveP>>fDatos; public: ArbolB(stringfDatos,boolcrear=false); voidinsertar(ClavePclaveP,unsignedlongpos); voidborrar(ClavePclaveP); unsignedlongbuscar(ClavePclaveP); };
rbolesByB+
Accesosecuencialindexado:rbolesB+
LosrbolesBproporcionanunasolucindefinitiva alproblemadelaindexacindeunficheroparala bsquedadeundatoporclave PeroQueocurresinuestraaplicacinrequiereun accesosecuencialalosregistrossiguiendola ordenacindadaporlaclave?
Ejemplo:obtencindelistadosordenados
Hastaahoratenemosdosposibilidades:
Mantenerordenadosfsicamentelosregistrosdelficherodedatos.Elrecorrido delficheroessencilloyeficiente,aunqueelcostedemantenerelficheroordenado esaltsimo
20
rbolesByB+
PriIwa01|QueWea01|RoxLov01 AbbChi01|AbbFer01|BeaCal01
BeaMyb01|BeaShe01|BeaShe02
BeaTha01|BobLik01|EagHot01|FleSar01
Ficherodedatos
21
rbolesByB+
Ficherosdesecuenciasdebloques
22
rbolesByB+
Losbloquestienenlassiguientescaractersticas:
Sondetamaofijo.Elmejorrendimientoseconsiguesisutamaoesigualalde unbloquedelsistemadeficheros Unbloquepuedeestarparcialmentevaco,aunquesuocupacinnopuedeser menordel50% Losregistrosdentrodecadabloqueestnordenadosporlaclave Cadabloquecontieneunapuntadoralsiguientebloqueenlasecuencia ordenada.Laordenacinlgicanotienequecoincidirconlafsica
rbolesByB+
Realizarunrecorridoordenadodelosregistroses sencilloyeficiente
Bastaconirleyendodeformaordenadacadabloqueyprocesarlosregistrosen suinterior,siguiendotambinsuordeninterno
Lainsercindeunnuevoregistroenelfichero implicalossiguientespasos
1Localizarelbloquealquepertenece(estoloharemosutilizandounrbolB, comoveremosmsadelante) 2Pasarelbloqueamemoria 3Sielbloquetieneespacioparaelnuevoregistro,realizarsuinsercinenla posicincorrespondiente.Salvarelbloqueenelficheroyterminar 4Sielbloquenotieneespacio,entoncesesnecesariocrearunnuevobloque,al finaldelficherooenunhuecoexistentedeunbloqueborradoanterior.Insertarel nuevobloqueenlalista,acontinuacindelbloqueoriginal 5DeformasimilaralosrbolesB,repartirlosregistrosentrelosdosbloques existenteseinsertarelnuevoregistroenelquecorresponda.Salvarambos bloquesenelfichero
24
rbolesByB+
Ejemplo:
AbbChi01|...$AbbFer01|...$BeaCal01|...$ BeaMyb01|...$BeaShe01|...$BeaShe02|...$ PriIwa01|...$QueWea01|...$RoxLov01|...$ BeaTha01|...$BobLik01|...$EagHot01|...$FleSar01...$
InsertarBeaDer03yBasMan02:
AbbChi01|...$AbbFer01|...$BasMan02|...$BeaCal01|...$BeaDer03|...$ BeaMyb01|...$BeaShe01|...$BeaShe02|...$ PriIwa01|...$QueWea01|...$RoxLov01|...$ BeaTha01|...$BobLik01|...$EagHot01|...$FleSar01...$
InsertarBatCat01:
AbbChi01|...$AbbFer01|...$BasMan02|...$ BeaMyb01|...$BeaShe01|...$BeaShe02|...$ PriIwa01|...$QueWea01|...$RoxLov01|...$ BeaTha01|...$BobLik01|...$EagHot01|...$FleSar01...$ BatCat01|...$BeaCal01|...$BeaDer03|...$
25
rbolesByB+
ElborradoessimilaralborradoenunrbolB
1Localizarelbloquedondeestsituadoelregistro 2Pasarelbloqueamemoria 3Eliminarelregistrodelbloque.Silaocupacindelbloquesiguesiendosuperior al50%terminar 4Encasocontrariocomprobarlaocupacindelosbloquesanterioryposterior 5Siunodelosdostieneespacioparaalbergarlosregistrosdelbloqueactual, pasarstosalbloqueencuestin,desconectarelbloqueactualymarcarcomo borradoparaseraprovechadoeninsercionesposteriores 6Encasocontrario,escogerunodelosdosbloquesyredistribuirlosregistros entreambosbloquesdeformaequitativa
26
rbolesByB+
Ejemplo:
AbbChi01|...$AbbFer01|...$BeaCal01|...$ BeaMyb01|...$BeaShe01|...$BeaShe02|...$ PriIwa01|...$QueWea01|...$RoxLov01|...$ BeaTha01|...$BobLik01|...$EagHot01|...$FleSar01...$
EliminarBeaCal01.Losregistrosrestantessepasanalsegundobloque
AbbChi01|...$AbbFer01|...$BeaMyb01|...$BeaShe01|...$BeaShe02|...$ PriIwa01|...$QueWea01|...$RoxLov01|...$ BeaTha01|...$BobLik01|...$EagHot01|...$FleSar01...$
EliminarQueWea01.Denuevolaocupacindelbloquecaepordebajo del50%.Losregistrosdelosdosprimerosbloquesseredistribuyen
AbbChi01|...$AbbFer01|...$BeaMyb01|...$BeaShe01|...$BeaShe02|...$ FleSar01...|PriIwa01|...$RoxLov01|...$ BeaTha01|...$BobLik01|...$EagHot01|...$
27
rbolesByB+
Larepresentacindeunbloqueenmemoria
template<ClavePclave,classRegistro,unsignedtamBloq> classBloqueReg{ ClavePclaves[tamBloq]; Registroregistros[tamBloq]; unsignedocupacion; unsignedbloqueSig; public: BloqueReg(); voidinsertar(ClavePclave,Registroreg); voideliminar(ClavePclave); Registroleer(ClavePclave); unsignedleerBloqueSig(); voiddividir(BloqueReg&bloque); voidunir(BloqueReg&bloque); voidredistribuir(BloqueReg&bloque); ClavePprimeraClave(); unsignednumReg(); //Iteracinporelbloque voidiniciarIteracion(ClavePclave); boolobtenerSiguiente(ClaveP&clave,Registro®); };
28
rbolesByB+
Ficheroestructuradoenbloques
#include<string> usingnamespacestd; template<classClaveP,classRegistro,unsignedtamBloq> classFicheroBloques{ Fichero<BloqueReg<ClaveP,Registro,tamBloq>>f public: FicheroBloque(stringfDatos); ~Fichero();//Cierraelfichero voidinsertar(unsignedbloq,ClavePclave,constRegistro®); boolbloqueDividido(unsigned&bNuevo); voideliminar(unsignedbloq,ClavePclaveP); boolbloqueUnido(unsigned&bDest); boolbloqueRedistribuido(unsigned&bloq1,unsigned&bloq2); voidleer(unsignedbloq,ClavePclaveP,Registro®); voidactualizar(unsignedbloq,ClavePclaveP,constRegistro®); ClavePprimeraClave(unsignedbloq); //Iteracinporelfichero voidiniciarIteracion(unsignedbloq,ClavePclave); boolobtenerSiguiente(ClaveP&clave,Registro®); };
29
rbolesByB+
rbolesB+
AbbChi01|BeaMyb01
BeaTha01|PriIwa01
AbbChi01...BeaCal01
BeaMyb01...BeaShe02
BeaTha01...FleSar01
PriIwa01...RoxLov01
Ficherodedatos
30
rbolesByB+
31
rbolesByB+
Elborradosiguelossiguientespasos:
LocalizarelbloquealqueperteneceelregistromedianteelrbolB Eliminarelregistro.Siocupabalaprimeraposicin,actualizarlosndices correspondientesenelrbolB Siseproducelaeliminacindeunbloque,eliminarlaentradacorrespondienteen elrbolB Siseproduceunaredistribucinderegistros,actualizarlosndices correspondientesenelrbolB
32
rbolesByB+
LaclaserbolB+
#include<string> usingnamespacestd; template<classClaveP,classRegistro,unsignedtamBloq,unsignedorden> classArbolBMas{ FicheroBloques<ClaveP,Registro,tamBloq>fDatos; ArbolB<ClaveP,orden>indice; public: ArbolBMas(stringfDatos,boolcrear=false); ~ArbolBMas(); voidinsertar(ClavePclaveP,Registroreg); voidborrar(ClavePclaveP); Registrobuscar(ClavePclaveP); //Iteracinporelfichero voidiniciarIteracion(ClavePclaveP); boolobtenerSiguiente(ClaveP&claveP,Registro®); };
33