Está en la página 1de 24

Unidad8

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.

Si cada nodo tiene un mximo de m descendientes.


C/nodo menos la raz tiene al menos (2m1)/3 hijos.
Siesdeordenm=5
NumeroMximoPorNodo:4Clavesy5Ramas
NumeroMnimoPorNodo:3Clavesy4Ramas

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.

También podría gustarte