Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arboles B
Arboles B
rbolesB
Bibliografa:AlgoritmosyEstructurasdedatosdeAguilaryMartinez.Unidad16
Autor:IngRolandoSimonTitiosky.
ProblemasdelosAVL
LosAVLtienenunaEficienciaF(n)=logn.
Sualturadependedelacantidaddenodos.
ANivelk,tendr2k+11nodos.
Cuandosetienenunconjuntomasivode
datos(ej1millondeRegistrosdeClientes
deunbancoequivalenk @ 19niveles),los
datosestarnubicadosenDiscos.
ElTiempodeAccesoadiscoesnotablemente
superiorqueeldeRAM.
Esnecesariominimizarestosaccesosaldisco
ymaximizarelusodeRAM
DefinicinderbolB
Solucin:rbolesdeBsquedamarios.
CadaNodopuedetenerhastamsubrboles.
LasclavesseorganizanenAVL.
Objetivo:Quelaalturadelrbolseapequea,
pueslasiteracionesylosaccesoadisco
dependerdeello.
ElrbolBesunasolucinparticulardeestatecnologa
39
39
45
45 62
62
20
20 30
30
4
4 13
13 15
15 16
16
22
22 25
25 29
29
33
33 34
34
41
41 42
42
47
47 52
52
63
63 73
73
CaractersticasdelrbolB
Esmariosysinsubrbolesvacos.
Siempreestperfectamenteequilibrado.
Pgina:nombredesusnodos.Selosaccedeen
bloque.
TodaslasPginasestnenelmismonivel
ComoMximo:mRamasym1Claves
ComoMnimo: (m/2)+1Ramasy(m/2)Claves
LaRaizpuedeestarvacaoinclusotener1Clave,
consus2ramas.
39
39
45
45 62
62
20
20 30
30
4
4 13
13 15
15 16
16
22
22 25
25 29
29
33
33 34
34
41
41 42
42
47
47 52
52
63
63 73
73
CaractersticasdelrbolB
LasclavesdividenelespaciodeclavescomoenelAVL
Losrbolesqueestudiaremosserndeordenm=5
UnordenmayoraumentalacomplejidaddelaInsercinyBorrado.
UnOrdenmenordisminuyelaeficienciadeBsqueda
NumeroMximoPorNodo:4Clavesy5Ramas
NumeroMnimoPorNodo:2Clavesy3Ramas
Serastreaelcaminodebsquedaaligualqueenelrbol
deBsqueda.
a b c d
<a
>a
<b
>b
<c
>c
<d
>d
Variantes:B+
Los rboles B+ permiten un recorrido secuencial mas
rpido que el B pues
Las claves se encuentran en el Indice Y en las hojas
Existe un puntero ProximaPagina.
Variante:B*
Propone nuevas reglas para el mantenimiento.
Losnodosdebenestar2/3llenossiempre.
LanuevaconstruccinlograunabsquedamsrpidaqueelB+perouna
insercinmscostosa.
Recuerden:EnArbolB
C/nodo menos la raz tiene al menos (m/2)+1 hijos.
NumeroMximoPorNodo:4Clavesy5Ramas
NumeroMnimoPorNodo:2Clavesy3Ramas
TADarbolB:ArbolB.h
/*DefinicindelosDatosdelTAD*/
#definem5
/*OrdendelrbolB: ComoMximo:mRamasy m1Claves*/
typedefinttipoClave
typedefstructpagina
{ tipoClaveclaves[m]
/*m{0..4}Numerodeclavesserfor(k=1kmk++)*/
structpagina*ramas[m]
intcuenta
/*Numerodeclavesdelapagina*/
}Pagina
/*DefinicindelasOperacionesdelTAD*/
voidescribeNodo(Pagina*actual)
intnodoLLeno(Pagina*actual) /*Devuelveverdaderosielnumerodeclavesesm1*/
intnodoSemiVacio(Pagina*actual)/*Devuelve.V.sielnumerodeclavesesmenoram/2*/
voidcrearArbolB(Pagina**raiz)
Pagina*buscar(Pagina*actual,tipoClavecl,int*indice)
Pagina*buscarNodo(Pagina*actual,tipoClavecl,int*k)
voidinsertar(Pagina**raiz,tipoClavecl)
.
TADarbolB:ArbolB.c
intnodoLLeno(Pagina*actual)
0
{return(actual>cuenta==m1)
}
1 2 3 4
C1 C2 C3 C4
R0 R1 R2 R3 R4
intnodoSemiVacio(Pagina*actual)
{ return(actual>cuenta<m/2)}
voidescribeNodo(Pagina*actual)
{ intk
printf("\nNodo:")
for(k=1k<=actual>cuentak++)
printf("%d",actual>claves[k])
printf("\n")
}
BsquedadeunaClaveenrbolB
Hayqueinspeccionarenc/Pginatodas
lasclavesdequeconstaparadefinir:
LaPosicinpropiadelaclave
Elptralaramaquenosllevaralaclave
buscar():desciendeporelrbolporla
rutadeterminadaporlaclaveylosnodos.
buscarNodo():funcinauxiliarquerealiza
lainspeccininternadec/pgina.
CodificacindelaBsquedaenrbolB
Pagina*buscar(Pagina*actual,tipoClavecl,int*indice)
{ if(actual==NULL)returnNULL/*Noloencontr*/
else{ intesta=buscarNodo(actual,cl,indice)
if(esta)returnactual
else
returnbuscar(actual>ramas[*indice],cl,indice)
}
}
intbuscarNodo(Pagina*actual,tipoClavecl,int*k)
{ intencontrado/*KindicalaposicindentrodelasClaves*/
if(cl<actual>claves[1])/*Laclaveesmenorquelamenorclavedeestapagina*/
{
encontrado=0
*k=0 /*Indicaquedebeseguirporelptralapaginaconclavesmaschicas*/
}
else{ /*examinanlasclavesdelnodoenordendescendente*/
*k=actual>cuenta
while((cl<actual>claves[*k])&&(*k>1)) (*k)
encontrado=(cl==actual>claves[*k])
}
returnencontrado
}
ProcesodeFormacindeunrbolB
UnrbolBcrecenHaciaArriba,hacialaraiz
Lasclavesqueseinsertan,siemprevanenunnodohoja.
Porserperfectamenteequilibrado,todahojaestalmismonivel.
PasosdelalgoritmoparaInsertar unanuevaclave:
1. SeBuscalaclaveainsertarenelrbol.Paralocualsedesciendepor
elcaminodebsquedahastaunahoja.
2. SinoestenelrbolEntoncesEmpiezalaInsercin.
3. EstLlenalaPgina?(actual>cuenta==m1)
HayLugar(cuenta<m1):
InsertaeneseNodo.ActualizaCuenta.Finproceso
Sellen:Nosepuedeinsertarall:
SedividelaPginaen2Paginasalmismonivelquetodaslasdems,
extrayendolaclavemediana(param=5eslaclave[3])
ConestaMediana,sesubeporelcaminodeBsquedaysecomienzael
procesodesdeelpaso1nuevamente.
Estaprocesodeascensindelaclavemedianapuedellegarhasta
elnodoraiz,quetambinsepartirysuMediana,subiendo,ser
lanuevaraizdetodoelrbolB.
EjemplodeInsercinenrbolBm=5
SecuenciadeInsercin:6,11,5,4,8,9,12,21
6
4 5 6 11
4 5
1ro:6,11,5,4
8 11
2do:8
6 11
6
6
4 5
8 9 11 12
3ro:9,12
4 5
8 9
12 21
4to:21
Continuarinsertando:14,10,19,28,3,17,32,15,16,26,27.(Respuestaenpag487)
CodificacindelaInsercinenrbolB
ELAlgoritmodeInsercinseimplementaconvarias
funcionesAuxiliares.
Insertar(): eslainterfazdeoperacin.
Empujar(): eslaencargadaderealizarefectivamentela
insercin.BajarySubirporelcaminodeBsqueda
localizandoelPuntodeInsercin.Empujar,cuando
necesite,laMedianahaciaarriba.
buscarNodo(): Determinalaramapordondebajarpara
encontrarlaclave.
meterHoja():encasodeinsertarunaclavesindivision
dePgina.
dividirNodo(): SecreaunnuevoNodoalquese
desplazanlasclavesmayoresdelaMedianaysus
ramas,dejandoeneloriginallasclavesmenores.
AscenderlaMedianamedianteelArgumento&mediana,que
alretornarlasllamadasrecursivas,lainsertaenelNodo
Antecedente.
CodificacindeInsercinenrbolB:insertar()
EslaInterfacedeInsercin.
EncasodequelapropagacinlleguealaRaiz,crearunanueva.
voidinsertar(Pagina**raiz,tipoClavecl)
{ intsubeArriba
tipoClavemediana
Pagina*p,*nd
empujar(*raiz,cl,&subeArriba,&mediana,&nd)
if(subeArriba)/*CrecedeNivelxlaraiz,silapropagacinllegaalacima*/
{
p=(Pagina*)malloc(sizeof(Pagina))
p>cuenta=1
p>claves[1]=mediana
p>ramas[0]=*raiz
p>ramas[1]=nd
*raiz=p
}
}
CodificacindeInsercinenrbolB:empujar()
voidempujar(Pagina*actual,tipoClavecl,int*subeArriba,tipoClave*mediana,
Pagina**nuevo)
{ intk/*Posicindentrodelespaciodeclavesdelapagina*/
if(actual==NULL)/*Encontrunaramavacaenelcaminodebsqueda,Activalosindicadores*/
{
*subeArriba=1
*mediana=cl
*nuevo=NULL
}
else{intesta=buscarNodo(actual,cl,&k)/*Bajahastaunaramavaca*/
if(esta) {
puts(\nClaveduplicada)
*subeArriba=0return
}
empujar(actual>ramas[k],cl,subeArriba,mediana,nuevo)
/*LaRecursindevuelveelcontrolvuelveporelcaminodebsqueda*/
if(*subeArriba)/*Ser1cuandosurama=null=>insertarpuesnopodemosseguirbajando*/
{if(nodoLLeno(actual))
dividirNodo(actual,*mediana,*nuevo,k,mediana,nuevo)
else{
*subeArriba=0
meterHoja(actual,*mediana,*nuevo,k)
}
}/*DejardeelevarMedianascuandopueda,almenosunavezmeterHoja*/
}
}
EliminacindeunaclaveenrbolB
PropiedaddelosrbolB:Siunaclavenoest
enunahoja,laclavepredecesoraosucesora
enelordennaturaldelrbol,estnenhojas.
Ej:45noesHoja,peroel32yel48si.
Seprocedeasustituirlaporlaclavesucesorao
predecesoraquesiestenunahoja.
Perosilahojaquedaconmenosdelmnimode
claves,hayquemoverclavespararestablecerla
estructuradelrbolB
45
45
79
79
16
16 26
26
5
5
9
9
15
15
18
18 22
24
22 24
29
29 32
32
48
48 57
57
172
172
82
82 126
126
192
192 232
232
AlgoritmodeEliminacindeunaclaveenrbolB
1erCaso:LaHojadelSucesortienemasdelmnimo
BuscarlaClaveysuSucesor.
Sustituirlaclavedebsquedaconlaclavesucesoraqueestenunahoja.
2doCaso:LaHojadelSucesortienemenosdelmnimo,perolos
Adyacentesmas.
ExaminarlosnodosadyacentesalNodoaBorrar
SiunnodoAdyacentetienemasclavesquelamnima,sepuedesubirla
claveelegidaalnodoAntecedente.
SebajadelNodoAntecedentelaclavehaciaelNodoProblema
3erCaso:LaHojadeSucesoryAdyacentetienemenosdelmnimo
TomarelNodoProblema,elNodocontiguoylaclavemedianadeambos
(procedentedelnodoAntecedente)yseloscombinaparaformarunnico
Nodo.
SidejaalNodoAntecedentemenosdelmnimodelclaves,elprocesose
propagahaciaarriba:EllimiteestecasoesbajarlaRaiz:laalturadel
rbolBdisminuye.
45
45
16
16
5
5
9
9
15
15
18
18
22
22
24
24
29
29
79
79
26
26
32
32
48
48
57
57
172
172
82
82
126
126
192
192
232
232
EliminacindeunrbolB.Ejemplo
45
45
Eliminarel16(1erCaso)
79
79
16
16 26
26
5
5
15
15
9
9
18
18 22
24
22 24
29
29 32
32
82
82 126
126
192
192 232
232
45
45
Seeliminel16
Eliminarel24(2doCaso)
18
18 26
26
5
5
29
29 32
32
9
9
48
48 57
57
172
172
15
15
22
24
22 24
79
79
48
48 57
57
172
172
82
82 126
126
192
192 232
232
18
18
5
5
9
9 15
15
5
5
9
18 22
22
15 18
9 15
5 9
45
45
22
22
79
15 26
18 22 29 32
48 57
172
172
82 126
Eliminamosel24
192 232
232
EliminacindeunrbolB.Ejemplo
45
45
Eliminarel22(3doCaso)
79
79
15
15 26
26
5
5
18
22
18 22
9
9
29
29 32
32
48
48 57
57
172
172
82
82 126
126
1ero
2do
15
15 26
26
5
5
9
9
3ero
5
5
29
29 32
32
18
18
9
9
26
26
79
79
26
26 45
79
4579
172
172
Resultado:
DisminucindeNivel
9
9
26
26
29
29 32
32
4to
45
45
5
5
15
15 18
18
192
192 232
232
15
15 18
18
26
26 45
79
4579
29
29 32
32
172
172
172
172
48
48 57
57
82
82 126
126
192
192 232
232
CodificacinEliminacinrbolB
ELAlgoritmodeEliminacinimplementavarias
funcionesAuxiliares.
Eliminar():interfazdeoperacin,pasaelcontrola
eliminarRegistro():controlatodoelprocesodeborrado.
buscarNodo():Determinalaposicindelaclaveenelarbol.
sucesor():encuentralaclaveMenor,dentrodelSubConjuntode
ClavesMayoresalaClaveaborrar,yhacelasustitucin.
quitar(): silaclaveestaenunnodohoja,quitalaclavedeally
terminaelproceso.
restablecer():restauraelordendelrbolB,deacuerdoalestado
desusHermanosDerechoseIzquierdo.
moverIZQ()ymoverDER():apoyaarestablecerencasodelos
hermanos(IZQoDER)tenganmenosdelmnimo.
combina():silasclavessonmenoresqueelmnimojuntalos
nodosimplicados.
CodificacindelaEliminacinen
rbolB:eliminar()
voideliminar(Pagina**raiz,tipoClavecl)
{
intencontrado
eliminarRegistro(*raiz,cl,&encontrado)
if(encontrado)
{
printf(Clave%deliminada\n,cl)
if((*raiz)>cuenta==0)
{/*Laraizestvaca,liberaelnodoyseestablecelanuevaraz*/
Pagina*p=*raiz
*raiz=(*raiz)>ramas[0]
free(p)
}
}
else
puts(Laclavenoseencuentraenelrbol\n)
}
CodificacindelaEliminacinenrbolB:eliminaRegistro()
voideliminarRegistro(Pagina*actual,tipoClavecl,int*encontrado)
{ intk
if(actual!=NULL)
{*encontrado=buscarNodo(actual,cl,&k)/*buscalahojaconlaclave*/
if(*encontrado)
{ if(actual>ramas[k1]==NULL)/*esunnodohoja*/
quitar(actual,k)/*quitalaclavedelahoja*/
else{ sucesor(actual,k)/*encuentralaclavesucesorayhaceelswap*/
eliminarRegistro(actual>ramas[k],actual>claves[k],encontrado)
/*ComovaconlaPaginaDescendente,buscarhastaencontrarlapaginahoja
conelquedatoSucesor(queyasecambio)yloquitar*/
}
}
elseeliminarRegistro(actual>ramas[k],cl,encontrado)
/*Lasllamadasrecursivasdevuelvencontrolenestepunto.Secompruebaelnmerodeclavesdelnodo
descendiente,desdeelnodoactualenlarutadebsquedaseguida.*/
if(actual>ramas[k]!=NULL)
if(actual>ramas[k]>cuenta<m/2)restablecer(actual,k)
}
else*encontrado=0
}
TrabajosPrcticosUnidad8
COMOMINIMO,REALIZAR:
DelaBibliografa
DelCapitulo16:
Ejercicios:16.1,16.2,16.8
Problemas:
ImplementarconrbolesBlosproblemas:14.2,
14.3,14.7
Complementarios
DisearunrbolB,sinutilizarlasestructuras
estudiadas.
ProponerunTADdealmenos5operaciones.
Implementaralmenos2.