Está en la página 1de 144

CC3001AlgoritmosyEstructurasdeDatos:Repasode

Programacin
Enestaseccinserevisarnloselementosbsicosquesevanautilizarparaescribirprogramas.Estosupone
quelosalumnosyasabenprogramar,yesslounresumenyunaordenacindeconceptos.Lanotacin
utilizadaesladellenguajeJava,perolosconceptossonmsgeneralesyseaplicanamuchosotroslenguajes
similares.

Datos
Losprogramasrepresentanlainformacinquemanejanmediantevaloresllamados"constantes",ydichos
valoressealmacenanen"variables".

Variables
intk;//entero
floatx;//real
doubleprom;//realdedobleprecisin
booleancondicion;//verdaderoofalso
charc;//uncarcter
Stringnombre;//secuenciadecaracteres
Ntesequelasecuencia"//"indicaelcomienzodeuncomentario,elcualseextiendehastaelfinaldelalnea.

Constantes
3//int
4.50//float
1e6//float
'a'//char
"hola"//String

InstruccionesElementales
Asignacin
Estaeslainstruccinmssimple,quepermitemodificarelvalordeunavariable:
a=E;//asignaalavariable'a'elvalordelaexpresin'E'
Ejemplos:

k=0;
k=k+1;
k+=1;
++k;
k++;
Lastresltimassonabreviaturas.Lanotacin"+="permiteevitarrepetirelladoizquierdodelaasignacin.Las
dosltimasincrementanelvalordelavariableen1,perodifierenrespectodelvalorretornado.Enelprimer
caso(preincremento)seincrementaprimeroyluegoseretornaelvalorresultante.Elelsegundocaso
(postincremento)seincrementadespus,yseretornaelvalorpreviodelavariable.

Salida
System.out.println("Hola!");

InstruccionesCompuestas
Estasinstruccionesseformanagrupandoaotrasinstrucciones,yaseanelementalesocompuestas,usandolas
reglasdesecuencia,alternacin(if)eiteracin(while).

Secuenciadeinstrucciones
Ungrupodeinstruccionesescritasunaacontinuacindelaotraseejecutanenesemismoorden:
instruccin1;
instruccin2;
...
Tambinesposibleagruparlasinstruccionesentrellavesparaqueseanequivalentesaunasolainstruccin:
{
instruccin1;
instruccin2;
...
}
Ejemplo:
//Intercambiardosvaloresayb
{
intaux=a;
a=b;

b=aux;
}

Instruccionescondicionales
Forma1:
if(condicin)
instruccin1;
else
instruccin2;
Forma2:
if(condicin)
instruccin;
Nota:Noexisteel"endif".Siloquesedeseaejecutarencadacasoesmsdeunainstruccin,hayque
escribirlasencerradasentrellaves.
Ejemplo:
//m=max(a,b)
if(a>b)
m=a;
else
m=b;
Ejemplo:
//a=abs(a)
if(a<0)
a=a;//seomiteel"else"siesvaco
Ejemplo:
//Ordenara,b(borrador)
if(a>b)
intercambiara,b;
Lalneadestacadanoesunainstruccinrealdellenguaje,esslounaformadedejarpendienteesapartedel
programa.Msadelantesepodr"refinar"esaseudoinstruccindefiniendo:

intercambiara,b=>
{
intaux=a;
a=b;
b=aux;
}
Siseefectalasustitucindeltextorefinadoenlugardelquesehabaescritooriginalmente,resultauntexto
deprogramarefinadoquecumpleconlasreglasdellenguaje.Paraayudaralaautodocumentacindel
programa,sepuedeconservarlaseudoinstruccincomocomentario:
//Ordenara,b
if(a>b)
{//intercambiara,b
intaux=a;
a=b;
b=aux;
}
Ejemplo:Encontrarelmximoentreunconjuntodevariables
//m=max(a,b,c)
//Solucin1(borrador)
if(a>b)
m=max(a,c);
else
m=max(b,c);
Realizandolassustitucionesrespectivas,seobtienelasiguienteversin"refinada":
//m=max(a,b,c)
//Solucin1(versinrefinada)
if(a>b)
{
if(a>c)
m=a;
else
m=c;
}
else
{
if(b>c)
m=b;

else
m=c;
}
Nota:Enestecaso,lasllavesnosonrealmentenecesarias,peropuedenutiizarsesiayudanalaclaridaddel
programa.
Esteenfoquedesolucintieneladesventajaqueesdifcildegeneralizar.Porejemplo,elprogramaque
encuentraelmximodecuatrovariablestieneaproximadamenteeldobledelneasqueste,yporlotantoel
tamaodelprogramavacreciendoexponencialmente.Ademsnohayformadeescribirunprogramaparaun
nmerodevariablesquenoseaconocidoapriori.
//m=max(a,b,c)
//Solucin2(borrador)
m=a;
m=max(m,b);
m=max(m,c);
Sustituyendolasseudoinstrucciones,resulta:
//m=max(a,b,c)
//Solucin2(versinrefinada)
m=a;
if(b>m)
m=b;
if(c>m)
m=c;
Concadainstruccinqueseejecuta,elestadodelprocesocambia.Paraentenderloqueestsucediendoen
elprograma,puederesultartilintercalarcomentariosquedescribanloquesabemosquesecumpledespus
decadainstruccin:
//m=max(a,b,c)
//Solucin2(versinrefinadayconafirmaciones)
m=a;
//m==max(a)
if(b>m)
m=b;
//m==max(a,b)
if(c>m)
m=c;
//m==max(a,b,c)

Esetipodecomentariossellamanafirmaciones(assertions),yencasosmscomplejossonfundamentales
paraentenderloqueestsucediendoenunproceso.
Lageneralizacinparaencontrarelmximodecuatroomsvariablesesdirecta,yencadacasorequiereslo
agregardoslneasalprograma.Msadelanteseverunaversinparaunnmerovariablededatos.

ProgramasIterativosUsandoInvariante
Laformageneraldeunainstrucciniterativaes:
while(condicin)
instruccin;
Lainstruccinseejecutaenformareiteradamientraslacondicinseaverdadera.
Cadavezqueseintentainiciarunanuevaiteracin(incluyendolaprimeravezqueelloocurre)elprogramase
encuentraenunestadoIllamadoelinvariantedelciclo.
Invariante:Algunacondicin(es)quedescribe(n)loqueunciclohace.Permaneceinvarianteduranteelciclo:al
entrar,durantecadaiteracinyalfinal.Representarlaestrategiaqueseusapararesolverelproblema.Seusa
para:
Apartirdelinvariantedesarrollareltrozodeprograma.
Demostrarqueeltrozoprogramahaceloquequeremos.
Explicaruntrozodeprograma.
Engeneral,alescribirunciclo,sedebeestablecerlavalidezinicialdelinvariante,atravsdeunainicializacin.
ElobjetivodelcicloesllegaraunestadofinalF.Encadaiteracinsedebe,adems,preservarlavalidezdel
invariante.
Ejemplo:
Considereelproblemadeencontrarelmximodeunnmerovariablededatos,almacenadosenunarreglo
a[1],...,a[n].Paraverloenformaiterativa,imagineunprocesoenquelosdatossevanexaminandouno
auno,comparndolosconelmximoencontradohastaelmomento.Deestamanera,sienuninstantedado
yasehanexaminadolosdatoshastaa[k],entoncesseconoceelmximohastaesavariable.
//m=max(a[1],...,a[n]);
k=1;
m=a[1];
//m==max(a[1])
//Deestamaneratrivialseincializaelsiguienteinvariante:
//Invariante:k<=n&&m==max(a[1],...,a[k])
while(k<n)

{
++k;
//k<=n&&m==max(a[1],...,a[k1])
if(a[k]>m)
m=a[k];
//k<=n&&m==max(a[1],...,a[k])
}
//m=max(a[1],...,a[n])
Estaltimaafirmacinsededucedelhechoquealterminarelciclosesabequeelinvariantesiguesiendo
verdadero,perolacondicindelcicloesfalsa.Enestrictorigor,laafirmacinquepodramoshacerahes
//k>=n&&k<=n&&m==max(a[1],,,a[k])
delacualsededucelasealadaalfinaldelprograma.

Cmoescribirunciclo?
1.Encontraruninvarianteadecuado.Paraesto,amenudoesconveniente"relajar"lameta(estadofinal)al
quesedeseallegar.Porejemplo,sisedeseaobtener:
//m==max(a[1].,,,.a[n])

sepuedereescribirestacondicinseparndolaendoscondicionesquesepuedansatisfacer
independientemente:
//m==max(a[1].,,,.a[k])&&k==n
Esto,quepuedeparecerocioso,esmuytil,porqueacontinuacinserelajalaexigenciadeestacondicin,
haciendoquesecumplalaprimeraparte,perodejandoquelasegundasesatisfagacon"k<=n".
2.Escribirlainicializacin,lacualdebeasegurarqueelinvariantesecumplaantesdeempezaraiterar.
3.Encontrarlacondicindetrmino.Estoseobtienedecomparar"qulefalta"alinvarianteparaserigualal
estadofinal.
4.Escribirelcuerpodelciclo,elcualdebe:
conseguirqueelprocesoavance,demodoqueterminealgnda,y
preservarelinvariante.
Estosdosltimosobjetivossuelensercontrapuestos.Alefectuarunavanceenelproceso,losvaloresdelas
variablescambian,conelresultadoqueamenudosedejadesatisfacerelinvariante.Porlotanto,elrestodel
cuerpodelciclosesuelededicaratratarderecuperarlavalidezdelinvariante.

EjemplosdeProgramasIterativos

Algoritmossimplesdeordenacin
Considereelproblemadeponerloselementosdeunarregloa[0],...,a[n1]enordenascendente.
Seestudiarnvariassoluciones,todasellasconsistentesenalgoritmossencillos,peronomuyeficientes.Estas
distintassolucionesvanaprovenirdeescogerdistintosinvariantes,odistintasmanerasdepreservarlos.

Ordenacinporinsercin
Estealgoritmovaconstruyendountrozoordenadodelarregloalextremoizquierdo,yencadaiteracinle
agregaunnuevoelementoaesegrupo.
Invariante:

a[i]<a[i+1]parai=0hastak2.
a[k]hastaa[n1]estndesordenados.
Enpalabras:"Loselementosdesde0hastak1yaestnordenadosylossiguientesdesordenados".
//Ordenara[0],...,a[k1]porinsercin(borrador)
k=0;//inicialmentenohayelementosordenados(k=1tambinfuncionara)
while(k<n)
{
Insertara[k]entrea[0],...,a[k1];
++k;
}
Silainsercinseefectacorrectamente,esevidentequeelprogramaanteriorordenacorrectamenteal
conjunto.
Elsiguienteproblemaesvercmoserealizalainsercin:
Insertara[k]entrea[0],...,a[k1]=>
for(j=k;j>0&&a[j1]>a[j];j)
{
//intercambiara[j1]cona[j]
t=a[j];
a[j]=a[j1];
a[j1]=t;
}

Alseguirelprocesodelainsercin,sepuedeobservarquelavariablettomasiempreelmismovalor:eldel
elementoqueseestinsertando.Porlotanto,sepuedeoptimizarelprogramarealizandounanicaasignacin
atantesdecomenzarelciclo.Otraobservacinesquelamayoradelasasignacionesaa[j1]sonintiles,
porqueesavariablevaasersobreescritaenlaiteracinsiguiente.Luego,sepuedeevitaresasasignaciones,
reemplazndolasporunasolaalfinaldelciclo:
Insertara[k]entrea[0],...,a[k1]=>
//versinoptimizada
t=a[k];
for(j=k;j>0&&a[j1]>t;j)
a[j]=a[j1];
a[j]=t;
Efectuandolasustitucindeestaversin,seobtienelasiguienteversinfinalparaelalgoritmodeordenacin:
//Ordenara[0],...,a[k1]porinsercin
k=0;//inicialmentenohayelementosordenados(k=1tambinfuncionara)
while(k<n)
{
//Insertara[k]entrea[0],...,a[k1]
t=a[k];
for(j=k;j>0&&a[j1]>t;j)
a[j]=a[j1];
a[j]=t;
++k;
}
Eltiempoquedemoraestealgoritmoenelpeorcasoesdelordenden2 ,loquesedenotarO(n2 ).Sepuede
demostrarqueestomismoesciertosiseconsideraelcasopromedio.

OrdenacinporSeleccin
Estealgoritmosebasaenhacerpasadassucesivassobrelosdatos.Encadapasada,seencuentraelmximo
delarreglo,yselollevaalextremoderecho.Unavezhechoesto,eseelementodejadeserconsiderado,
porqueseencuentrayaensuposicindefinitiva.Estoconducealsiguienteinvariante:

a[i]<a[i+1]parai=khastan1.
a[j]<a[i]conj=0hastak1,todosdesordenados.

Enpalabras:"Loselementosdesdekhastan1yaestnordenadosysonmayoresquelosprimerosk".
//Ordenara[0],...,a[n1]porseleccin
k=n;//inicialmentelosnprimerosestndesordenados
while(k>=2)
{
Llevarelmaxdea[0],...,a[k1]haciaa[k1];
k;
}
Donde
Llevarelmaxdea[0],...,a[k1]haciaa[k1]=>
i=0;//a[i]eselmaxhastaelmomento
for(j=1;j<=k1;++j)
if(a[j]>a[i])
i=j;
//ahoraintercambiamosa[i]cona[k1]
t=a[i];
a[i]=a[k1];
a[k1]=t;
EltiempoquedemoraestealgoritmoesO(n2),ynohaydiferenciaentreelpeorcasoyelcasopromedio.
Msadelanteseverunaformadiferentederealizarelprocesodeencontrarelmximo,quepermitirque
eseprocesoseamseficiente.Bsicamente,setrataquealencontrarelmximounavez,esposibleobtener
informacinadicionalquefaciliteencontrarluegoelsegundomximo,yassucesivamente.
Unaformadehacerestoesconstruiruntorneobalanceado,alestilodelostorneosdetenis.Unavezquese
hanjugadotodoslospartidosdeltorneo,connjugadores,sisedeseaencontraral(verdadero)subcampen,
bastaconsustituirimaginariamentealcampenporunjugadorpsimo,yjugardenuevoloslognpartidosen
queestuvoinvolucradoelcampen.ElresultadoesunmtododeordenacinquedemoratiempoO(nlogn).

OrdenacindelaBurbuja
Estemtodosebasaenhacerpasadasdeizquierdaaderechasobrelosdatos,intercambiandoparesde
elementosadyacentesqueestnfueradeorden.Alfinaldecadapasada,enformanaturalelmximoestar
enlaposicindemsaladerecha(queessuposicinfinal)ypuedeporlotantoserexcluidoenpasadas
sucesivas.
Estoconducealsiguienteinvariante(idnticoaldeordenacinporseleccin):

Elborradordelprogramaes:
//Ordenara[0],...,a[n1]porlaburbuja(borrador)
k=n;
while(k>1)
{
Hacerunapasadasobrea[0],...,a[k1];
Disminuirk;
}
Donde
Hacerunapasadasobrea[0],...,a[k1]=>
for(j=0;j<=k2;++j)
if(a[j]>a[j+1])
{//Intercambiara[j]cona[j+1]
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
y
Disminuirk=>
k;
Estoltimopuedeparecerocioso,peroprontoseverqueelexpresarlodeestamaneradaunaflexibilidad
queresultatil.
Unproblemaquepresentaesteprogramaesquesielarchivoestincialmenteordenado,elprogramaigual
hacenpasadas,cuandodespusdelaprimerayapodrahabersedadocuentaqueelarchivoyaestaba
ordenado.
Paraaprovecharcualquierposibleordenquepuedahaberenelarchivo,sepuedehacerqueelprograma
anote("recuerde")ellugarendondeseprodujoelltimointercambio.Silavariableisedefinedemaneraque
elltimointercambioenunapasadadadafueentrea[i1]ya[i],entoncestodosloselementosdesdea[i]
enadelanteestnyaordenados(delocontrariohabrahabidointercambiosmshacialaderecha),yporlo
tantoksepuededisminuirhaciendoqueseaigualai:

Hacerunapasadasobrea[0],...,a[k1]=>
i=0;
for(j=0;j<=k2;++j)
if(a[j]>a[j+1])
{//Intercambiara[j]cona[j+1]
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
//Recordarellugardelltimointercambio
i=j+1;
}

Disminuirk=>
k=i;
EltiempoquedemoraestealgoritmotantoenelpeorcasocomoenpromedioesO(n2).

Clculodexn
Unalgoritmosimpleconsisteenmultiplicarnveces:
//Algoritmosimple
y=1;
for(j=n;j>0;j)
y=y*x;
EstealgoritmoevidentementetomatiempoO(n),ysuinvariantesepuedeescribircomo
y*xj==xn
Esposibleencontrarunalgoritmosustancialmentemseficientedelasiguientemanera.Primerose
desvinculanlasdosocurrenciasdexenelinvariante:
y=1;
z=x;
for(j=n;j>0;j)
y=y*z;
coninvariante
y*zj==xn

Estopodraparecerocioso,peropermitehacerunaoptimizacinalobservarqueestpermitidomodificarla
variablezaliniciodelciclosiemprequesemantengalavalidezdelinvariante.Enparticular,sijresultaserpar,
podemoselevarzalcuadradosialmismotiempodividimosjpor2.Deestamanera,elinvariantesigueigual,
perojdisminuyemuchomsrpido.
Mejortodava,siestosepuedehacerunavez,entoncessepuedehacermuchasvecessiemprequejsiga
siendopar:
y=1;
z=x;
for(j=n;j>0;j)//Invariante:y*zj==xn
{
while(jespar)
{
z=z*z;
j=j/2;
}
y=y*z;
}
Ladeteccinquejesparsepuedeimplementarcomo
jespar=>
j&1==0
EstealgoritmodemoratiempoO(logn),locualsedebeaquejslosepuededividirlognvecespor2antes
dellegara1.Esciertoquejslosedividecuandoespar,perosiesimparenunaiteracindelfor,est
garantizadoqueserparalasiguiente.

DiagramasdeEstados
Undiagramadeestadosnospermitevisualizarlosdiferentesestadosporlosquevapasandounprograma.
Lastransicionesdeunestadoaotroserealizanyaseaincondicionalmenteobajounacondicin.Adems,
puedeniracompaadasdeunaaccinqueserealizajuntoconlatransicin.
Ejemplo:Contarpalabrasenunafrase.
Parasimplificar,supongamosquelafraseestalmacenadaenunstrings,ysupongamosquelafrasetermina
conunpunto.Porejemplo,
Strings="Esteesunejemplo.";

Paralosfinesdeesteejemplo,diremosqueuna"palabra"escualquiersecuenciadecaracteresconsecutivos
distintosdeblanco(ypunto).
Pararesolveresteproblema,examinaremosloscaracteresdelstringdeizquierdaaderecha,usando
charAt(k),yloquesehagaconcadacaracterdependesiestbamosdentroofueradeunapalabra.Esto
ltimocorrespondealestadodelprograma.

Veremosdosformasdistintasdellevarestediagramadetransicinaunprograma.Apesarqueambosseven
muydistintos,enrealidadrepresentanexactamenteelmismoproceso:
//Version1
np=0;
estado=FUERA;
for(k=0;(c=s.charAt(k))!='.';++k)
{
if(estado==FUERA)
{
if(c!='')
{
++np;
estado=DENTRO;
}
}
else//estado==DENTRO
if(c=='')
estado=FUERA;
}

//Version2
k=0;
np=0;
while(s.charAt(k)!='.')
{//estado==FUERA
while(s.charAt(k)=='')
++k;
if(s.charAt(k)=='.')
break;
++np;
++k;
//estado==DENTRO
while(s.charAt(k)!=''&&s.charAt(k)!='.')
++k;
if(s.charAt(k)=='.')
break;
++k;
}

Problema
Reordenarloselementosdea[0],...,a[n]dejandoalaizquierdalos<0yaladerechalos>=0.
Solucin1:
Invariante:

//Version1
i=0;
j=n;
while(i<j)
{
if(a[i]<0)
++i;
elseif(a[j]>=0)
j;
else
{
a[i]<>a[j];
++i;
j;
}
}

//Version2
i=0;
j=n;
while(i<j)
{
while(i<j&&a[i]<0)
++i;
while(i<j&&a[j]>=0)
j;
if(i<j)
{

a[i]<>a[j];
++i;
j;
}
}
Solucin2:
Invariante:

i=0;
for(j=0;j<=n;++j)
if(a[j]<0)
{
a[i]<>a[j];
++i;
}

Anexo:ConceptosBsicosdeProgramacinOrientadaalObjeto
(OOP)
Unobjetocombinadatosyoperaciones(mtodos).
Elprincipiobsicoeseldeencapsulamiento(ocultamientodeinformacin).Estopermitesepararel"qu"
(especificacinfuncional,pblica)del"cmo"(implementacin,privada).
Conceptosasociadosalaprogramacinorientadaaobjetos,paraapoyarlareutilizacindecodigo:

Cdigogenrico:lalgicadeunalgoritmodebepoderescribirseindependientementedeltipodelosdatos.
Herencia:permiteextenderlafuncionalidaddeunobjeto.
Polimorfismo:permitequeseseleccioneautomticamentelaoperacinapropiadasegneltipoynmero
delosparmetros.

Clases
EnJavaunobjetoesunainstanciadeunaclase.
Ejemplo:
//ClaseEntero,quepermiteleery
//guardarunvalorenunavariableentera
publicclassEntero
{
//Datosprivados
privateintvalor;
//Mtodospblicos
publicintleer()
{
returnvalor;
}
publicvoidguardar(intx)
{
valor=x;
}
}
//Ejemplodeprogramaprincipal
publicclassPrueba
{
publicstaticvoidmain(String[]args)
{
Enterom=newEntero();
m.guardar(5);
System.out.println("m="+m.leer());
}
}

Tiposdemtodos
Constructores
Permiteninicializarelobjeto.Puedehabervariosconstructorescondistintonmeroytiposdeparmetros.
Sinohayunconstructordefinido,loscamposseinicializanautomticamenteconvaloresnulos.
Elconstructordebetenerelmismonombrequelaclase.
Ejemplo:Claseparaalmacenarfechas:
publicclassFecha
{
privateinta;
privateintm;
privateintd;
//Constructorconparmetros
publicFecha(intaa,intmm,intdd)
{
a=aa;
m=mm;
d=dd;
}
//Constructorsinparmetros
publicFecha()
{
a=2001;
m=1;
d=1;
}
}
Ejemplosdeuso:
Fechaf1=newFecha();
Fechaf2=newFecha(2001,4,11);

"Mutators"y"accessors"
Lasvariablesdeunaclasetipicamentesonprivadas.Paramirarsuvalor,oparamodificarlo,hayqueutilizar
mtodosadhoc(comoleeryguardarenelejemplodelaclaseEntero).

Estoesunmayorgradodeburocracia,peroaislaalosusuariosdeunaclasedelosdetallesde
implementacindeella,yevitaqueseveanafectadosporeventualescambiosendichaimplementacin.

toString
Alimprimirunobjetoausandoprintln,automticamenteseinvocaa
a.toString()
paraconvertirloaunaformaimprimible.EstomismoocurrecadavezqueseutilizaaenuncontextodeString.
Enelejemplo,sivamosaimprimirobjetosdetipoFecha,debemosproveerunaimplementacindetoString
dentrodeesaclase:
publicStringtoString()
{
returnd+"/"+m+"/"+a;
}

equals
Elmtodoequalsseutilizaparaversidosobjetostienenelmismovalor.Seinvoca
if(x.equals(y))
ysedeclaracomo
publicbooleanequals(Objectb)
EltipoObjectusadoaquesuntipodeobjeto"universal"delcualsederivantodoslosotros.Elsiguiente
ejemplomuestraunaimplementacindeequalsparalaclaseFecha:
publicbooleanequals(Objectb)
{
if(!(binstanceofFecha))
returnfalse;//elotroobjetonoeradetipoFecha
Fechaf=(Fecha)b;//paraverlocomounaFecha
returna==f.a&&m==f.m&&d==f.d;
}

this

Lareferenciathisidentificaalobjetoactual.Permitedesdedentrodelaclaseaccesarloscampospropios
diciendo,porejemplo,this.a.Estoenrealidadesredundante,porquesignificalomismoquedecir
simplementea,peropuedesermsclaroenlalectura.
Tambinpermitecompararsiesteobjetoeselmismoqueotro(noslositienenelmismocontenido,sinosi
ambasreferenciasapuntanalmismoobjeto).
Elotrousodethisescomoconstructor,parallamaraotroconstructordelamismaclase.Porejemplo,el
constructorsinparmetrosdelaclaseFechapodrahabersidodeclaradocomo:
publicFecha()
{
this(2001,1,1);
}

Camposestticos
Haydostiposdecamposestticos:
publicfinalstaticdoublePI=3.14159;//constante
privatestaticintprecioActual=1300;//variablecompartida
//portodoslosobjetosdeesaclase

Mtodosestticos
Losmtodosestticosestnasociadosaunaclase,noaobjetosparticularesdentrodeella.
Ejemplos:
Math.sin
Integer.parseInt
Losmtodosestticosnopuedenhacerusodelareferenciathis.

Packages
Lasclasessepuedenagruparen"paquetes".Paraesto,cadaclasedebeprecedersede
packageP;
classC
{
...
}

Cuandoaunavariablenoseleponepublicniprivate,esvisibleslodentrodelmismopackage.
LaclaseCsedenominaP.C,perosiantesdecimosimportP.C;obienimportP.*;,entoncespodemos
referirnosalaclasesimplementecomoC

Herencia
Principioquepermitereutilizartrabajoyahecho.Sebasaenlarelacinisa.
Ejemplo:
CrculoisaFigura
AutoisaVehculo
Lasclasesformanunajerarquaenbasealarelacindeherencia.
Otrotipoderelacindistintaeshasa.Porejemplo:
AutohasaManubrio
Estetipoderelacinsellamaagregacinyamenudoesmsimportantequelaherencia.
Clasebase:
Laclasedelacualsederivanotras
Clasederivada:
Heredatodaslaspropiedadesdelaclasebase.Luegopuedeagregarcamposymtodos,oredefinirmtodos.
Loscambiosquesehaganenlaclasederivadanoafectanalaclasebase.
Sintaxis:
publicclassDerivadaextendsBase
{
...
}
Loscamposadicionalesgeneralmentesonprivados.
Losmtodosdelaclasebasequenoseredefinenenlaclasederivadaseheredansincambio,exceptopor
elconstructor.
Losmtodosqueseredefinentienenprioridad.
Sepuedenagregarnuevosmtodos.
Losmtodospblicosnosepuedenredefinircomoprivados.

Visibilidad

Loscamposprivadosdelaclasebasenosevendesdelasclasesderivadas.Paraqueuncampodeestetipo
seavisibledebedeclararsecomoprotected.Estaposibilidaddebeusarseconmuchocuidado.

Constructores
Cadaclasedefinesupropioconstructor,elcualllevaelmismonombrequelaclase.
Sinosedefineunconstructor,segeneraautomticamenteunconstructorsinparmetrosque:
llamaalconstructorconceroparmetrosdelaclasebase,paralaparteheredada,yluego
inicializaconvaloresnulosloscamposrestantes.
Siseescribeunconstructor,suprimerainstruccinpuedeserunallamadaa
super(...);
locualinvocaalconstructordelaclasebase.

final
Siunmtodosedeclaracomofinal,entoncesnopuedeserredefinidoenlasclasesderivadas.
Anlogamente,unaclasedeclaradacomofinalnopuedeserextendida.

Mtodosabstractos
Unmtodoabstractodeclarafuncionalidad,peronolaimplementa.Lasclasesderivadasdebenproveer
implementacionesparaestosmtodos.
Unaclaseabstractaesunaclasequetienealmenosunmtodoabstracto.Nosepuedecrearobjetos
pertenecientesaunaclaseabstracta(nosepuedeejecutarnew).
Ejemplo:
abstractclassFigura
{
privateStringnombre;
abstractpublicdoublearea();
publicFigura(Stringn)
{
nombre=n;
}
//Esteconstructornopuedeserinvocadodirectamente,
//slolousanlasclasesderivadas

finalpublicdoublecompArea(Figurab)
{
returnarea()b.area();
}
finalpublicStringtoString()
{
returnnombre+"dearea"+area();
}
}
//Clasesderivadas
publicclassCirculoextendsFigura
{
staticfinalprivatedoublePI=3.141592653;
privatedoubleradio;
publicCirculo(doubler)
{
super("circulo");
radio=r;
}
publicdoublearea()
{
returnPI*radio*radio;
}
}
publicclassRectanguloextendsFigura
{
privatedoublelargo;
privatedoubleancho;
publicRectangulo(doublel,doublea)
{
super("rectangulo");
largo=l;
ancho=a;
}
publicdoublearea()
{
returnlargo*ancho;

}
}
publicclassCuadradoextendsRectangulo
{
publicCuadrado(doublelado)
{
super(lado,lado);
}
}

Herenciamltiple
Enalgunoslenguajes,unaclasepuedeheredardemsdeunaclasebase.EnJavaestonosepermite,locual
evitalosconflictosquesepodranproduciralheredarsedefinicionesincompatiblesdemtodosyvariables.

Interfaz
Unainterfazesunmecanismoquepermitelograralgunosdelosefectosdelaherenciamltiple,sinsus
problemas.
Unainterfazesunaclasequeslotienemtodospblicosabstractosycampospblicosestticosfinales.
Sedicequeunaclaseimplementaalainterfazsiproveedefinicionesparatodoslosmtodosabstractosdela
interfaz.
Unaclasepuedeextendersloaunaclasebase,peropuedeimplementarmuchasinterfaces.
Ejemplo:
packageDefiniciones;
publicinterfaceComparable
{
publicintCompare(Comparableb);
}

finalpublicclassEnteroimplementsComparable
{
privateintvalor;
publicEntero(intx)
{
valor=x;
}
publicStringtoString()

{
returnInteger.toString(valor);
}
publicintvalorEntero()
{
returnvalor;
}
publicintCompare(Comparableb)
{
returnvalor((Entero)b).valor;
}
}

Usodeinterfacesparaimplementarcomponentesgenricas
Ejemplo:Ordenacinporinsercinqueordenaobjetosdecualquiertipo.
packageOrdenacion;
importDefiniciones.*;
publicstaticvoidinsercion(Comparable[]a)
{
for(intk=0;k<a.length;++k)
{
intj;
Comparablet=a[k];
for(j=k;j>0&&
t.Compare(a[j1])<0;j)
a[j]=a[j1];
a[j]=t;
}
}
Ejemplodeuso:Ordenarenterosentregadoscomoargumentos.
importDefiniciones.*;
publicclassPruebaOrdenacion
{
publicstaticvoidmain(String[]args)
{
Entero[]a=newEntero[args.length];

for(inti=0;i<args.length;++i)
a[i]=newEntero(Integer.parseInt(args[i]));
Ordenacion.insercion(a);
for(inti=0;i<a.length;++i)
System.out.println(a[i]);
}
}

DiseoyAnlisisdeAlgoritmos
BrevedescripcindenotacinO(BigOh)

Recursividad
Alprogramarenformarecursiva,buscamosdentrodeunproblemaotrosubproblemaqueposeasumisma
estructura.
Ejemplo:Calcularxn.
//Version1
publicstaticfloatelevar(floatx,intn)
{
if(n==0)
return1;
else
returnx*elevar(x,n1);
}

//Version2
publicstaticfloatelevar(floatx,intn)
{
if(n==0)
return1;
elseif(nesimpar)
returnx*elevar(x,n1);
else
returnelevar(x*x,n/2);
}

Ejemplo:TorresdeHanoi.

publicclassTorresDeHanoi{
staticvoidHanoi(intn,inta,intb,intc){
if(n>0){
Hanoi(n1,a,c,b);
System.out.println(a+">"+c);
Hanoi(n1,b,a,c);
}
}
publicstaticvoidmain(String[]args){
Hanoi(Integer.parseInt(args[0]),1,2,3);
}
}

Backtracking
Estatcnicadediseodealgoritmosconsisteenresolverunproblemaporpruebayerror.Sebasaengenerar
todaslasposiblessolucionesalproblemautilizandorecursin,probandocadaunadeellashastaencontrar
aquellaqueloresuelve.Porestomismo,eltiemporequeridoparasolucionarelproblemapuedesermuyalto
(porejemplo,exponencialeneltamaodelaentrada).
Ejemplo:Ellaberinto.
SetieneunamatrizdecaracteresdedimensionesN=filasxcolumnas,querepresentaunlaberinto.Se
comienzadesdeunaposicin(i,j)dadayelobjetivoesencontrarlasalida,permitiendoslodesplazamientos
horizontalesyverticales.Lacodificacindellaberintoeslasiguiente:
Carcter'*'indicalapared,ynosepuedepasarporesacelda.
Carcter''(espacioenblanco)indicaelpasillo,ysepuedepasarporesacelda.
Carcter'&'indicalasalidadellaberinto,elobjetivoesencontrarunaceldadeestetipoenellaberinto.
*********
****
****&
****
******

***
****
*********
Elmtodoaimplementaresbooleansalida(char[][]x,inti,intj),queretornatruesiadesdelaposicini,jse
puedeencontrarunasalida.Esteproblemasepuederesolverutilizandobacktrackingdelasiguienteforma:
Sienlaposicin(i,j)queseestrevisandohayun'*',nohaysalidaporesecaminoyseretornafalse.
Sienlaposicin(i,j)queseestrevisandohayun'&',seencontrlasalidaallaberintoyseretornatrue.
Sienlaposicin(i,j)queseestrevisandohayunespacio,sepruebarecursivamentesisellegaalasalida
poralgunadelascuatroceldasvecinas(i+1,j),(i1,j),(i,j+1),(i,j1).
Sialgunadelasllamadasretornatrue,existeuncaminohastalasalidayseretornatrue.Sitodaslas
llamadasrecursivasretornanfalse,noexisteuncaminohastalasalidayseretornafalse.
UnaprimeraversindelafuncinenJavaqueinstanciaestealgoritmopodraserlasiguiente(supuesto:todo
elbordedellaberintoestarodeadoporparedes,exceptoenla(s)salida(s)):
publicstaticsalida1(char[][]x,i,j)
{
if(x[i][j]=='&')returntrue;
if(x[i][j]=='*')returnfalse;
if(salida1(x,i+1,j))returntrue;
if(salida1(x,i1,j))returntrue;
if(salida1(x,i,j+1))returntrue;
if(salida1(x,i,j1,))returntrue;
returnfalse;
}
Estaimplementacintieneelproblemaquepuedegenerarunnmeroinfinitodellamadosrecursivos.Por
ejemplo,siseinvocaasalida1(x,a,b)yesunaceldadepasillo,stainvocarrecursivamenteasalida1(x,a+1,
b).Silacelda(a+1,b)esunaceldadepasillo,puedepotencialmenteinvocarasalida1(x,a+11,b),
generandoseasuncicloinfinitodellamadosrecursivos.Paraevitaresteproblema,sepuedeirmarcando(por
ejemplo,conelcarcter'+')lasceldaspordondeelalgoritmoyapas,evitandocaerenelcicloinfinito:
publicstaticbooleansalida(char[][]x,i,j)//correcto
{
if(x[i][j]=='&')returntrue;
if(x[i][j]=='*'||x[i][j]=='+')returnfalse;
x[i][j]='+';
if(salida(x,i+1,j))returntrue;
if(salida(x,i1,j))returntrue;
if(salida(x,i,j+1))returntrue;
if(salida(x,i,j1))returntrue;

returnfalse;
}
Propuesto:ModifiquelaimplementacindelafuncinsalidaparaqueretorneunStringquecontengala
secuenciadeceldas(i,j)pordondehayquepasarparallegaralasalidadellaberinto.Elnuevoencabezadode
lafuncinespublicstaticStringsalida(char[][]x,inti,intj).Finalmente,implementelafuncinsalidademodo
queretornelasecuenciadeceldasmscortaparallegaralasalida.

"DividirparaReinar"(DivideandConquer)
Esteesunmtododediseodealgoritmosquesebasaensubdividirelproblemaensubproblemas,
resolverlosrecursivamente,yluegocombinarlassolucionesdelossubproblemasparaconstruirlasolucin
delproblemaoriginal.
Ejemplo:MultiplicacindePolinomios.
Supongamosquetenemosdospolinomiosconncoeficientes,osea,degradon1:
A(x)=a0+a1*x+...+an1*xn1
B(x)=b0+b1*x+...+bn1*xn1
representadosporarreglosa[0],...,a[n1]yb[0],...,b[n1].Queremoscalcularloscoeficientesdel
polinomioC(x)talqueC(x)=A(x)*B(x).
Unalgoritmosimpleparacalcularestoes:
//Multiplicacindepolinomios
for(k=0;k<=2*n2;++k)
c[k]=0;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
c[i+j]+=a[i]*b[j];
Evidentemente,estealgoritmorequieretiempoO(n2).Sepuedehacermsrpido?
Supongamosquenespar,ydividamoslospolinomiosendospartes.Porejemplo,si
A(x)=2+3*x6*x2+x3
entoncessepuedereescribircomo
A(x)=(2+3*x)+(6+x)*x2

yengeneral
A(x)=A'(x)+A"(x)*xn/2
B(x)=B'(x)+B"(x)*xn/2
Entonces
C=(A'+A"*xn/2)*(B'+B"*xn/2)
=A'*B'+(A'*B"+A"*B')*xn/2+A"*B"*xn
Estosepuedeimplementarcon4multiplicacionesrecursivas,cadaunainvolucrandopolinomiosdelamitaddel
tamaoqueelpolinomiooriginal.SillamamosT(n)alnmerototaldeoperaciones,steobedecelaecuacin
derecurrencia
T(n)=4*T(n/2)+K*n
dondeKesalgunaconstantecuyovalorexactonoesimportante.
Teorema
Lasecuacionesdelaforma
T(n)=p*T(n/q)+K*n
tienensolucin
T(n)=O(nlogqp)(p>q)
T(n)=O(n)(p<q)
T(n)=O(nlogn)(p=q)
(Nota:esteTeorema,conocidocomoelTeoremaMaestro,serdemostradomsadelante.)
Porlotantolasolucindelproblemaplanteado(p=4,q=2)es
T(n)=O(nlog24)=O(n2)
locualnomejoraalalgoritmovistoinicialmente.
Pero...hayunaformamseficientedecalcularC(x).Sicalculamos:
D=(A'+A")*(B'+B")
E=A'*B'
F=A"*B"

entonces
C=E+(DEF)*xn/2+F*xn
Locualutilizaslo3multiplicacionesrecursivas,enlugarde4.Estoimplicaque
T(n)=O(nlog23)=O(n1.59)

RecursividadyTabulacin
Aveceslasimplerecursividadnoeseficiente.
Ejemplo:NmerosdeFibonacci.
LosnmerosdeFibonaccisedefinenmediantelarecurrencia
fn=fn1+fn2(n>=2)
f0=0
f1=1
cuyosprimerosvaloresson
n01234567891011...
fn01123581321345589...
SepuededemostrarquelosnmerosdeFibonaccicrecenexponencialmente,comounafuncinO(n)donde
=1.618....
Elproblemaquesedesearesolverescalcularfnparaunndado.
Ladefinicindelarecurrenciaconduceinmediatamenteaunasolucinrecursiva:
publicstaticintF(intn)
{
if(n<=1)
returnn;
else
returnF(n1)+F(n2);
}
Lamentablemente,estemtodoresultamuyineficiente.Enefecto,sillamamosT(n)alnmerodeoperaciones
desumaejecutadasparacalcularfn,tenemosque

T(0)=0
T(1)=0
T(n)=1+T(n1)+T(n2)
LasiguientetablamustralosvaloresdeT(n)paravalorespequeosden:
n012345678910...
T(n)0012471220335488...
Ejercicio:DemostrarqueT(n)=fn+11.
Porlotanto,eltiempoquedemoraelclculodeF(n)creceexponencialmenteconn,locualhacequeeste
mtodoseaintilexceptoparavaloresmuypequeosden.
Elorigendeestaineficienciaesquelarecursividadcalculaunayotravezlosmismosvalores,porqueno
guardamemoriadehaberloscalculadoantes.
Unaformadeevitarloesutilizarunarregloauxiliarfib[],paraanotarlosvaloresyacalculados.Unmtodo
generalesinicializarloselementosdefibconalgnvalorespecial"nulo".AlllamaraF(n),primerose
consultaelvalordefib[n].Sistenoes"nulo",seretornaelvaloralmacenadoenelarreglo.Encaso
contrario,sehaceelclculorecursivoyluegoseanotaenfib[n]elresultado,antesderetornarlo.Deesta
manera,seaseguraquecadavalorsercalculadorecursivamenteslounavez.
Encasosparticulares,esposibleorganizarelclculodelosvaloresdemododepoderirllenandoelarregloen
unordentalque,alllegarafib[n],yaestgarantizadoquelosvaloresquesenecesitan(fib[n1]yfib[n
2])yahayansidollenadospreviamente.Enestecaso,estoesmuysencillo,yselograsimplementellenandoel
arregloenordenascendentedesubndices:
fib[0]=0;
fib[1]=1;
for(j=2;j<=n;++j)
fib[j]=fib[j1]+fib[j2];
EltiempototalqueestodemoraesO(n).
Estaideasellamaprogramacindinmicacuandoselautilizapararesolverproblemasdeoptimizacin,y
veremosalgunasaplicacionesimportantesdeellaalolargodelcurso.
EsposiblecalcularfnmsrpidoqueO(n)?Sibienpodraparecerqueparacalcularfnseranecesario
habercalculadotodoslosvaloresanteriores,estonoescierto,yexisteunmtodomuchomseficiente.
Tenemos

fn=fn1+fn2
f0=0
f1=1
Estaesunaecuacinderecurrenciadesegundoorden,porquefndependedelosdosvalores
inmediatamenteanteriores.Definamosunafuncinauxiliar
gn=fn1
Conesto,podemosreescribirlaecuacinparafncomounsistemadedosecuacionesdeprimerorden:
fn=fn1+gn1
gn=fn1
f1=1
g1=0
Loanteriorsepuedeescribircomolaecuacinvectorial

fn=A*fn1

donde
fn=[fn]A=[11]
[gn][10]

conlacondicininicial
f1=[1]
[0]

Lasolucindeestaecuacines

fn=An1*f1

locualpuedecalcularseentiempoO(logn)usandoelmtodorpidodeelevacinapotenciavisto
anteriormente.

MtodosMatemticos

Funcionesdiscretas
Engeneral,paraestudiarlaeficienciadelosalgoritmosseutilizanfuncionesdiscretas,quemidencantidades
talescomotiempodeejecucin,memoriautilizada,etc.Estasfuncionessondiscretasporquedependendel
tamaodelproblema,quesedenotarcomon.Porejemplo,npodrarepresentarelnmerodeelementosen
unconjuntoaordenar.
Notacin:f(n)obienfnrepresentaeltiemporequeridoporunalgoritmodadoresolverunproblemadetamao
n.TambinseutilizaT(n)oT n.
Enanlisisdealgoritmos,cuandonesgrande(asintticamente)loqueimportaeselordendemagnituddela
funcin:cuadrtica,lineal,logartmica,exponencial,etc..Paranpequeo,lasituacinpuedeserdistinta.

NotacinO
Sedicequeunafuncinf(n)esO(g(n))siexisteunaconstantec>0yunn0>=0talqueparatodon>=n0se
tienequef(n)<=cg(n)(cotasuperiordeunalgoritmo).
Sedicequeunafuncinf(n)es(g(n))siexisteunaconstantec>0yunn0>=0talqueparatodon>=n0se
tienequef(n)>=cg(n)(cotainferior).
Sedicequeunafuncinf(n)es(g(n))sif(n)=O(g(n))yf(n)=(g(n)).
Ejemplos:
3n=O(n)
2=O(1)
2=O(n)
3n+2=O(n)
An2+Bn+C=O(n2)
Alogn+Bn+Cnlogn+Dn2=?
3=(1)
3n=(n)
3n=(1)
3n+2=(n)
3n+2=(n)
Enordenascendente:1/n,1,loglogn,logn,sqrt(n),n,nlogn,n1+e,n2,nk,2n.

Ecuacionesderecurrencia
Sonecuacionesenqueelvalordelafuncinparaunndadoseobtieneenfuncindevaloresanteriores.Esto
permitecalcularelvalordelafuncinparacualquiern,apartirdecondicionesdeborde(ocondiciones
iniciales)

Ejemplo:TorresdeHanoi

an=2an1+1

a0=0

Ejemplo:Fibonacci

fn=fn1+fn2

f0=0

f1=1

Ecuacionesdeprimerorden
Consideremosunaecuacindelaforma(supuestos:aesunaconstantemayorqueceroybnesunafuncin
conocida):
T(n)=aT(n1)+bn.
Primeroseestudiarelcasomssimplecuandoa=1.

Resolviendoahoraelcasogeneral:

Ejemplo:resolverlaecuacinderecurrenciaobtenidaparaelproblemadelasTorresdeHanoi.

Propuesto:planteeyresuelvalaecuacinderecurrenciaparalafuncinsalida,queresuelveelproblemadel
laberinto.
Ecuacioneslinealesconcoeficientesconstantes
Estasecuacionessondelaforma:
fn=Afn1+Bfn2+Cfn3+...
conA,B,C,...,constantes.Estetipodeecuacionestienensolucionesexponenciales,delaformafn=n.
Ejemplo:Fibonacci.

Sustituyendoporsupolinomiocaractersticoyresolviendo:

Sedefine:

Lasolucingeneraldelaecuacintienelaforma:

Finalmente,considerandoloscasosbase:

TeoremaMaestro
Lasecuacionesdelaforma:

tienensolucin:

Demostracin
"Desenrollando"laecuacinunavez:

Repitiendoelprocesoj1vecesseobtiene:

1)Primeroseanalizarelcasop>q:

Escogiendojtalqueqj=n(osea,j=logqn):

Usandolasiguienteigualdad:

Finalmente,seobtiene:

2)Ahoraseanalizarelcasop=q.Escogiendojtalquepj=nseobtiene:

3)Finalmente,seanalizarelcasop<q.Escogiendojtalqueqj=n:

ProgramacinDinmica

Aligualqueendividirparareinar,latcnicadediseodeprogramacindinmicadivideunproblemaenvarios
subproblemasconlamismaestructuraqueelproblemaoriginal,luegoseresuelvendichossubproblemasy
finalmente,apartirdestos,seobtienelasolucinalproblemaoriginal.Ladiferenciaradicaenquela
programacindinmicaseocupacuandolossubproblemasserepiten,comoenelclculodelosnmerosde
Fibonacci.Enestecaso,envezdeusarrecursinparaobtenerlassolucionesalossubproblemasstassevan
tabulandoenformabottomup,yluegoestosresultadossonutilizadospararesolversubproblemasms
grandes.Deestaforma,seevitaeltenerquerealizarelmismollamadorecursivovariasveces.
Laprogramacindinmicaseocupaengeneralpararesolverproblemasdeoptimizacin(maximizacino
minimizacindealgunafuncinobjetivo).Estosproblemaspuedentenerunaovariassolucionesptimas,yel
objetivoesencontraralgunadeellas.Lospasosgeneralesparautilizarprogramacindinmicaenla
resolucindeunproblemasonlossiguientes:
Encontrarlasubestructuraptimadelproblema,esdecir,encontraraquellossubproblemasenlosquese
componeelproblemaoriginal,talquesiunoencuentrasussolucionesptimasentoncesesposibleobtener
lasolucinptimaalproblemaoriginal.
Definirelvalordelasolucinptimaenformarecursiva.
Calcularelvalordelasolucinpartiendoprimeroporlossubproblemasmspequeosytabulandolas
soluciones,loqueluegopermiteobtenerlasolucindesubproblemasmsgrandes.Terminarcuandose
tienelasolucinalproblemaoriginal.
Estospasospermitenobtenerelvalorptimodelasolucinalproblema.Tambinesposibleirguardando
informacinextraencadapasodelalgoritmo,queluegopermitareconstruirelcaminorealizadoparahallarla
solucinptima(porejemplo,paraobtenerlainstanciaespecficadelasolucinptima,ynosloelvalor
ptimodelafuncinobjetivo).
Ejemplo:Multiplicacindeunasecuenciadematrices.
SeaunasecuenciadenmatricesA1...A n.Sedeseaobtenerelproductodeestasmatrices.Paraesto,sedebe
cumplirquedosmatricesconsecutivasenlasecuenciasepuedenmultiplicar.Esdecir,siAyBsonmatrices
consecutivasenlasecuenciasecumplequeelnmerodecolumnasdeAesigualalnmerodefilasdeB.
Elproductosepuedeobtenermultiplicandolasmatricesenordendeizquierdaaderecha.Porejemplo,sila
secuenciatienetresmatricesA,ByCsepuedecalcular(A*B)*Cyobtenerelresultado.Sinembargo,esto
puedeserineficiente.Porejemplo,siAesdedimensiones100x10,Besdedimensiones10x100,yCesde
dimensiones100x10,entoncesmultiplicar(A*B)*Cimplicacalcular(100*10*100)+(100*100*10)=
200.000multiplicaciones(multiplicardosmatricesdepxqyqxrimplicacalcularp*q*rmultiplicaciones
escalares).Recordandoquelamultiplicacindematricesesasociativa,tambinsepuedeobtenerlasolucin
multiplicandoA*(B*C),locualtieneuncostode(10*100*10)+(100*10*10)=20.000multiplicaciones.Esto
esdiezvecesmsrpidoquelaprimeraparentizacin.Elproblemaentonceses,dadalasecuenciaden
matrices,encontrarlaparentizacinptimaqueminimiceelnmerodemultiplicacionesescalaresrealizadas
paraobtenerelproductodelasecuenciadematrices.

Resolveresteproblemaporfuerzabrutaesmuycostoso.Sepuededemostrarqueelnmerototalde
parentizacionesdistintasaprobarestacotadoinferiormentepor4n/n3/2.
Solucinutilizandorecursin
Elproblemaoriginalsepuededividirensubproblemasquetienenlamismaestructuraqueste.Porejemplo,si
supieramosdeantemanoquelasolucinptimacolocaelprimerparntesisenlaksimamtriz(esdecir,
calcula(A1*...*A k)*(Ak+1*...*A n)),elproblemasereduceaencontrarlaparentizacinptimadelas
secuenciasformadasporA1...AkyA k+1...An.Estoesloqueseconocecomosubestructuraptima:sepuede
dividirelproblemaensubproblemas,ysiesposibleencontrarlassolucionesptimasalossubproblemas
entoncessepuedeencontrarlasolucinptimaalproblemaoriginal.
Propuesto:Demuestreporcontradiccinque,enelproblemadelamultiplicacindeunacadenadematrices,
necesariamentelassolucionesalossubproblemasdebenserlasptimasparapoderalcanzarelptimoglobal.
Conestoyaesposibleformularunasolucinrecursivaalproblema.Dadoquenoseconocedeantemanola
posicinkptima,sepruebantodaslasopciones(k=1,2,...,n1),yelalgoritmoretornaaquelkqueminimice
elnmerodemultiplicacionesescalares.Pararesolverlossubproblemasseutilizarecursin.Engeneral,sise
estresolviendoelintervaloAi...Aj,sepruebaconk=i,i+1,i+2,...,j1.Sim[i,j]representaelcostomnimoen
multiplicacionesescalaresparacalcularlamultiplicacindelacadenaAi...Aj,paraencontrarelptimoes
necesarioresolver:
m[i,j]=0sii==j
min{m[i,k]+m[k+i,j]+p(i1)*p(k)*p(j)}sii<j
i<=k<j
Losvaloresm[i,j]contienenelresultadoptimoparasubproblemasdelproblemaoriginal.Pararecordarqu
valordekfueelqueminimizelcosto,sepuedeiralmacenandoenotratablas,enlaposicins[i,j].Esta
solucinsepuedeimplementardirectamenteutilizandorecursin,peroelalgoritmoresultanteesmuycostoso.
Propuesto:Escribalaecuacinderecurrenciaquecorrespondealcostodelalgoritmorecursivo.
Lasolucinaestaecuacinderecurrenciaesexponencial,dehechonoesmejorqueelcostodelasolucin
porfuerzabruta.Dnderadicalaineficienciadelasolucinrecursiva?AligualqueenFibonacci,elproblema
esquemuchosdelosllamadosrecursivosserepiten,esdecir,lossubproblemasse"traslapan"(overlapping
problems).Entotal,serequiererealizarunnmeroexponencialdellamadosrecursivos.Sinembargo,el
nmerototaldesubproblemasdistintosesmuchomenorqueexponencial.
Propuesto:MuestrequeelnmerodesubproblemasdistintosesO(n2).
Solucinutilizandoprogramacindinmica
Elhechoqueelnmerodesubproblemasdistintosescuadrtico(ynoexponencial),esunaindicacinqueel
problemapuedeserresueltoenformaeficiente.Envezderesolverlossubproblemasenformarecursiva,se
utilizarlaestrategiadelaprogramacindinmica,esdecir,setabularnlosresultadosdelossubproblemas,

partiendodesdelossubproblemasmspequeos,yhaciendolosclculosenformabottomup.Elsiguiente
seudocdigomuestracmosepuedeimplementarelalgoritmoqueutilizaprogramacindinmica:

publicstaticintmultiplicacionCadenaMatrices(int[]p,int[][]m,int[][]s)

//MatrizAitienedimensionesp[i1]xp[i]parai=1..n

//Elprimerindiceparapes0yelprimerindiceparamyses1

intn=p.length1;

for(inti=1;i<=n;i++)

for(intl=2;l<=n;l++)

for(inti=1;i<=nl+1;i++)

intj=i+l1;

m[i][j]=Integer.MAX_VALUE;

for(intk=i;k<=j1;k++)

intq=m[i][k]+m[k+1][j]+p[i1]*p[k]*p[j];

if(q<m[i][j])

m[i][j]=q;

s[i][j]=k;

returnm[1][n];

m[i][i]=0;

Finalmente,sepuedeobservarqueestealgoritmotomatiempoO(n3),muchomejorquelasolucinrecursiva,
yocupaespacioO(n2).
Propuesto:Ocupandoelresultadoobtenidoenlatablas,implementeunalgoritmoquecalculeelvalorde
multiplicarlasecuenciadematricesutilizandoelnmeroptimodemultiplicacionesescalares.
Nota:tambinesposibleimplementarelalgoritmorecursivo,peroslosehaceelllamadolaprimeravezque
seinvocacadarecursinysealmacenanlosresultadosenlastablascorrespondientes.Sielvaloryaest
tabulado,seleedirectamentedelatabla,evitandoefectuarlarecursinparaelmismosubproblemamsde
unavez.Aestoseleconocecomomemoization.

AlgoritmosAvaros

Enproblemasdeoptimizacin,unalgoritmoavarosiempreeligelaopcinquepareceserlamejorenel
momentoquelatoma.Sibienestonoresuelvetodoproblemadeoptimizacin(puedecaerenunptimo
local),hayproblemasparaloscualesunaestrategiaavaraencuentrasiempreelptimoenformaeficiente.
Ejemplo:Asignacindeactividades.
SeaAunconjuntodenactividadesa1,...,anquecompartenalgnrecursoimportante(yescaso).Cada
actividadaitieneuntiempodeiniciotiniiyuntiempodetrminotfini,definidoporelintervalosemiabierto[tinii,
tfini).Sedicequedosactividadesdistintasaiyajsonmutuamentecompatiblessisusintervalosdetiempo[tinii,
tfini)y[tinij,tfinj)nosetraslapan.Encasocontrario,slounadeellaspuedellevarseacaboyaquenoes
posiblequedosactividadescompartansimultneamenteelrecursoescaso.Elproblemadeasignacinde
actividadesconsisteenencontrarunsubconjuntomaximalAdeSqueslocontengaactividadesmutuamente
compatibles.
Pararesolverelproblemaseutilizarunaestrategiaavara.Paraesto,sesupondrquelasactividadesestn
ordenadastemporalmenteenformaascendentedeacuerdoaltiempodetrmino(tfin)decadaactividad.Los
tiemposdeinicioytrminodecadaactividadsealmacenanenarreglos.Elseudocdigodelalgoritmoavaroes
elsiguiente:
asignacionActividadesAvaro(int[]tini,int[]tfin)
{

//Losindicesvande1..n

intn=tini.length;

A={1}//laprimeraactividadsiempreespartedelarespuesta

intj=1;

for(inti=2;i<=n;i++)

iftini[i]>=tfin[j]

A=AU{i};//uniondeconjuntos

j=i;

returnA;

}
Laestrategiadelalgoritmopropuestoesavara,yaquecadavezqueesposibleseagregaunaactividadquees
mutuamentecompatibleconlasqueyaestnenelconjuntoA.EstealgoritmotomatiempoO(n)enrealizarla
asignacindeactividades.Faltademostrarquelaasignacindeactividadesrealizadaporelalgoritmoavaroes
maximal.
Teorema:elalgoritmoimplementadoenlafuncinasignacionActividadesAvaroproduceunconjuntomaximal
deactividadesmutuamentecompatibles.

Demostracin:SeaAunasolucinoptimaparaelproblema,ysupongaquelasactividadesenAestn
ordenadasportiempodetrminodecadaactividad.SupongamosquelaprimeraactividadenAtienendicek.
Sik=1,entoncesAcomienzaconunadecisinavara.Sik>1,sedefineB=AakUa1.DadoqueAesuna
solucinptimaylastareasestnordenadas,a1tienequesermutuamentecompatibleconlasegunda
actividadenA,porloqueBtambinesunasolucinptima.Esdecir,todasolucinptimacontieneala
actividadcuyotiempodetrminoeselmenordetodos,enotraspalabras,todasolucinptimacomienzacon
unadecisinavara.Porltimo,lasolucinA'=Aa1esunasolucinptimaparaelproblemadeasignacinde
tareasparaelconjuntoS'={ienS:tinii>=tfin1},esdecir,S'contienetodaslasactividadesrestantesenSque
sonmutuamentecompatiblescona1(propuesto:demuestreporcontradiccinqueparaelconjuntoS'noexiste
unasolucinptimaB'conmsactividadesqueA').Estomuestraqueelproblemadeasignacinde
actividadestienesubestructuraptima:sedefineunproblemamspequeo(S')conlamismaestructuraque
elproblemaoriginal,cuyasolucinptimaespartedelasolucinalproblemaoriginal.Porinduccinenel
nmerodedecisionestomadas,eltomarladecisinavaraencadasubproblemapermiteencontrarlasolucin
ptimaalproblemaoriginal.

CasosdeEstudio
Seestudiarnlossiguientesproblemas:
Subsecuenciadesumamxima.
Multiplicacindematrices.
Subsecuenciacomnmslarga.

CC3001AlgoritmosyEstructurasdeDatos:Estructurasde
datoselementales
Todalainformacinquesemanejadentrodeuncomputadorseencuentraalmacenadaensumemoria,que
entrminossimplesesunasecuenciadecaracteres(bytes)endondeseencuentranlasinstruccionesydatos
alosqueseaccededirectamenteatravsdelprocesadordelcomputador.
Lossistemasomtodosdeorganizacindedatosquepermitenunalmacenamientoeficientedelainformacin
enlamemoriadelcomputadorsonconocidoscomoestructurasdedatos.Estosmtodosdeorganizacin
constituyenlaspiezasbsicasparalaconstruccindealgoritmoscomplejos,ypermitenimplementarlosde
maneraeficiente.
Enelpresentecaptulosepresentanlasestructurasdedatosbsicascomosonarreglos,listasenlazadasy
rboles,conlascualesseimplementarnposteriormentelostiposdedatosabstractos.

Arreglos
Unarregloesunasecuenciacontiguadeunnmerofijodeelementoshomogneos.Enlasiguientefigurase
muestraunarreglodeenteroscon10elementos:

EnJavaunarreglosedefinecomo:
tipo[]nombre=newtipo[n_elem];
dondetipocorrespondealtipodeloselementosquecontendrelarreglo(enteros,reales,caracteres,etc..),
nombrecorrespondealnombreconelcualsedenominarelarreglo,yn_elemcorrespondealnmerode
elementosquetendrelarreglo.Paraelcasodelejemplopresentado,ladeclaracindelarreglodeenteroses:
int[]arreglo=newint[10];
Paraaccederaunelementodelarregloseutilizaunndicequeidentificaacadaelementodemaneranica.
LosndicesenJavasonnmerosenteroscorrelativosycomienzandesdecero,porlotanto,sielarreglo
contienen_elemelementoselndicedelltimoelementodelarregloesn_elem1.Elsiguientecdigomuestra
comosepuedeinicializarelarreglodelejemplo,luegodeserdeclarado:
arreglo[0]=80;//elprimerindicedelosarreglosenJavaes0
arreglo[1]=45;

arreglo[2]=2;
arreglo[3]=21;
arreglo[4]=92;
arreglo[5]=17;
arreglo[6]=5;
arreglo[7]=65;
arreglo[8]=14;
arreglo[9]=34;//elultimoindicedelarregloes101=9
Tambinsepuededeclarareinicializarelarregloenunasolalnea:
int[]arreglo={80,45,2,21,92,17,5,65,14,34};
Unaventajaquetienenlosarreglosesqueelcostodeaccesodeunelementodelarregloesconstante,es
decirnohaydiferenciasdecostoentreaccesarelprimer,elltimoocualquierelementodelarreglo,locuales
muyeficiente.Ladesventajaesqueesnecesariodefinirapriorieltamaodelarreglo,locualpuedegenerar
muchaprdidadeespacioenmemoriasisedefinenarreglosmuygrandesparacontenerconjuntospequeos
deelementos(Nota:enJavaesposiblehacercrecereltamaodeunarreglodemaneradinmica).

Punterosyvariablesdereferencia
Unpunteroesunavariablequealmacenaladireccindememoriadeotravariable,esdecir,almacenaelvalor
dellugarfsicoenlamemoriaendondeseencuentraalmacenadadichavariable.Siseimaginaquela
memoriadelcomputadoresungranarreglodebytes,ladireccindememoriacorresponderaalndicedelos
casillerosdedichoarreglo,queesprecisamenteloquesealmacenaenelpuntero.
Enalgunoslenguajesdeprogramacin,porejemploC,esposibledeclararexplcitamentepunterospara
distintostiposdevariables,einclusoesposiblerealizararitmticadepunterospararealizaroperacionesde
maneramuyeficiente,acambiode"oscurecer"elcdigodelprogramayconunaaltaprobabilidaddecometer
erroresdeprogramacindficilesdedetectar.
EnJavanosepuededeclararpunterosdemaneraexplcitanitampocorealizararitmticadepunteros.Porlo
tantoesimposibleenJavatenerunpunteroacualquieradelostiposprimitivos:enteros,reales,caracteresy
booleanos.LosstringsyarreglosnosontiposprimitivosenJava.
Unavariabledereferencia,osimplementeunareferencia,esunavariablequealmacenaladireccinde
memoriaendondeseubicaunobjeto.Ntesequesibienladefinicinesprcticamenteidnticaalade
puntero,ladiferenciaradicaenqueunareferenciaslopuedeapuntaraobjetosresidentesenmemoria,lo
cualexcluyealostiposprimitivos.ApartirdeestadefinicinsepuedeconcluirquetodavariableenJava,que
noseadetipoprimitivo,esunareferencia.
Porejemplo,todaslasclasesenJavaheredandelaclaseObject.Unainstanciadeestaclasesedeclara
como:

Objectaux=newObject();
LavariableauxesunareferenciaaunobjetodelaclaseObjectquepermitesaberlaubicacindedichoobjeto
dentrodelamemoria,informacinsuficienteparapoderoperarconl.Intuitivamente,lareferenciaescomo
una"flecha"quenosindicalaposicindelobjetoqueapunta:

Listasenlazadas
Unalistaenlazadaesunaseriedenodos,conectadosentresatravsdeunareferencia,endondese
almacenalainformacindeloselementosdelalista.Porlotanto,losnodosdeunalistaenlazadase
componendedospartesprincipales:

classNodoLista
{
Objectelemento;
NodoListasiguiente;
}
Lareferenciacontenidaenelnododeunalistasedenominasiguiente,puesindicaendndeseencuentrael
siguienteelementodelalista.Elltimoelementodelalistanotienenodosiguiente,porloquesedicequela
referenciasiguientedelltimoelementoesnull(nula).
Lasiguientefiguramuestraunejemplodeunalistaenlazadacuyoselementossonstrings:

Lareferencialistaindicalaposicindelprimerelementodelalistaypermiteaccederatodosloselementosde
sta:bastaconseguirlasreferenciasalnodosiguientepararecorrerlalista.

NodoListaaux=lista;

aux=aux.siguiente;

Siguiendoconelejemploanterior,parainsertarunnuevonodojustodelantedelnodoreferenciadoporauxse
debenmodificarlasreferenciassiguientedelnodoauxydelnodoainsertar.

NodoListanuevo=newNodoLista(...);
//"nuevo"eslareferenciadelnodoainsertarenlalista
nuevo.siguiente=aux.siguiente;
aux.siguiente=nuevo;
//Notesequenoeslomismorealizarloscambiosdereferencia
//enunordendistintoalpresentado,puestoqueenesecaso
//se"pierde"lalistadesdeelnodosiguienteaaux
Elprocedimientopresentadoacontinuacinesunejemplodecmoseprogramaelrecorridodeunalista
enlazada.Sesupondrquelosobjetosalmacenadosencadanodosonstrings:

voidrecorrido(NodoListalista)
{
NodoListaaux=lista;
while(aux!=null)
{
System.out.println(aux.elemento);
aux=aux.siguiente;
}
}
Parainvertirelordendelalista,esdecir,queelltimoelementodelalistaahoraseaelprimero,queel
penltimoelementodelalistaahoraseaelsegundo,etc...,modificandoslolasreferenciasynoelcontenido
delosnodos,esnecesariorealizarunasolapasadaporlalista,yencadanodovisitadosemodificala
referenciasiguienteparaqueapuntealnodoanterior.Esnecesariomantenerreferenciasauxiliarespara
acordarseendondeseencuentraelnodoanterioryelrestodelalistaqueannohasidomodificada:
voidinvertir(NodoListalista)
{
NodoListasiguiente=lista;
NodoListaanterior=null;
while(lista!=null)
{
siguiente=lista.siguiente;
lista.siguiente=anterior;
anterior=lista;
lista=siguiente;
}
}
Laimplementacinvistadelosnodostambinseconocecomolistadeenlacesimple,dadoqueslocontiene
unareferenciaalnodosiguienteyporlotantoslopuederecorrerseenunsolosentido.Enunalistadedoble
enlaceseagregaunasegundareferenciaalnodoprevio,loquepermiterecorrerlalistaenambossentidos,y
engeneralseimplementaconunareferenciaalprimerelementoyotrareferenciaalltimoelemento.

Unalistacircularesaquellaendondelareferenciasiguientedelltimonodoenvezdesernullapuntaalprimer
nododelalista.Elconceptoseaplicatantoalistasdeenlacesimplecomodoblementeenlazadas.

Enmuchasaplicacionesqueutilizanlistasenlazadasestilcontarconunnodocabecera,tambienconocido
comodummyoheader,queesunnodo"falso",yaquenocontieneinformacinrelevante,ysureferencia
siguienteapuntaalprimerelementodelalista.Alutilizarunnodocabecerasiempreesposibledefinirunnodo
previoacualquiernododelalista,definiendoqueelprevioalprimerelementoeslacabecera.

Siseutilizaunnodocabeceraenunalistadedobleenlaceyanoesnecesariocontarconlasreferencias
primeroyltimo,puestoqueelnodocabeceratieneambasreferencias:sureferenciasiguienteeselprimer
elementodelalista,ysureferenciaanterioreselltimoelementodelalista.Deestaformalalistadedoble
enlacequedacirculardeunamaneranatural.

rboles
Unrbolsedefinecomounacoleccindenodosorganizadosenformarecursiva.Cuandohay0nodossedice
queelrbolestavaco,encasocontrarioelrbolconsisteenunnododenominadoraz,elcualtiene0oms
referenciasaotrosrboles,conocidoscomosubrboles.Lasracesdelossubrbolessedenominanhijosdela
raz,yconsecuentementelarazsedenominapadredelasracesdesussubrboles.Unavisingrficade
estadefinicinrecursivasemuestraenlasiguientefigura:

Losnodosquenoposeenhijossedenominanhojas.Dosnodosquetienenelpadreencomnsedenominan
hermanos.
Uncaminoentreunnodon1yunnodonkestdefinidocomolasecuenciadenodosn1,n2,...,nktalquenies
padredeni+1,1<=i<k.Ellargodelcaminoeselnmerodereferenciasquecomponenelcamino,queparael
ejemplosonk1.Existeuncaminodesdecadanododelrbolasmismoyesdelargo0.Ntesequeenun
rbolexisteunnicocaminodesdelarazhastacualquierotronododelrbol.Apartirdelconceptodecamino
sedefinenlosconceptosdeancestroydescendiente:unnodonesancestrodeunnodomsiexisteuncamino
desdenamunnodonesdescendientedeunnodomsiexisteuncaminodesdeman.
Sedefinelaprofundidaddelnodonkcomoellargodelcaminoentrelarazdelarbolyelnodonk.Estoimplica
quelaprofundidaddelarazessiempre0.Laalturadeunnodonkeselmximolargodecaminodesdenk
hastaalgunahoja.Estoimplicaquelaalturadetodahojaes0.Laalturadeunrbolesigualalaalturadela
raz,ytieneelmismovalorquelaprofundidaddelahojamsprofunda.Laalturadeunrbolvacosedefine
como1.
Lasiguientefiguramuestraunejemplodelosconceptospreviamentedescritos:

Aeslarazdelrbol.

AespadredeB,CyD.
EyFsonhermanos,puestoqueambossonhijosdeB.
E,J,K,L,C,P,Q,H,NyOsonlashojasdelrbol.
ElcaminodesdeAaJesnico,loconformanlosnodosABFJyesdelargo3.
DesancestrodeP,yporlotantoPesdescendientedeD.
LnoesdescendientedeC,puestoquenoexisteuncaminodesdeCaL.
LaprofundidaddeCes1,deFes2ydeQes4.
LaalturadeCes0,deFes1ydeDes3.
Laalturadelrboles4(largodelcaminoentrelarazAylahojamsprofunda,PoQ).

rbolesbinarios
Unrbolbinarioesunrbolendondecadanodoposee2referenciasasubrboles(nims,nimenos).En
general,dichasreferenciassedenominanizquierdayderecha,yconsecuentementesedefineelsubrbol
izquierdoysubrbolderechodelarbol.

Enestecaso,laimplementaciondelnododeunrbolbinarioescomosigue:
classNodoArbolBinario
{
Objectelemento;
NodoArbolBinarioizq;
NodoArbolBinarioder;
}
Losnodosensqueconformanunrbolbinariosedenominannodosinternos,ytodaslasreferenciasqueson
nullsedenominannodosexternos.

Propiedadesdelosrbolesbinarios
Propiedad1:
Sisedefinei=nmerodenodosinternos,e=nmerodenodosexternos,entoncessetieneque:
e=i+1
Demostracin:induccinsobrei(ejercicio).
Propiedad2:
Sean=nmerodenodosinternos.Sedefine:
In=sumadellargodeloscaminosdesdelarazacadanodointerno(largodecaminosinternos).
En=sumadellargodeloscaminosdesdelarazacadanodoexterno(largodecaminosexternos).
Setieneque:En=In+2n
Demostracin:induccinsobren(ejercicio).
Propiedad3:
Cuntosrbolesbinariosdistintossepuedenconstruirconnnodosinternos?
n

b n

bn?

Porejemplo:b4=b0*b3+b1*b2+b2*b1+b3*b0=5+2+2+5=14.
Estetipodeecuacionessepuederesolverylasolucineslasiguiente:

LaseriedenumerosquegenerabnseconocecomonmerosdeCatalan.Asintticamente:

Ejemplo:rbolesdeexpresionesmatemticas
Lasiguientefiguramuestraunejemplodeunrboldeexpresionesmatemticas.Enunrboldeexpresiones
lashojascorrespondenalosoperandosdelaexpresin(variablesoconstantes),mientrasquelosnodos
restantescontienenoperadores.Dadoquelosoperadoresmatemticossonbinarios(ounarioscomoenel
casodeloperadorsigno),unrboldeexpresionesresultaserunrbolbinario.

Unrboldeexpresionessepuedeevaluardelasiguienteforma:
Silarazdelrbolesunaconstanteounavariableseretornaelvalordesta.

Silarazresultaserunoperador,entoncesrecursivamenteseevalanlossubrbolesizquierdoyderecho,y
seretornaelvalorqueresultaaloperarlosvaloresobtenidosdelasevaluacionesdelossubrbolesconel
operadorrespectivo.
Recorridosderbolesbinarios
Existentresformasprincipalespararecorrerunrbolbinarioenformarecursiva.Estasson:
Preorden:razsubrbolizquierdosubrbolderecho.
Inorden:subrbolizquierdoraizsubrbolderecho.
Postorden:subrbolizquierdosubrbolderechoraz.
Porejemplo,alrecorrerelrboldeexpresionesanteriorenpreordenseobtiene:
*+abcd
Alrecorrerelrboleninordenseobtiene:
a+b*cd
Alrecorrerelrbolenpostordenseobtiene:
ab+cd*
Laexpresinqueseobtieneconelrecorridoenpostordenseconocecomonotacinpolacainversa.

rbolesgenerales
Enunrbolgeneralcadanodopuedeposeerunnmeroindeterminadodehijos.Laimplementacindelos
nodosenestecasoserealizadelasiguientemanera:comonosesabedeantemanocuantoshijostieneun
nodoenparticularseutilizandosreferencias,unaasuprimerhijoyotraasuhermanomscercano.Laraz
delrbolnecesariamentetienelareferenciaasuhermanocomonull.
classNodoArbolGeneral
{
Objectelemento;
NodoArbolGeneralhijo;
NodoArbolGeneralhermano;
}

Ntesequetodorbolgeneralpuederepresentarsecomounrbolbinario,conlasalvedadqueelhijoderecho
delarazessiemprenull.Sisepermitequelarazdelrboltengahermanos,loqueseconocecomobosque,
entoncessetienequeelconjuntodelosbosquesgeneralesesisomorfoalconjuntodelosrbolesbinarios.En
efecto,laspropiedadesvistasenlosrbolesbinariossesiguencumpliendoenlosrbolesgenerales.

CC3001AlgoritmosyEstructurasdeDatos:Tiposdedatos
abstractos
UnTipodedatoabstracto(enadelanteTDA)esunconjuntodedatosuobjetosalcualseleasocian
operaciones.ElTDAproveedeunainterfazconlacualesposiblerealizarlasoperacionespermitidas,
abstrayndosedelamaneraencomoestnimplementadasdichasoperaciones.Estoquieredecirqueun
mismoTDApuedeserimplementadoutilizandodistintasestructurasdedatosyproveerlamismafuncionalidad.
Elparadigmadeorientacinaobjetospermiteelencapsulamientodelosdatosylasoperacionesmediantela
definicindeclaseseinterfaces,locualpermiteocultarlamaneraencmohasidoimplementadoelTDAy
solopermiteelaccesoalosdatosatravsdelasoperacionesprovistasporlainterfaz.
EnestecaptuloseestudiarnTDAbsicoscomolosonlaslistas,pilasycolas,ysemostrarnalgunosusos
prcticosdeestosTDA.

TDAlista
UnalistasedefinecomounaseriedeNelementosE1,E2,...,EN,ordenadosdemaneraconsecutiva,esdecir,
elelementoEk(quesedenominaelementoksimo)esprevioalelementoEk+1.Silalistacontiene0elementos
sedenominacomolistavaca.
Lasoperacionesquesepuedenrealizarenlalistason:insertarunelementoenlaposicink,borrarelksimo
elemento,buscarunelementodentrodelalistaypreguntarsilalistaestavaca.
Unamanerasimpledeimplementarunalistaesutilizandounarreglo.Sinembargo,lasoperacionesde
insercinyborradodeelementosenarreglossonineficientes,puestoqueparainsertarunelementoenla
partemediadelarregloesnecesariomovertodosloselementosqueseencuentrendelantedel,parahacer
espacio,yalborrarunelementoesnecesariomovertodosloselementosparaocuparelespaciodesocupado.
UnaimplementacinmseficientedelTDAselograutilizandolistasenlazadas.
AcontinuacinsepresentaunaimplementacinenJavadelTDAutilizandolistasenlazadasysusoperaciones
asociadas:
estaVacia():devuelveverdaderosilalistaestavaca,falsoencasocontrario.
insertar(x,k):insertaelelementoxenlaksimaposicindelalista.
buscar(x):devuelvelaposicinenlalistadelelementox.
buscarK(k):devuelveelksimoelementodelalista.
eliminar(x):eliminadelalistaelelementox.
Enlaimplementacinconlistasenlazadasesnecesariotenerencuentaalgunosdetallesimportantes:si
solamentesedisponedelareferenciaalprimerelemento,elaadiroremoverenlaprimeraposicinesun
casoespecial,puestoquelareferenciaalalistaenlazadadebemodificarsesegnlaoperacinrealizada.

Adems,paraeliminarunelementoenparticularesnecesarioconocerelelementoqueloantecede,yeneste
caso,qupasaconelprimerelemento,quenotieneunpredecesor?
Parasolucionarestosinconvenientesseutilizalaimplementacindelistaenlazadaconnodocabecera.Con
esto,todosloselementosdelalistatendrnunelementoprevio,puestoqueelpreviodelprimerelementoesla
cabecera.Unalistavacacorresponde,enestecaso,aunacabeceracuyareferenciasiguienteesnull.

LosarchivosNodoLista.java,IteradorLista.javayLista.javacontienenunaimplementacincompletadelTDA
lista.LaclaseNodoListaimplementalosnodosdelalistaenlazada,laclaseListaimplementalasoperaciones
delalistapropiamentetal,ylaclaseIteradorListaimplementaobjetosquepermitenrecorrerlalistayposeela
siguienteinterfaz:
avanzar():avanzaeliteradoralsiguientenododelalista.
obtener():retornaelelementodelnodoendondeseencuentraeliterador.
Costodelasoperacionesentiempo:
Insertar/eliminarelementoenksimaposicin:O(k)(SepuedehacerenO(1)?).
Buscarelementox:O(N)(promedio).

TDApila
Unapila(stackopushdowneningls)esunalistadeelementosdelacualslosepuedeextraerelltimo
elementoinsertado.Laposicinendondeseencuentradichoelementosedenominatopedelapila.Tambin
seconocealaspilascomolistasLIFO(LASTINFIRSTOUT:elltimoqueentraeselprimeroquesale).

LainterfazdeesteTDAproveelassiguientesoperaciones:

apilar(x):insertaelelementoxeneltopedelapila(pusheningls).
desapilar():retornaelelementoqueseencuentreeneltopedelapilayloeliminadesta(popeningls).
tope():retornaelelementoqueseencuentreeneltopedelapila,perosineliminarlodesta(topen
ingls).
estaVacia():retornaverdaderosilapilanocontieneelementos,falsoencasocontrario(isEmptyeningls).
Nota:algunosautoresdefinendesapilarcomosacarelelementodeltopedelapilasinretornarlo.

ImplementacindelTDApila
Acontinuacinsemuestrandosmanerasdeimplementarunapila:utilizandounarregloyutilizandounalista
enlazada.EnamboscasoselcostodelasoperacionesesdeO(1).
Implementacinutilizandoarreglos
Paraimplementarunapilautilizandounarreglo,bastacondefinirelarreglodeltipodedatoquesealmacenar
enlapila.Unavariabledeinstanciaindicarlaposicindeltopedelapila,locualpermitirrealizarlas
operacionesdeinsercinyborrado,ytambinpermitirsabersilapilaestavaca,definiendoquedicha
variablevale1cuandonohayelementosenelarreglo.
classPilaArreglo
{
privateObject[]arreglo;
privateinttope;
privateintMAX_ELEM=100;//maximonumerodeelementosenlapila
publicPilaArreglo()
{
arreglo=newObject[MAX_ELEM];
tope=1;//inicialmentelapilaestavaca
}
publicvoidapilar(Objectx)
{
if(tope+1<MAX_ELEM)//siestallenaseproduceOVERFLOW
{
tope++;
arreglo[tope]=x;
}
}
publicObjectdesapilar()
{
if(!estaVacia())//siestavaciaseproduceUNDERFLOW
{

Objectx=arreglo[tope];
tope;
returnx;
}
}
publicObjecttope()
{
if(!estaVacia())//siestavaciaesunerror
{
Objectx=arreglo[tope];
returnx;
}
}
publicbooleanestaVacia()
{
if(tope==1)
{
returntrue;
}
else
{
returnfalse;
}
}
}
Elinconvenientedeestaimplementacinesqueesnecesariofijardeantemanoelnmeromximode
elementosquepuedecontenerlapila,MAX_ELEM,yporlotantoalapilarunelementoesnecesariocontrolar
quenoseinserteunelementosilapilaestallena.Sinembargo,enJavaesposiblesolucionaresteproblema
creandounnuevoarreglomsgrandequeelanterior,eldobleporejemplo,ycopiandoloselementosdeun
arregloaotro:
publicvoidapilar(Objectx)
{
if(tope+1<MAX_ELEM)//siestallenaseproduceOVERFLOW
{
tope++;
arreglo[tope]=x;
}
else
{
MAX_ELEM=MAX_ELEM*2;

Object[]nuevo_arreglo=newObject[MAX_ELEM];
for(inti=0;i<arreglo.length;i++)
{
nuevo_arreglo[i]=arreglo[i];
}
tope++;
nuevo_arreglo[tope]=x;
arreglo=nuevo_arreglo;
}
}
Implementacinutilizandolistasenlazadas
Enestecasonoexisteelproblemadetenerquefijareltamaomximodelapila(peroestacotadoporla
cantidaddememoriadisponible).Laimplementacinesbastantesimple:loselementosseinsertanalprincipio
delalista(apilar)ysiempreseextraeelprimerelementodelalista(desapilarytope),porloquebastacon
tenerunareferenciaalprincipiodelalistaenlazada.Sidichareferenciaesnull,entonceslapilaestavaca.
classPilaLista
{
privateNodoListalista;
publicPilaLista()
{
lista=null;
}
publicvoidapilar(Objectx)
{
lista=newNodoLista(x,lista);
}
publicObjectdesapilar()//siestavaciaseproduceUNDERFLOW
{
if(!estaVacia())
{
Objectx=lista.elemento;
lista=lista.siguiente;
returnx;
}
}
publicObjecttope()
{

if(!estaVacia())//siestavaciaesunerror
{
Objectx=lista.elemento;
returnx;
}
}
publicbooleanestaVacia()
{
returnlista==null;
}
}
Dependiendodelaaplicacinqueseledealapilaesnecesariodefinirqueaccinrealizarencasodeque
ocurraoverflow(rebalsedelapila)ounderflow(intentardesapilarcuandolapilaestavaca).Javaposeeun
mecanismodenominadoexcepciones,quepermiterealizaraccionescuandoseproducenciertoseventos
especficos(comoporejemplooverflowounderflowenunapila).
EnambasimplementacioneselcostodelasoperacionesqueproveeelTDAtienencostoO(1).

Ejemplodeuso:eliminacinderecursividad
SupongaqueunafuncinFrealizaunllamadorecursivodentrodesucdigo,loqueseilustraenlasiguiente
figura:

SilallamadarecursivaesloltimoquehacelafuncinF,entoncesdichallamadasepuedesubstituirporun
ciclowhile.Estecasoesconocidocomotailrecursionyenloposiblehayqueevitarloenlaprogramacin,ya
quecadallamadarecursivaocupaespacioenlamemoriadelcomputador,yenelcasodeltailrecursiones
muysimpleeliminarla.Porejemplo:
voidimprimir(int[]a,intj)//versinrecursiva
{
if(j<a.length)
{
System.out.println(a[j]);
imprimir(a,j+1);//tailrecursion

}
}
voidimprimir(int[]a,intj)//versiniterativa
{
while(j<a.length)
{
System.out.println(a[j]);
j=j+1;
}
}
Enelcasogeneral,cuandoelllamadorecursivoserealizaenmediodelafuncinF,larecursinsepuede
eliminarutilizandounapila.
Porejemplo:recorridoenpreordendeunarbolbinario.
//"raiz"eslareferenciaalaraizdelarbol
//llamadoinicial:preorden(raiz)
//versionrecursiva
voidpreorden(Nodonodo)
{
if(nodo!=null)
{
System.out.print(nodo.elemento);
preorden(nodo.izq);
preorden(nodo.der);
}
}
//primeraversioniterativa
voidpreorden(Nodonodo)
{
Nodoaux;
Pilapila=newPila();//piladenodos
pila.apilar(nodo);
while(!pila.estaVacia())//mientraslapilanoestevacia
{
aux=pila.desapilar();
if(aux!=null)
{

System.out.print(aux.elemento);
//primeroseapilaelnododerechoyluegoelizquierdo
//paramantenerelordencorrectodelrecorrido
//aldesapilarlosnodos
pila.apilar(aux.der);
pila.apilar(aux.izq);
}
}
}
//segundaversioniterativa
//dadoquesiempreelultimonodoapiladodentrodelbloqueifes
//aux.izqpodemosasignarlodirectamenteaauxhastaquestesea
//null,esdecir,elbloqueifseconvierteenunbloquewhile
//ysecambiaelsegundoapilarporunaasignaciondelareferencia
voidpreorden(Nodonodo)
{
Nodoaux;
Pilapila=newPila();//piladenodos
pila.apilar(nodo);
while(!pila.estaVacia())//mientraslapilanoestevacia
{
aux=pila.desapilar();
while(aux!=null)
{
System.out.print(aux.elemento);
pila.apilar(aux.der);
aux=aux.izq;
}
}
}
Sibienlosprogramasnorecursivossonmseficientesquelosrecursivos,laeliminacinderecursividad
(exceptoenelcasodetailrecursion)lequitaclaridadalcdigodelprograma.Porlotanto:
Amenudoesconvenienteeliminareltailrecursion.
Unmtodorecursivoesmenoseficientequeunonorecursivo,perosloenpocasoportunidadesvalela
penaeliminarlarecursin.

TDAcola
Unacola(queueeningls)esunalistadeelementosendondesiempreseinsertannuevoselementosalfinal
delalistayseextraenelementosdesdeeliniciodelalista.TambinseconocealascolascomolistasFIFO

(FIRSTINFIRSTOUT:elprimeroqueentraeselprimeroquesale).

Lasoperacionesbsicasenunacolason:
encolar(x):insertaelelementoxalfinaldelacola(enqueueeningls).
sacar():retornaelelementoqueseubicaaliniciodelacola(dequeueeningls).
estaVacia():retornaverdaderosilacolaestavaca,falsoencasocontrario.
AligualqueconelTDApila,unacolasepuedeimplementartantoconarregloscomoconlistasenlazadas.A
continuacinseverlaimplementacinusandounarreglo.
Lasvariablesdeinstancianecesariasenlaimplementacinson:
primero:indicaelndicedelaposicindelprimerelementodelacola,esdecir,laposicindelelementoa
retornarcuandoseinvoquesacar.
ultimo:indicaelndicedelaposicindeltimoelementodelacola.Siseinvocaencolar,elelementodebe
serinsertadoenelcasillerosiguientealqueindicalavariable.
numElem:indicacuntoselementosposeelacola.DefiniendoMAX_ELEMcomoeltamaomximodel
arreglo,yporlotantodelacola,entonceslacolaestavacasinumElem==0yestllenasi
numElem==MAX_ELEM.

Undetallefaltanteeselsiguiente:qupasasilavariableultimosobrepasaelrangodendicesdelarreglo?
Estosesolucionadefiniendoquesidespusdeinsertarunelementoelndiceultimo==MAX_ELEM,entonces
seasignaultimo=0,ylossiguienteselementosserninsertadosalcomienzodelarreglo.Estonoproduce
ningnefectoenlalgicadelasoperacionesdelTDA,puessiempresesacaelelementoreferenciadoporel
ndiceprimero,aunqueenvalorabsolutoprimero>ultimo.Esteenfoqueesconocidocomoimplementacin
conarreglocircular,ylaformamsfcildeimplementarloeshaciendolaaritmticadesubndicesmdulo
MAX_ELEM.

classColaArreglo
{
privateObject[]arreglo;
privateintprimero,ultimo,numElem;
privateintMAX_ELEM=100;//maximonumerodeelementosenlacola
publicColaArreglo()
{
arreglo=newObject[MAX_ELEM];
primero=0;
ultimo=1;
numElem=0;
}
publicvoidencolar(Objectx)
{
if(numElem<=MAX_ELEM)//siestallenaseproduceOVERFLOW
{
ultimo=(ultimo+1)%MAX_ELEM;
arreglo[ultimo]=x;
numElem++;
}
}
publicObjectsacar()
{
if(!estaVacia())//siestavaciaseproduceUNDERFLOW
{
Objectx=arreglo[primero];
primero=(primero+1)%MAX_ELEM;
numElem;
returnx;
}
}
publicbooleanestaVacia()

{
returnnumElem==0;
}
}
Nuevamenteenestecaso,dependiendodelaaplicacin,sedebedefinirquhacerencasodeproducirse
OVERFLOWoUNDERFLOW.
Conestaimplementacin,todaslasoperacionesdelTDAcolatienencostoO(1).
TDAColadePrioridad
Unacoladeprioridadesuntipodedatosabstractoquealmacenaunconjuntodedatosqueposeenunallave
perteneciente a algn conjunto ordenado, y permite insertar nuevos elementos y extraer el mximo (o el
mnimo,encasodequelaestructuraseorganiceconuncriteriodeordeninverso).
Es frecuente interpretar los valores de las llaves como prioridades, con lo cual la estructura permite insertar
elementosdeprioridadcualquiera,yextraereldemejorprioridad.
Dosformassimplesdeimplementarcolasdeprioridadson:
Unalistaordenada:

Heaps
Un heap es un rbol binario de una forma especial, que permite su almacenamiento en un arreglo sin usar
punteros.
Unheaptienetodossusnivelesllenos,exceptoposiblementeeldemsabajo,yenesteltimolosnodosestn
lomsalaizquierdaposible.
Ejemplo:

La numeracin por niveles (indicada bajo cada nodo) son los subndices en donde cada elemento sera
almacenadoenelarreglo.Enelcasodelejemplo,elarreglosera:

Lacaractersticaquepermitequeunheapsepuedaalmacenarsinpunterosesque,siseutilizalanumeracin
pornivelesindicada,entonceslarelacinentrepadresehijoses:
Hijosdelnodoj={2*j,2*j+1}
Padredelnodok=floor(k/2)
Un heap puede utilizarse para implementar una cola de prioridad almacenando los datos de modo que las
llavesestnsiempreordenadasdearribaaabajo(adiferenciadeunrboldebsquedabinaria,queordena
sus llaves de izquierda a derecha). En otras palabras, el padre debe tener siempre mayor prioridad que sus
hijos(verejemplo).
Implementacindelasoperacionesbsicas
Insercin:
Lainsercinserealizaagregandoelnuevoelementoenlaprimeraposicinlibredelheap,estoes,elprximo
nodoquedeberaaparecerenelrecorridoporniveleso,equivalentemente,uncasilleroqueseagregaalfinal
delarreglo.
Despusdeagregaresteelemento,laforma del heap se preserva, pero la restriccin de orden no tiene por
qucumplirse.Pararesolveresteproblema,sielnuevoelementoesmayorquesupadre,seintercambiacon
l, y ese proceso se repite mientras sea necesario. Una forma de describir esto es diciendo que el nuevo
elemento"trepa"enelrbolhastaalcanzarelnivelcorrectosegnsuprioridad.

Elsiguientetrozodeprogramamuestraelprocesodeinsercindeunnuevoelementox:
a[++n]=x;
for(j=n;j>1&&a[j]>a[j/2];j/=2)
{#intercambiamosconelpadre
t=a[j];
a[j]=a[j/2];

a[j/2]=t;
}
Elprocesodeinsercin,enelpeorcaso,tomauntiempoproporcionalalaalturadelrbol,estoes,O(logn).
Extraccindelmximo
Elmximoevidentementeestenlarazdelrbol(casillero1delarreglo).Alsacarlodeah,podemosimaginar
que ese lugar queda vacante. Para llenarlo, tomamos al ltimo elemento del heap y lo trasladamos al lugar
vacante.Encasodequenoestbienahdeacuerdoasuprioridad(queeslomsprobable!),lohacemos
descenderintercambindolosiempreconelmayordesushijos.Decimosqueesteelemento"sehunde"hasta
suniveldeprioridad.

Elsiguientetrozodeprogramaimplementaestealgoritmo:
m=a[1];#Lavariablemllevaelmximo
a[1]=a[n];#Movemoselltimoalarazyachicamoselheap
j=1;
while(2*j<=n)#mientrastengaalgnhijo
{
k=2*j;#elhijoizquierdo
if(k+1<=n&&a[k+1]>a[k])
k=k+1;#elhijoderechoeselmayor
if(a[j]>a[k])
break;#esmayorqueamboshijos
t=a[j];
a[j]=a[k];
a[k]=t;
j=k;#lointercambiamosconelmayorhijo
}
Estealgoritmotambindemorauntiempoproporcionalalaalturadelrbolenelpeorcaso,estoes,O(logn).

CC3001AlgoritmosyEstructurasdeDatos:TDAdiccionario
Dadounconjuntodeelementos{X1,X2,...,XN},todosdistintosentres,sedeseaalmacenarlosenuna
estructuradedatosquepermitalaimplementacineficientedelasoperaciones:
bsqueda(X):dadounelementoX,conocidocomollavedebsqueda,encontrarlodentrodelconjuntoo
decirquenoest.
insercin(X):agregarunnuevoelementoXalconjunto.
eliminacin(X):eliminarelelementoXdelconjunto.
EstasoperacionesdescribenalTDAdiccionario.Enelpresentecaptuloseverndistintasimplementaciones
deesteTDAyseestudiarnlasconsideracionesdeeficienciadecadaunadedichasimplementaciones.

Implementacionessencillas
UnamanerasimpledeimplementarelTDAdiccionarioesutilizandounalista,lacualpermiteimplementarla
insercindenuevoselementosdemaneramuyeficiente,definiendoquesiempreserealizaalcomienzodela
lista.Elproblemaquetieneestaimplementacinesquelasoperacionesdebsquedayeliminacinson
ineficientes,puestoquecomoenlalistaloselementosestndesordenadosesnecesariorealizaruna
bsquedasecuencial.Porlotanto,loscostosasociadosacadaoperacinson:
bsqueda:O(n)(bsquedasecuencial).
insercin:O(1)(insertandosiemprealcomienzodelalista).
eliminacin:O(n)(bsqueda+O(1)).
OtramanerasencilladeimplementarelTDAesutilizandounarregloordenado.Enestecaso,laoperacinde
insercinyeliminacinsonineficientes,puestoqueparamantenerelordendentrodelarregloesnecesario
"correr"loselementosparadejarespacioalinsertarunnuevoelemento.Sinembargo,laventajaquetiene
mantenerelordenesqueesposiblerealizarunabsquedabinariaparaencontrarelelementobuscado.

Bsquedabinaria
Supongaquesedisponedelarregloa,detamaon,endondesetienealmacenadoelconjuntodeelementos
ordenadosdemenoramayor.Parabuscarunelementoxdentrodelarreglosedebe:
Buscarelndicedelaposicinmediadelarregloendondesebuscaelelemento,quesedenotarm.
Inicialmente,m=n/2.
Sia[m]=xseencontrelelemento(findelabsqueda),encasocontrariosesiguebuscandoenellado
derechooizquierdodelarreglodependiendosia[m]<xoa[m]>xrespectivamente.
Costodelabsquedabinaria:

T(n)=1+T(n/2)(aproximadamente)
T(n)=2+T(n/4)
T(n)=3+T(n/8)
...
T(n)=k+T(n/2k)paratodok>=0
Escogiendok=log2n:
=>T(n)=log2n+T(1)=1+log2n=O(logn).
Programacindelabsquedabinaria
Lavariableirepresentaelprimercasillerodelarregloendondeesposiblequeseencuentreelelementox,la
variablejrepresentaelltimocasillerodelarreglohastadondexpuedepertenecer,conj>=i.
Inicialmente:i=0yj=n1.

Encadaiteracin:
Sielconjuntoesvaco(ji<0),oseasij<i,entonceselelementoxnoestenelconjunto(bsqueda
infructuosa).
Encasocontrario,m=(i+j)/2.Six=a[m],elelementofueencontrado(bsquedaexitosa).Six<a[m]se
modificaj=m1,sinosemodificai=m+1ysesigueiterando.
Implementacin:
publicintbusquedaBinaria(int[]a,intx)
{
inti=0,j=a.length1;
while(i<=j)
{
intm=(i+j)/2;
if(x==a[m])
{
returnm;
}
elseif(x<a[m])
{
j=m1;
}
else

{
i=m+1;
}
}
returnNO_ENCONTRADO;//NO_ENCONTRADOsedefinecomo1
}
Eficienciadelabsquedabinaria
Silanicaoperacinpermitidaentreloselementosdelconjuntoeslacomparacin,entoncesqutan
eficienteeslabsquedabinaria?.
Todoalgoritmodebsquedabasadoencomparacionescorrespondeaalgnrboldedecisin.Cadanodode
dichorbolcorrespondealconjuntodeelementoscandidatosendondeseencuentraelelementobuscado,y
queesconsistenteconlascomparacionesrealizadasentreloselementos.Losarcosdelrbolcorrespondena
losresultadosdelascomparaciones,queenestecasopuedensermayorqueomenorqueelelemento
buscado,esdecir,esunrboldedecisinbinario.
Elnmerodecomparacionesrealizadasporelalgoritmodebsquedaesigualalaalturadelrboldedecisin
(profundidaddelahojamsprofunda).
Lema:seaDunrbolbinariodealturah.Dtienealoms2hhojas.
Demostracin:porinduccin.Sih=0elrboltieneunsolonodoquenecesariamenteesunahoja(notiene
hijos),conloquesetieneelcasobase.Enelcasogeneral,setieneunaraz,quenopuedeserunahoja,que
poseeunsubrbolizquierdoyderecho,cadaunoconunaalturamximadeh1.Porhiptesisdeinduccin,
lossubrbolespuedenteneraloms2h1hojas,dandountotaldealoms2hhojasentreambossubrboles.
Quedaentoncesdemostrado.
Lema:siunrbolbinariodealturahtienethojas,entonceshlog2t.
Demostracin:directodellemaanterior.
Sineselnmerodenodosdeelementosdelconjunto,elnmeroderespuestasposibles(hojasdelrbolde
decisin)esden+1,ellemaanteriorimplicaqueelcostoenelpeorcasoesmayoroigualqueellogaritmodel
nmeroderespuestasposibles.
Corolario:cualquieralgoritmodebsquedamediantecomparacionessedemoraalmenos

preguntasenelpeorcaso.Porlotanto,labsquedabinariaesptima.

Bsquedasecuencialconprobabilidadesdeaccesonouniforme
SetieneunconjuntodeelementosX1,X2,...,XN,cuyasprobabilidadesdeaccesoson,respectivamente,P1,
P2,...,PN.Naturalmente:

Elcostoesperadodelabsquedasecuenciales:

EstecostoesmnimocuandoP1>=P2>=P3...>=PN.
QupasasilasprobabilidadesPknosonconocidasdeantemano?Enestecaso,noesposibleordenara
prioriloselementossegnsuprobabilidaddeaccesodemayoramenor.
Mtodosautoorganizantes
Idea:cadavezqueseaccesaunelementoXksemodificalalistaparaquelosaccesosfuturosaXkseanms
eficientes.Algunaspolticasdemodificacindelalistason:
TR(transpose):seintercambiadeposicinXkconXk1(siemprequek>1).
MTF(movetofront):semueveelelementoXkalprincipiodelalista.

SepuededemostrarqueCostooptimo<=CostoMTF<=2Costooptimo.

Arbolesdebsquedabinaria
Unrboldebsquedabinaria,enadelanteABB,esunrbolbinarioendondetodoslosnodoscumplenla
siguientepropiedad(sinperdergeneralidadseasumirqueloselementosalmacenadossonnmeros
enteros):sielvalordelelementoalmacenadoenunnodoNesX,entoncestodoslosvaloresalmacenadosen
elsubrbolizquierdodeNsonmenoresqueX,ylosvaloresalmacenadosenelsubrbolderechodeNson
mayoresqueX.

LosABBpermitenrealizardemaneraeficientelasoperacionesprovistasporelTDAdiccionario,comosever
acontinuacin.

BsquedaenunABB
Estaoperacinretornaunareferenciaalnodoendondeseencuentraelelementobuscado,X,onullsidicho
elementonoseencuentraenelrbol.Laestructuradelrbolfacilitalabsqueda:
Sielrbolestavaco,entonceselelementonoestyseretornanull.
SielrbolnoestavacoyelelementoalmacenadoenlaraizesX,seencontrelelementoyseretornauna
referenciaadichonodo.
SiXesmenorqueelelementoalmacenadoenlaraizsesiguebuscandorecursivamenteenelsubrbol
izquierdo,ysiXesmayorqueelelementoalmacenadoenlarazsesiguebuscandorecursivamenteenel
subrbolderecho.
Ntesequeelordenenloscualesserealizanlospasosanterioresescrucialparaasegurarquelabsqueda
enelABBselleveacabodemaneracorrecta.

CostodebsquedaenunABB
Peorcaso
Paraunrboldado,elpeorcasoesigualalalongituddelcaminomslargodesdelarazaunahoja,yelpeor
casosobretodoslosrbolesposiblesesO(n).
Casopromedio
Supuestos:
Costodebsquedaexitosa:

dondeInesellargodecaminosinternos.
Costodebsquedainfructuosa:

dondeEnesellargodecaminosexternos.
RecordandoqueEn=In+2n,setiene:

Porlotanto,laecuacinquerelacionaloscostosdebsquedaexitosaeinfructuosaes:(*)

EstomuestraqueamedidaqueseinsertanmselementosenelABBloscostosdebsquedaexitosae
infructuosasevanhaciendocadavezmsparecidos.
ElcostodebsquedadeunelementoenunABBesigualalcostodebsquedainfructuosajustoantesde
insertarloms1.Estoquieredecirquesiyahabankelementosenelrbolyseinsertaunoms,elcosto
esperadodebsquedaparaesteltimoes1+C'k.Porlotanto:

Estaltimaecuacinimplicaque:

Restandoambasecuacionesseobtiene:(**)

Delaecuacin(*)setiene:

Reemplazandoen(**):

Obtenindoselasiguienteecuacinderecurrencia:

Desenrollandolaecuacin:(***)

SedefineHn,conocidocomonmerosarmnicos,como:

Sepuededemostrarque:

Reemplazandoen(***)yrecordando(*)seobtiene:

Porlotanto,elcostopromediodebsquedaenunABBesO(log(n)).

InsercinenunABB
ParainsertarunelementoXenunABB,serealizaunabsquedainfructuosadeesteelementoenelrbol,yen
ellugarendondedebierahaberseencontradoseinserta.Comosevioenlaseccinanterior,elcosto
promediodeinsercinenunABBesO(log(n)).

EliminacinenunABB
Primeroserealizaunabsquedadelelementoaeliminar,digamosX.Silabsquedafueinfructuosanose
hacenada,encasocontrariohayqueconsiderarlossiguientescasosposibles:
SiXesunahojasinhijos,sepuedeeliminarinmediatamente.

SiXtieneunsolohijo,entoncessecambialareferenciadelpadreaXparaqueahorareferenciealhijode
X.

SiXtienedoshijos,elcasocomplicado,seprocededelasiguienteforma:seeliminaelnodoY=minimo
nododelsubrbolderechodeX,elcualcorrespondeaunodeloscasosfcilesdeeliminacin,yse
reemplazaelvaloralmacenadoenelnodoXporelvalorqueestabaalmacenadoenelnodoY.

NtesequeelrbolsiguecumpliendolaspropiedadesdeunABBconestemtododeeliminacin.
Sideantemanosesabequeelnmerodeeliminacionesserpequeo,entonceslaeliminacinsepuede
substituirporunamarcaqueindiquesiunnodofueeliminadoono.Estaestrategiaesconocidacomo
eliminacinperezosa(lazydeletion).

ArbolesAVL
Definicin:unrbolbalanceadoesunrbolquegarantizacostosdebsqueda,insercinyeliminacinen
tiempoO(log(n))inclusoenelpeorcaso.
UnrbolAVL(AdelsonVelskiiyLandis)esunarboldebsquedabinariaqueasegurauncostoO(log(n))en
lasoperacionesdebsqueda,insercinyeliminacin,esdecir,poseeunacondicindebalance.
Lacondicindebalancees:unrbolesAVLsiparatodonodointernoladiferenciadealturadesusdos
rboleshijosesmenoroigualque1.

Porejemplo:(elnmerodentrodecadanodoindicasualtura)

Problema:paraunaalturahdada,culeselrbolAVLconmnimonmerodenodosquealcanzaesa
altura?.NtesequeendichorbolAVLladiferenciadealturadesushijosentodoslosnodostienequeser1
(demostrarporcontradiccin).Porlotanto,siAhrepresentaalrbolAVLdealturahconmnimonmerode
nodos,entoncessushijosdebenserAh1yAh2.

EnlasiguientetablanhrepresentaelnmerodenodosexternosdelrbolAVLconmnimonmerodenodos
internos.
h

Ah

n h

13

Porinspeccin:(F hrepresentalosnmerosdeFibonacci)

Porlotanto,laalturadeunrbolAVLes

.EstoimplicaautomticamentequelabsquedaenunAVLtienecostode

enelpeorcaso.

InsercinenunAVL
LainsercinenunAVLserealizadelamismaformaqueenunABB,conlasalvedadquehayquemodificarla
informacindelaalturadelosnodosqueseencuentranenelcaminoentreelnodoinsertadoylarazdel
rbol.Elproblemapotencialquesepuedeproducirdespusdeunainsercinesqueelrbolconelnuevo
nodonoseaAVL:

Enelejemplodelafigura,lacondicindebalancesepierdealinsertarelnmero3enelrbol,porloquees
necesariorestaurardealgunaformadichacondicin.Estosiempreesposibledehaceratravsdeuna
modificacinsimpleenelrbol,conocidacomorotacin.
SupongaquedespusdelainsercindeunelementoXelnododesbalanceadomsprofundoenelrbolesN.
EstoquieredecirqueladiferenciadealturaentrelosdoshijosdeNtienequeser2,puestoqueantesdela
insercinelrbolestababalanceado.Laviolacindelbalancepudoserocasionadaporalgunodelos
siguientescasos:
ElelementoXfueinsertadoenelsubrbolizquierdodelhijoizquierdodeN.
ElelementoXfueinsertadoenelsubrbolderechodelhijoizquierdodeN.
ElelementoXfueinsertadoenelsubrbolizquierdodelhijoderechodeN.
ElelementoXfueinsertadoenelsubrbolderechodelhijoderechodeN.
Dadoqueelprimeryltimocasosonsimtricos,asicomoelsegundoyeltercero,slohayquepreocuparse
dedoscasosprincipales:unainsercin"haciaafuera"conrespectoaN(primeryltimocaso)ounainsercin
"haciaadentro"conrespectoaN(segundoytercercaso).
Rotacinsimple
Eldesbalanceporinsercin"haciaafuera"conrespectoaNsesolucionaconunarotacinsimple.

Lafiguramuestralasituacinantesydespusdelarotacinsimple,yejemplificaelcuartocasoanteriormente
descrito,esdecir,elelementoXfueinsertadoenE,ybcorrespondealnodoN.Antesdelainsercin,laaltura
deNeslaalturadeC+1.Idealmente,pararecuperarlacondicindebalancesenecesitariabajarAenunnivel
ysubirEenunnivel,locualselogracambiandolasreferenciasderechadebeizquierdaded,quedandoeste
ltimocomonuevarazdelrbol,N'.Ntesequeahoraelnuevorboltienelamismaalturaqueantesde
insertarelelemento,C+1,locualimplicaquenopuedehabernodosdesbalanceadosmsarribaenelrbol,
porloqueesnecesariaunasolarotacinsimpleparadevolverlacondicindebalancealrbol.Ntese
tambinqueelrbolsiguecumpliendoconlapropiedaddeserABB.
Rotacindoble
Claramenteundesbalanceproducidoporunainsercin"haciaadentro"conrespectoaNnoessolucionado
conunarotacinsimple,dadoqueahoraesCquienproduceeldesbalanceycomosevioanteriormenteeste
subrbolmantienesuposicinrelativaconunarotacinsimple.

Paraelcasodelafigura(tercercaso),laalturadeNantesdelainsercineraG+1.Pararecuperarelbalance
delrbolesnecesariosubirCyEybajarA,locualselograrealizandodosrotacionessimples:laprimeraentre
dyf,ylasegundaentred,yarotado,yb,obtenindoseelresultadodelafigura.Aesteprocesodedos
rotacionessimplesseleconocecomorotacindoble,ycomolaalturadelnuevorbolN'eslamismaque
antesdelainsercindelelemento,ningnelementohaciaarribadelrbolquedadesbalanceado,porloque
soloesnecesariaunarotacindoblepararecuperarelbalancedelrboldespusdelainsercin.Nteseque
elnuevorbolcumpleconlapropiedaddeserABBdespusdelarotacindoble.

EliminacinenunAVL
LaeliminacinenrbolAVLserealizademaneraanlogaaunABB,perotambinesnecesarioverificarquela
condicindebalancesemantengaunavezeliminadoelelemento.Encasoquedichacondicinsepierda,ser
necesariorealizarunarotacinsimpleodobledependiendodelcaso,peroesposiblequeserequieramsde
unarotacinparareestablecerelbalancedelrbol.

Arboles23
Losrboles23sonrbolescuyosnodosinternospuedencontenerhasta2elementos(todoslosrbolesvistos
conanterioridadpuedencontenerslounelementopornodo),yporlotantounnodointernopuedetener2o3
hijos,dependiendodecuntoselementosposeaelnodo.Deestemodo,unnododeunrbol23puedetener
unadelassiguientesformas:

Unrbol23puedesersimuladoutilizandorbolesbinarios:

Unapropiedaddelosrboles23esquetodaslashojasestnalamismaprofundidad,esdecir,losrboles2
3sonrbolesperfectamentebalanceados.Lasiguientefiguramuestraunejemplodeunrbol23:

Ntesequesesiguecumpliendolapropiedaddelosrbolesbinarios:nodosinternos+1=nodosexternos.
Dadoqueelrbol23esperfectamentebalanceado,laalturadesteestaacotadapor:

Insercinenunrbol23
ParainsertarunelementoXenunrbol23serealizaunabsquedainfructuosayseinsertadichoelemento
enelltimonodovisitadodurantelabsqueda,locualimplicamanejardoscasosdistintos:
SielnododondeseinsertaXtenaunasolallave(doshijos),ahoraquedacondosllaves(treshijos).

SielnododondeseinsertaXtenadosllaves(treshijos),quedatransitoriamentecontresllaves(cuatro
hijos)ysedicequeestsaturado(overflow).Enestecasosedeberealizarunaoperacindesplit:elnodo
saturadosedivideendosnodosconunvalorcadauno(elmenoryelmayordelostres).Elvalordelmedio
subeunnivel,alpadredelnodosaturado.

ElproblemaseresuelveaniveldeXyZ,peroesposiblequeelnodoquecontieneaYahoraestesaturado.
Enestecaso,serepiteelmismoprodecimientoanteriorunnivelmsarriba.Finalmente,silarazeselnodo
saturado,stesedivideysecreaunanuevarazunnivelmsarriba.Estoimplicaquelosrboles23
crecen"haciaarriba".
Ejemplosdeinsercinenrboles23:

Eliminacinenunrbol23
Sinperdergeneralidadsesupondrqueelelementoaeliminar,Z,seencuentraenelnivelmsbajodelrbol.
Siestonoesas,entonceselsucesoryelpredecesordeZseencuentrannecesariamenteenelnivelmsbajo
(porqu?)enestecasobastaconborrarunodeellosyluegoescribirsuvalorsobreelalmacenadoenZ.La
eliminacintambinpresentadosposiblescasos:
ElnododondeseencuentraZcontienedoselementos.EnestecasoseeliminaZyelnodoquedaconun
soloelemento.

ElnododondeseencuentraZcontieneunsoloelemento.EnestecasoaleliminarelelementoZelnodo
quedasinelementos(underflow).Sielnodohermanoposeedoselementos,selequitaunoyseinsertaen
elnodoconunderflow.

Sielnodohermanocontienesolounallave,selequitaunelementoalpadreyseinsertaenelnodocon
underflow.

Siestaoperacinproduceunderflowenelnodopadre,serepiteelprocedimientoanteriorunnivelms
arriba.Finalmente,silarazquedavaca,staseelimina.
Costodelasoperacionesdebsqueda,insercinyeliminacinenelpeorcaso:

ArbolesB
Laideadelosrboles23sepuedegeneralizararbolest(2t1),dondet>=2esunparmetrofijo,esdecir,
cadanododelrbolposeeentrety2t1hijos,exceptoporlarazquepuedetenerentre2y2t1hijos.Enla
prctica,tpuedeserbastantegrande,porejemplot=100oms.EstosrbolessonconocidoscomorbolesB
(Bayer).

InsercinenunrbolB
Seagregaunanuevallavealnivelinferior.
Sielnodorebalsa(overflow),esdecir,siquedacon2thijos,sedivideen2nodosconthijoscadaunoy
subeunelementoalnodopadre.Sielpadrerebalsa,serepiteelprocedimientounnivelmsarriba.
Finalmente,silaraizrebalsa,sedivideen2ysecreaunanuevaraizunnivelmsarriba.

EliminacinenunrbolB
Seeliminalallave,ysuhojarespectiva,delnivelinferior.
Sielnodoquedaconmenosdethijos(underflow)selepidenprestadosalgunosalhermano,porejemplo
mitadymitad.
Sielhermanonotieneparaprestar,entoncessefusionanlos2nodosyserepiteelprocedimientoconel
padre.

Silarazquedavaca,seelimina.

VariantesdelosrbolesB
ArbolesB*:cuandounnodorebalsasetrasladanhijoshaciaelhermano,yslosecreaunnuevonodo
cuandoambosrebalsan.Estopermiteaumentarlautilizacinmnimadelosnodos,queanteseradeun
50%.
ArbolesB+:Lainformacinsolosealmacenaenlashojas,ylosnodosinternoscontienenlosseparadores
quepermitenrealizarlabsquedadeelementos.

Arbolesdigitales
Supongaqueloselementosdeunconjuntosepuedenrepresentarcomounasecuenciadebits:
X=b0b1b2...bk
Adems,supongaqueningunarepresentacindeunelementoenparticularesprefijodeotra.Unrboldigital
esunrbolbinarioendondelaposicindeinsercindeunelementoyanodependedesuvalor,sinodesu
representacinbinaria.Loselementosenunrboldigitalsealmacenansloensushojas,perono
necesariamentetodaslashojascontienenelementos(verejemplomsabajo).Estaestructuradedatos
tambinesconocidacomotrie.
Elsiguienteejemplomuestraunrboldigitalcon5elementos.

Bsquedaenunrboldigital
ParabuscarunelementoXenunrboldigitalseprocededelasiguientemanera:
SeexaminanlosbitsbidelelementoX,partiendodesdeb0enadelante.
Sibi=0seavanzaporlaramaizquierdayseexaminaelsiguientebit,bi+1.
Sibi=1seavanzaporlaramaderechayseexaminaelsiguientebit.
Elprocesoterminacuandosellegaaunahoja,nicolugarposibleendondepuedeestarinsertadoX.

Insercinenunrboldigital

SupongaquesedeseainsertarelelementoXenelrboldigital.SerealizaunabsquedainfructuosadeX
hastallegaraunahoja,supongaqueelltimobitutilizadoenlabsquedafuebk.Silahojaestavaca,se
almacenaXendichahoja.Encasocontrario,sedividelahojautilizandoelsiguientebitdelelemento,bk+1,yse
repiteelprocedimiento,siesnecesario,hastaquequedeslounelementoporhoja.
Conesteprocesodeinsercin,laformaqueobtieneelrboldigitalesinsensiblealordendeinsercindelos
elementos.

Eliminacinenunrboldigital
SupongaqueelelementoaeliminaresX.Seeliminaelelementodelahoja,yporlotantostaquedavaca.Si
lahojavacaeshermanadeotrahojanovaca(i.e.,unahojacondatos),entoncesambassefusionanyse
repiteelprocedimientomientrasseaposible.

Costopromediodebsquedaenunrboldigital
ElcostopromediodebsquedaenunrboldigitalesmejorqueenunABB,yaqueenunrboldigitalla
probabilidadqueunelementoseencuentreenelsubrbolizquierdooderechoeslamisma,1/2,dadoqueslo
dependedelvalordeunbit(0o1).Encambio,enunABBdichaprobabilidadesproporcionalal"peso"del
subrbolrespectivo.

HnsonlosnmerosarmnicosyP(n)esunafuncinperidicademuybajaamplitud(O(106))

Arbolesdebsquedadigital
Enestetipoderbolesloselementossealmacenanenlosnodosinternos,aligualqueenunABB,perola
ramificacindelrbolessegnlosbitsdelasllaves.Elsiguienteejemplomuestraunrboldebsquedadigital
(ABD),endondeelordendeinsercinesB,A,C,D,E:

LosABDposeenunmejorcostopromediodebsquedaquelosABB,perotambienesO(log(n)).

Skiplists

AlprincipiodelcaptulosevioqueunadelasmanerassimplesdeimplementarelTDAdiccionarioesutilizando
unalistaenlazada,perotambinsevioqueeltiempodebsquedapromedioesO(n)cuandoeldiccionario
poseenelementos.Lafiguramuestraunejemplodelistaenlazadasimpleconcabecera,dondeloselementos
estnordenadosascendentemente:

Sinembargo,esposiblemodificarlaestructuradedatosdelalistayasmejorareltiempodebsqueda
promedio.Lasiguientefiguramuestraunalistaenlazadaendondeacadanodoparseleagregauna
referenciaalnodoubicadodosposicionesmsadelanteenlalista.Modificandoligeramenteelalgoritmode
bsqueda,aloms

nodossonexaminadosenelpeorcaso.

Estaideasepuedeextenderagregandounareferenciacadacuatronodos.Enestecaso,aloms

nodossonexaminados:

Elcasolmiteparaesteargumentosemuestraenlasiguientefigura.Cada2inodoposeeunareferenciaal
nodo2iposicionesmsadelanteenlalista.Elnmerototaldereferenciassolohasidodoblado,peroahoraa
loms

nodossonexaminadosdurantelabsqueda.Notequelabsquedaenestaestructuradedatoses
bsicamenteunabsquedabinaria,porloqueeltiempodebsquedaenelpeorcasoesO(logn).

Elproblemaquetieneestaestructuradedatosesqueesdemasiadorgidaparapermitirinsercionesde
maneraeficiente.Porlotanto,esnecesariorelajarlevementelascondicionesdescritasanteriormentepara
permitirinsercioneseficientes.
Sedefineunnododenivelkcomoaquelnodoqueposeekreferencias.Seobservadelafiguraanteriorque,
aproximadamente,lamitaddelosnodossondenivel1,queuncuartodelosnodossondenivel2,etc.En
general,aproximadamenten/2inodossondeniveli.Cadavezqueseinsertaunnodo,seeligeelnivelque

tendraleatoriamenteenconcordanciaconladistribucindeprobabilidaddescrita.Porejemplo,sepuede
lanzarunamonedaalaire,ymientrassalgacaraseaumentaelniveldelnodoainsertaren1(partiendodesde
1).Estaestructuradedatosesdenominadaskiplist.Lasiguientefiguramuestraunejemplodeunaskiplist:

Bsquedaenunaskiplist
SupongaqueelelementoabuscaresX.Secomienzaconlareferenciasuperiordelacabecera.Serealizaun
recorridoatravsdeestenivel(pasoshorizontales)hastaqueelsiguientenodoseamayorqueXoseanull.
Cuandoestoocurra,secontinaconlabsquedaperounnivelmsabajo(pasovertical).Cuandonosepueda
bajardenivel,estoes,yaseestenelnivelinferior,entoncesserealizaunacomparacinfinalparasabersiel
elementoXestenlalistaono.

Insercinenunaskiplist
Seprocedecomoenlabsqueda,manteniendounamarcaenlosnodosdondeserealizaronpasosverticales,
hastallegaralnivelinferior.Elnuevoelementoseinsertaenloposicinendondedebierahaberseencontrado,
secalculaaleatoriamentesunivelyseactualizanlasreferenciasdelosnodosmarcadosdependiendodelnivel
delnuevonododelalista.

Costodebsquedaenunaskiplist
Elanlisisdelcostodebsquedapromedioenunaskiplistescomplicado,perosepuededemostrarqueen
promedioesO(logn).Tambinsepuededemostrarquesiseusaunamonedacargada,esdecir,quela
probabilidadquesalgacaraespylaprobabilidadquesalgaselloesq=1p,entonceselcostodebsquedaes
mnimoparap=1/e(e=basedellogaritmonatural).

ABBptimos
ABBconprobabilidadesdeaccesonouniforme
Problema:dadosnelementosX1<X2<...<Xn,conprobabilidadesdeaccesoconocidasp1,p2,...,pn,ycon
probabilidadesdebsquedainfructuosaconocidasq0,q1,...,qn,sedeseaencontrarelABBqueminimiceel
costoesperadodebsqueda.
Porejemplo,paraelsiguienteABBcon6elementos:

Elcostoesperadodebsquedaes:
C(q0,q6)=(2q0+2p1+4q1+4p2+4q2+3p3+4q3+4p4+4q4)+p5+(2q5+2p6+2q6)
=(q0+p1+q1+p2+q2+p3+q3+p4+q4+p5+q5+p6+q6)+
(1q0+1p1+3q1+3p2+3q2+2p3+3q3+3p4+3q4)+
(1q5+1p6+1q6)
=W(q0,q6)+C(q0,q4)+C(q5,q6)
Estoes,elcostodelrbolcompletoesigualal"peso"delrbolmsloscostosdelossubrboles.Silarazes
k:

Ci,j=Wi,j+Ci,k1+Ck,j
Sielrbolcompletoesptimo,entonceslossubrbolestambinloson,peroalrevsnonecesariamentees
cierto,porquelarazkpuedehaberseescogidomal.Luego,paraencontrarelverdaderocostoptimoC_opti,j
esnecesarioprobarcontodaslasmanerasposiblesdeelegirlarazk.

C_opti,j=mini+1<=k<=j{Wi,j+C_opti,k1+C_optk,j}
C_opti,i=0paratodoi=0..n
Notequeel"peso"Wi,jnodependedelavariablek.
Usandoprogramacindinmica(notequeelproblematienesubestructuraptima):
for(i=0;i<=n;i++)
{
C[i,i]=0;//subarbolesdetamao0
W[i,i]=qi;
}
for(l=1;l<=n;l++)
for(i=0;i<=nl;i++)
{
j=i+l;
W[i,j]=W[i,j1]+pj+qj;
C[i,j]=mini+1<=k<=j{W[i,j]+C[i,k1]+C[k,j]}
}
Tiempo:O(n3).
Unamejora:sedefineri,jcomoelkqueminimizamini+1<=k<=j{W[i,j]+C[i,k1]+C[k,j]}.Intuitivamente
ri,j1<=ri,j<=ri+1,j,ycomori,j1yri+1,jyasonconocidosalmomentodecalcularri,j,bastaconcalcularminri,j1
<=k<=ri+1,j{W[i,j]+C[i,k1]+C[k,j]}.

Conestamejora,sepuededemostrarqueelmtododemoraO(n2)(Ejercicio:demostrarlo).

SplayTrees
EstaestructuragarantizaqueparacualquiersecuenciadeMoperacionesenunrbol,empezandodesdeun
rbolvaco,tomaalomstiempoO(Mlog(N)).Apesarqueestonogarantizaquealgunaoperacinen
particulartometiempoO(N),siaseguraquenoexisteningunasecuenciadeoperacionesqueseamala.En
general,cuandounasecuenciadeMoperacionestomatiempoO(Mf(N)),sedicequeelcostoamortizadoen
tiempodecadaoperacinesO(f(N)).Porlotanto,enunsplaytreeloscostosamortizadosporoperacinson
deO(log(N)).
Laideabsicadeunsplaytreeesquedespusqueunvaloresinsertadoobuscadoenelrbol,elnodo
correspondienteaestevalorse"sube"hastalarazdelrbolatravsderotaciones(similaresalasrotaciones
enlosrbolesAVL).Unamaneraderealizaresto,queNOfunciona,esrealizarrotacionessimplesentreel
nodoaccesadoysupadrehastadejaralnodoaccesadocomorazdelrbol.Elproblemaquetieneeste
enfoqueesquepuededejarotrosnodosmuyabajoenelrbol,ysepuedeprobarqueexisteunasecuencia
deMoperacionesquetomatiempoO(MN),porloqueestaideanoesmuybuena.

Laestrategiade"splaying"essimilaralaideadelasrotacionessimples.Sielnodokesaccesado,se
realizarnrotacionesparallevarlohastalarazdelrbol.Seakunnododistintoalarazdelrbol.Sielpadre
dekeslarazdelrbol,entoncesserealizaunarotacinsimpleentreestosdosnodos.Encasocontrario,el
nodokposeeunnodopadrepyunnodo"abuelo"a.Pararealizarlasrotacionessedebenconsiderardos
casosposibles(msloscasossimtricos).
Elprimercasoesunainsercinzigzag,endondekesunhijoderechoypesunhijoizquierdo(oviceversa).
Enestecaso,serealizaunarotacindobleestiloAVL:

Elotrocasoesunainsecinzigzig,endondekypsonamboshijosizquierdooderecho.Enestecaso,se
realizalatransformacinindicadaenlafigurasiguiente:

Elefectodelsplayingesnoslodemoverelnodoaccesadoalaraz,sinoquesubetodoslosnodosdel
caminodesdelarazhastaelnodoaccesadoaproximadamentealamitaddesuprofundidadanterior,acosta
quealgunospocosnodosbajenalomsdosnivelesenelrbol.

Elsiguienteejemplomuestracomoquedaelsplaytreeluegodeaccesaralnodod.

Elprimerpasoesunzigzagentrelosnodosd,byf.

Elltimopasoesunzigzigentrelosnodosd,hyj.

Paraborrarunelementodeunsplaytreesepuedeprocederdelasiguienteforma:serealizaunabsqueda
delnodoaeliminar,locuallodejaenlarazdelrbol.Sistaeseliminada,seobtienendossubrbolesSizqy
Sder.SebuscaelelementomayorenSizq,conlocualdichoelementopasaasersunuevaraz,ycomoerael
elementomayorSizqyanotienehijoderecho,porloquesecuelgaSdercomosubrbolderechodeSizq,conlo
queterminalaoperacindeeliminacin.
Elanlisisdelossplaytreesescomplejo,porquedebeconsiderarlaestructuracambiantedelrbolencada
accesorealizado.Porotraparte,lossplaytreessonmsfcilesdeimplementarqueunAVLdadoquenohay
queverificarunacondicindebalance.

Hashing
Supongaquedeseaalmacenarnnmerosenteros,sabiendodeantemanoquedichosnmerosseencuentran
enunrangoconocido0,...,k1.Pararesolveresteproblema,bastaconcrearunarreglodevaloresbooleanos
detamaokymarcarconvalortrueloscasillerosdelarreglocuyondiceseaigualalvalordeloselementosa
almacenar.Esfcilverqueconestaestructuradedatoselcostodebsqueda,insercinyeliminacinesO(1).

Esteenfoquetienedosgrandesproblemas:
Elvalordekpuedesermuygrande,yporlotantonohabracupoenmemoriaparaalmacenarelarreglo.
Piense,porejemplo,entodoslosposiblesnombresdepersonas.
Losdatosaalmacenarpuedenserpocos,conlocualseestaradesperdiciandoespaciodememoria.

Unamaneraderesolverestosproblemasesusandounafuncinh,denominadafuncindehash,que
transormeunelementoX,pertenecientealuniversodeelementosposibles,enunvalorh(X)enelrango[0,...,
m1],conm<<k.Enestecaso,semarcaelcasillerocuyondiceesh(X)paraindicarindicarqueelelementoX
pertenecealconjuntodeelementos.Estaestructuradedatosesconocidacomotabladehashing.

Lafuncinhdebeserdetipopseudoaleatorioparadistribuirlasllavesuniformementedentrodelatabla,es
decir,Pr(h(X)=z)=1/mparatodozen[0,...,m1].LallaveXsepuedeinterpretarcomounnmeroentero,y
lasfuncionesh(X)tpicassondelaforma:

dondecesunaconstante,pesunnmeroprimoymeseltamaodelatabladehashing.Distintosvalores
paraestosparmetrosproducendistintasfuncionesdehash.
Problemadeestenuevoenfoque:colisiones.
Laparadojadeloscumpleaos
Culeselnmeronmnimodepersonasqueesnecesarioreunirenunasalaparaquelaprobabilidadque
dosdeellatengansucumpleaosenelmismodaseamayorque1/2?
Seadnlaprobabilidadquenohayacoincidenciaendosfechasdecumpleaos.Setieneque:

Culeselmnimontalquedn<1/2?
Respuesta:n=23=>dn=0.4927.Noteque23esuna"pequea"fraccinde365.
Estoquieredecirqueconunapequeafraccindelconjuntodeelementosesposibletenercolisionesconalta
probabilidad.
Pararesolverelproblemadelascolisiones,existendosgrandesfamiliasdemtodos:
Encadenamiento(usarestructurasdinmicas).

Direccionamientoabierto(intentarconotrafuncindehash).

Encadenamiento
Laideadeestemtodoesquetodosloselementosquecaenenelmismocasilleroseenlacenenunalista,en
lacualserealizaunabsquedasecuencial.

Sedefineparaunconjuntoconnelementos:
Cn:costoesperadodebsquedaexitosa.
C'n:costoesperadodebsquedainfructuosa.

:factordecargadelatabla.

Estoimplicaqueelcostoesperadodebsquedaslodependedelfactordecarga

,ynodeltamaodelatabla.
Hashingconlistasmezcladas
Enestecasonoseusareaderebalse,sinoqueloselementossealmacenanencualquierlugarlibredelrea
primaria.
Ejemplo:h(X)=Xmod10

Loscostosesperadosdebsquedason:

Eliminacinentablasdehashingconencadenamiento
Conlistasseparadaselalgoritmoessimple,bastaconeliminarelelementodelalistaenlazada
correspondiente.Enelcasodelaslistamezcladas,elalgoritmoesmscomplejo(ejercicio).

Direccionamientoabierto
Engeneral,estopuedeservistocomounasucesindefuncionesdehash{h0(X),h1(X),...}.Primeroseintenta
contabla[h0(X)],sielcasilleroestocupadosepruebacontabla[h1(X)],yassucesivamente.
Linearprobing
Eselmtodomssimplededireccionamientoabierto,endondelasfuncionesdehashsedefinencomo:

Costoesperadodebsqueda:

Paraunatablallena:

Cuandolatabladehashingestmuyllena,estemtodoresultasermuylento.

Cn

Cn'

.6

1.75

3.63

.7

2.17

6.06

.8

13

.9

5.50

50.50

.99

50.50

5,000.50

.999

500.50

500,000.50

Amedidaquelatablasevallenando,seobservaqueempiezanaaparecerclustersdecasillerosocupados
consecutivos:

Silafuncindehashdistribuyeloselementosuniformementedentrodelatabla,laprobabilidadqueuncluster
crezcaesproporcionalasutamao.Estoimplicaqueunamalasituacinsevuelvepeorcadavezconmayor
probabilidad.Sinembargo,estenoestodoelproblema,puestoquelomismosucedeenhashingcon
encadenamientoynoestanmalo.Elverdaderoproblemaocurrecuando2clustersestnseparadossolopor
uncasillerolibreyesecasilleroesocupadoporalgnelemento:ambosclustersseunenenunomuchoms
grande.
Otroproblemaquesurgeconlinearprobingesconocidocomoclusteringsecundario:sialrealizarlabsqueda
dedoselementosenlatablaseencuentranconelmismocasilleroocupado,entoncestodalabsqueda
subsiguienteeslamismaparaamboselementos.
Eliminacindeelementos:nosepuedeeliminarunelementoysimplementedejarsucasillerovaco,puesto
quelasbsquedasterminaranendichocasillero.Existendosmanerasparaeliminarelementosdelatabla:
Marcarelcasillerocomo"eliminado",perosinliberarelespacio.Estoproducequelasbsquedaspuedan
serlentasinclusosielfactordecargadelatablaespequeo.
Eliminarelelemento,liberarelcasilleroymoverelementosdentrodelatablahastaqueuncasillero
"verdaderamente"libreseaencontrado.Implementarestaoperacinescomplejoycostoso.
Hashingdoble
Enestaestrategiaseusandosfuncionesdehash:unafuncin

conocidacomodireccininicial,yunafuncin

conocidacomopaso.Porlotanto:

Elegirmprimoaseguraquesevaavisitartodalatablaantesqueseempiecenarepetirloscasilleros.Nota:
slobastaquemys(X)seanprimosrelativos(ejercicio:demostraloporcontradiccin).
Elanlisisdeeficienciadeestaestrategiaesmuycomplicado,yseestudianmodelosidealizados:muestreosin
reemplazo(uniformprobing)ymuestreoconreemplazo(randomprobing),deloscualesseobtienequelos
costosdebsquedaesperadoson:

Paraunatablallena:

Sibienlassecuenciasdecasillerosobtenidasconhashingdoblenosonaleatorias,enlaprcticasu
rendimientoesparecidoalosvaloresobtenidosconlosmuestreosconysinreemplazo.

Cn

Cn'

.6

1.53

2.5

.7

1.72

3.33

.8

2.01

.9

2.56

10

.99

4.65

100

.999

6.91

1,000

Existenheursticaspararesolverelproblemadelascolisionesenhashingcondireccionamientoabierto,como
porejemplolastcomefirstservedhashing(elelementoquesemuevedecasilleronoeselqueseinsertasino
elqueyaloocupaba)yRobinHoodhashing(elelementoquesequedaenelcasilleroesaquelquese
encuentremslejosdesuposicinoriginal),quesibienmantienenelpromediodebsquedaconrespectoal
mtodooriginal(firstcomefirstserved)disminuyendramticamentesuvarianza.

Hashingenmemoriasecundaria
Cuandosealmacenainformacinenmemoriasecundaria(disco),lafuncindecostopasaaserelnmerode
accesosadisco.Enhashingparamemoriasecundaria,lafuncindehashsirveparaescogerunbloque
(pgina)deldisco,endondecadabloquecontienebelementos.Elfactordecargapasaaser

.Porejemplo,utilizandohashingencadenado:

Estemtodoeseficienteparaunfactordecargapequeo,yaqueconfactordecargaaltolabsquedatoma
tiempoO(n).Pararesolverestopuedesernecesarioincrementareltamaodelatabla,yasreducirelfactor
decarga.Engeneralestoimplicareconstruirtodalatabla,peroexisteunmtodoquepermitehacercrecerla
tablapaulatinamenteeneltiempodenominadohashingextendible.
Hashingextendible
Supongaquelaspginasdediscosondetamaobyunafuncindehashh(X)>=0(sinlmitesuperior).Seala
descomposicinenbinariodelafuncindehashh(X)=(...b2(X)b1(X)b0(X))2.
Inicialmente,todaslasllavesseencuentranenunanicapgina.Cuandodichapginaserebalsasedivideen
dos,usandob0(X)paradiscriminarentreambaspginas:

Cadavezqueunapginarebalsa,seusaelsiguientebitenlasequenciaparadividirlaendos.Ejemplo:

Elndice(directorio)puedeseralmacenadoenunrbol,peroelhashingextensibleutilizaunaideadiferente.El
rbolesextendidodemaneraquetodosloscaminostenganelmismolargo:

Acontinuacin,elrbolesimplementadocomounarreglodereferencias:

Cuandoseinsertaunelementoyexisteunrebalse,sicaeenlapgina(D,E)estasedivideylasreferenciasde
loscasilleros2y3apuntanalasnuevaspginascreadas.Silapgina(B,C)eslaquesedivide,entoncesel
rbolcreceunnivel,locualimplicaduplicareltamaodeldirectorio.Sinembargo,estonosucedemuya
menudo.
Eltamaoesperadodeldirectorioesligeramentesuperlinear:

CC3001AlgoritmosyEstructurasdeDatos:Ordenacin
Elproblemadeordenarunconjuntodedatos(porejemplo,enordenascendente)tienegranimportanciatanto
tericacomoprctica.Enestaseccinveremosprincipalmentealgoritmosqueordenanmediante
comparacionesentrellaves,paraloscualessepuededemostrarunacotainferiorquecoincideconlacota
superiorprovistaporvariosalgoritmos.Tambinveremosunalgoritmodeotrotipo,quealnohacer
comparaciones,noestsujetoaesacotainferior.
Cotainferior
Supongamos que deseamos ordenar tres datos A, B y C. La siguiente figura muestra un rbol de decisin
posible para resolver este problema. Los nodos internos del rbol representan comparaciones y los nodos
externosrepresentansalidasemitidasporelprograma.

Comosevioenelcaptulodebsqueda,todorboldedecisinconHhojastienealmenosalturalog2H,yla
alturadelrboldedecisinesigualalnmerodecomparacionesqueseefectanenelpeorcaso.
EnunrboldedecisinparaordenarndatossetienequeH=n!,yporlotantosetienequetodoalgoritmoque
ordenendatosmediantecomparacionesentrellavesdebehaceralmenoslog2n!comparacionesenelpeor
caso.
UsandolaaproximacindeStirling,sepuededemostrarquelog2n!=nlog2n+O(n),porlocuallacota
inferioresdeO(nlogn).
Sisuponemosquetodaslasposiblespermutacionesresultantessonequiprobables,esposibledemostrarque
elnmeropromediodecomparacionesquecualquieralgoritmodebehacerestambindeO(nlogn).
Quicksort
EstemtodofueinventadoporC.A.R.Hoareacomienzosdelos'60s,ysiguesiendoelmtodomseficiente
parausogeneral.

Quicksort es un ejemplo clsico de la aplicacin del principio de dividir para reinar. Su estructura es la
siguiente:
Primeroseeligeunelementoalazar,quesedenominaelpivote.
Elarregloaordenarsereordenadejandoalaizquierdaaloselementosmenoresqueelpivote,elpivoteal
medio,yaladerechaloselementosmayoresqueelpivote:

Luegocadasubarregloseordenarecursivamente.
La recursividad termina, en principio, cuando se llega a subarreglos de tamao cero o uno, los cuales
trivialmenteyaestnordenados.Enlaprcticaveremosqueespreferibledetenerlarecursividadantesdeeso,
paranodesperdiciartiempoordenandorecursivamentearreglospequeos,loscualespuedenordenarsems
eficientementeusandoOrdenacinporInsercin,porejemplo.

Costopromedio
Si suponemos, como una primera aproximacin, que el pivote siempre resulta ser la mediana del conjunto,
entonceselcostodeordenarestdado(aproximadamente)porlaecuacinderecurrencia
T(n)=n+2T(n/2)
EstotienesolucinT(n)=nlog2nyes,enrealidad,elmejorcasodeQuicksort.
Para analizar el tiempo promedio que demora la ordenacin mediante Quicksort, observemos que el
funcionamientodeQuicksortpuedegraficarsemedianteunrboldeparticin:

Porlaformaenqueseconstruye,esfcilverqueelrboldeparticinesunrboldebsquedabinaria,ycomo
el pivote es escogido al azar, entonces la raz de cada subrbol puede ser cualquiera de los elementos del
conjuntoenformaequiprobable.Enconsecuencia,losrbolesdeparticinylosrbolesdebsquedabinaria
tienenexactamentelamismadistribucin.

Enelprocesodeparticin,cadaelementodelossubrboleshasidocomparadocontralaraz(elpivote).Al
terminarelproceso,cadaelementohasidocomparadocontratodossusancestros.Sisumamostodasestas
comparaciones,elresultadototalesigualallargodecaminosinternos.
Usandotodasestascorrespondencias,tenemosque,usandolosresultadosyaconocidospararboles,el
nmeropromediodecomparacionesquerealizaQuicksortesde:
1.38nlog2n+O(n)
Porlotanto,Quicksortesdelmismoordenquelacotainferior(enelcasoesperado).

Peorcaso
ElpeorcasodeQuicksortseproducecuandoelpivoteresultasersiempreelmnimooelmximodelconjunto.
Enestecasolaecuacinderecurrenciaes
T(n)=n1+T(n1)
loquetienesolucinT(n)=O(n2).Desdeelpuntodevistadelrboldeparticin,estocorrespondeaunrbol
en"zigzag".
Si bien este peor caso es extremadamente improbable si el pivote se escoge al azar, algunas
implementacionesdeQuicksorttomancomopivotealprimerelementodelarreglo(suponiendoque,alvenirel
arreglo al azar, entonces el primer elemento es tan aleatorio como cualquier otro). El problema es que si el
conjuntovieneenrealidadordenado,entoncescaemosjustoenelpeorcasocuadrtico.
Lo anterior refuerza la importancia de que el pivote se escoja al azar. Esto no aumenta significativamente el
costototal,porqueelnmerototaldeeleccionesdepivoteesO(n).

MejorasaQuicksort
Quicksort puede ser optimizado de varias maneras, pero hay que ser muy cuidadoso con estas mejoras,
porqueesfcilqueterminenempeorandoeldesempeodelalgoritmo.
Enprimerlugar,esdesaconsejablehacercosasqueaumentenlacantidaddetrabajoquesehacedentrodel
"loop"departicin,porqueesteesellugarendondeseconcentraelcostoO(nlogn).
Algunasdelasmejorasquehandadobuenresultadosonlassiguientes:
Quicksortcon"medianade3"
En esta variante, el pivote no se escoge como un elemento tomado al azar, sino que primero se extrae una
muestrade3elementos,yentreellosseescogealamedianadeesamuestracomopivote.
Silamuestraseescogetomandoalprimerelementodelarreglo,aldelmedioyalltimo,entoncesloqueera
elpeorcaso(arregloordenado)setransformadeinmediatoenmejorcaso.

De todas formas, es aconsejable que la muestra se escoja al azar, y en ese caso el anlisis muestra que el
costoesperadoparaordenarnelementoses
(12/7)nlnn=1.19nlog2n
Estareduccinenelcostosedebeaqueelpivoteesahoraunamejoraproximacinalamediana.Dehecho,
sienlugardeescogerunamuestradetamao3,lohiciramoscontamaoscomo7,9,etc.,selograrauna
reduccin an mayor, acercndonos cada vez ms al ptimo, pero con rendimientos rpidamente
decrecientes.
UsodeOrdenacinporInsercinparaordenarsubarreglospequeos
Talcomosedijoantes,noeseficienteordenarrecursivamentesubarreglosdemasiadopequeos.
Enlugardeesto,sepuedeestableceruntamaomnimoM,demodoquelossubarreglosdetamaomenor
queestoseordenanporinsercinenlugardeporQuicksort.
ClaramentedebehaberunvalorptimoparaM,porquesicrecieraindefinidamentesellegaraaunalgoritmo
cuadrtico.Estosepuedeanalizar,yelptimoescercanoa10.
Como mtodo de implementacin, al detectarse un subarreglo de tamao menor que M, se lo puede dejar
simplementesinordenar,retornandodeinmediatodelarecursividad.Alfinaldelproceso,setieneunarreglo
cuyos pivotes estn en orden creciente, y encierran entre ellos a bloques de elementos desordenados, pero
que ya estn en el grupo correcto. Para completar la ordenacin, entonces, basta con hacer una sola gran
pasadadeOrdenacinporInsercin,lacualahoranotienecostoO(n2),sinoO(nM),porqueningnelemento
estaadistanciamayorqueMdesuubicacindefinitiva.
Ordenarrecursivamentesloelsubarreglomspequeo
UnproblemapotencialconQuicksorteslaprofundidadquepuedellegaratenerelarregloderecursividad.En
elpeorcaso,stapuedellegaraserO(n).
Paraevitaresto,vemosprimerocmosepuedeprogramarQuicksortenformanorecursiva,usandounstack.
Elesquemadelalgoritmoseraelsiguiente(enseudoJava):
voidQuicksort(Objecta[])
{
PilaS=newPila();
S.apilar(1,N);//lmitesinicialesdelarreglo
while(!S.estaVacia())
{
(i,j)=S.desapilar();//sacarlmites
if(ji>0)//almenosdoselementosparaordenar
{
p=particionar(a,i,j);//pivotequedaena[p]

S.apilar(i,p1);
S.apilar(p+1,j);
}
}
}
ConesteenfoquesecorreelriesgodequelapilallegueatenerprofundidadO(n).Paraevitaresto,podemos
colocar en la pila slo los lmites del subarreglo ms pequeo, dejando el ms grande para ordenarlo de
inmediato,sinpasarporlapila:
voidQuicksort(Objecta[])
{
PilaS=newPila();
S.apilar(1,N);//lmitesinicialesdelarreglo
while(!S.estaVacia())
{
(i,j)=S.desapilar();//sacarlmites
while(ji>0)//almenosdoselementosparaordenar
{
p=particionar(a,i,j);//pivotequedaena[p]
if(pi>jp)//mitadizquierdaesmayor
{
S.apilar(p+1,j);
j=p1;
}
else
{
S.apilar(i,p1);
i=p+1;
}
}
}
}
Con este enfoque, cada intervalo apilado es a lo ms de la mitad del tamao del arreglo, de modo que si
llamamosS(n)alaprofundidaddelapila,tenemos:
S(n)<=1+S(n/2)
locualtienesolucinlog2n,demodoquelaprofundidaddelapilanuncaesmsquelogartmica.

UnalgoritmodeseleccinbasadoenQuicksort

Es posible modificar el algoritmo de Quicksort para seleccionar el ksimo elemento de un arreglo.


Bsicamente,laideaesejecutarQuicksort,peroenlugardeordenarlasdosmitades,hacerlosoloconaquella
mitadendondeseencontraraelelementobuscado.
Suponemosqueloselementosestnena[1],...,a[n]yquekestentre1yn.Cuandoelalgoritmotermina,
elksimoelementoseencuentraena[k].Elresultadoeselsiguientealgoritmo,conocidocomoQuickselect,
elcualsellamainicialmentecomoQuickselect(a,k,1,N).
voidQuickselect(Objecta[],intk,inti,intj)
{
if(ji>0)//anquedanalmenos2elementos
{
p=particionar(a,i,j);
if(p==k)//bingo!
return;
if(k<p)//seguimosbuscandoalaizquierda
Quickselect(a,k,i,p1);
else
Quickselect(a,k,p+1,j);
}
}
Dado que en realidad se hace slo una llamada recursiva y que sta es del tipo "tail recursion", es fcil
transformarestoenunalgoritmoiterativo(hacerlocomoejercicio).
ElanlisisdeQuickselectesdifcil,perosepuededemostrarqueelcostoesperadoesO(n).Sinembargo,el
peorcasoesO(n2).
Heapsort
Apartirdecualquierimplementacindeunacoladeprioridadesposibleobtenerunalgoritmodeordenacin.
Elesquemadelalgoritmoes:
Comenzarconunacoladeprioridadvaca.
Fasedeconstruccindelacoladeprioridad:
Traspasartodosloselementosdelconjuntoquesevaaordenaralacoladeprioridad,medianten
inserciones.
Fasedeordenacin:
Sucesivamenteextraerelmximonveces.Loselementosvanapareciendoenordendecrecienteysevan
almacenandoenelconjuntodesalida.
Si aplicamos esta idea a las dos implementaciones simples de colas de prioridad, utilizando lista enlazada
ordenada y lista enlazada desordenada, se obtienen los algoritmos de ordenacin por Insercin y por
Seleccin,respectivamente.Ambossonalgoritmoscuadrticos,peroesposiblequeunamejorimplementacin

lleveaunalgoritmomsrpido.EnelcaptulodeTiposdeDatosAbstractosseviqueunaformadeobtener
unaimplementacineficientedecolasdeprioridadesutilizandounaestructuradedatosllamadaheap.
ImplementacindeHeapsort
Al aplicar heaps en la implementacin de cola de prioridad para construir un algoritmo de ordenacin, se
obtiene un algoritmo llamado Heapsort, para el cual resulta que tanto la fase de construccin de la cola de
prioridad,comolafasedeordenacin,tienenambascostoO(nlogn), de modo que el algoritmo completo
tieneesemismocosto.
Porlotanto,Heapsorttieneunordendemagnitudquecoincideconlacotainferior,estoes,esptimoincluso
enelpeorcaso.NtesequeestonoeraasparaQuicksort,elcualeraptimoenpromedio,peronoenelpeor
caso.
Deacuerdoaladescripcindeestafamiliadealgoritmos,daralaimpresindequeenlafasedeconstruccin
delheapserequeriraunarregloaparteparaelheap,distintodelarreglodeentrada.Delamismamanera,se
requerira un arreglo de salida aparte, distinto del heap, para recibir los elementos a medida que van siendo
extradosenlafasedeordenacin.
Enlaprctica,estonoesnecesarioybastaconunsloarreglo:todaslasoperacionespuedenefectuarse
directamentesobreelarreglodeentrada.
Enprimerlugar,encualquiermomentodelaejecucindelalgoritmo,loselementosseencuentran
particionadosentreaquellosqueestnyaoanformandopartedelheap,yaquellosqueseencuentranan
enelconjuntodeentrada,oyaseencuentranenelconjuntodesalida,segnsealafase.Comoningn
elementopuedeestarenmsdeunconjuntoalavez,esclaroque,entodomomento,entotalnuncase
necesitamsdencasillerosdememoria,silaimplementacinserealizabien.
EnelcasodeHeapsort,durantelafasedeconstruccindelheap,podemosutilizarlasceldasdelaizquierda
delarregloparair"armando"elheap.Lasceldasnecesariasparaelloselasvamos"quitando"alconjuntode
entrada,elcualvaperdiendoelementosamedidaqueseinsertanenelheap.Alconcluirestafase,todoslos
elementoshansidoinsertados,yelarreglocompletoesunsologranheap.

Enlafasedeordenacin,sevanextrayendoelementosdelheap,conlocualestesecontraedetamaoydeja
espaciolibrealfinal,elcualpuedeserjustamenteocupadoparairalmacenandoloselementosamedidaque
vansaliendodelheap(recordemosquevanapareciendoenordendecreciente).

Optimizacindelafasedeconstruccindelheap
Comosehasealadoanteriormente,tantolafasedeconstruccindelheapcomoladeordenacindemoran
tiempoO(nlogn).Estoeselmnimoposible(enordendemagnitud),demodoquenoesposiblemejorarlo
significativamente.
Sinembargo,esposiblemodificarlaimplementacindelafasedeconstruccindelheapparaqueseamucho
mseficiente.

Laideaesinvertirelordendelas"mitades"delarreglo,haciendoqueel"input"estalaizquierdayel"heap"a
laderecha.
Enrealidad,siel"heap"estaladerecha,entoncesnoesrealmenteunheap,porquenoesunrbolcompleto
(lefaltalapartesuperior),peroslonosinteresaqueenesesectordelarreglosecumplanlasrelacionesde
ordenentrea[k]y{a[2*k],a[2*k+1]}.Encadaiteracin,setomaelltimoelementodel"input"ysele
"hunde"dentrodelheapdeacuerdoasuniveldeprioridad.

Alconcluir,sellegaigualmenteaunheapcompleto,peroelprocesoessignificativamentemsrpido.
Laraznesque,alser"hundido",unelementopagauncostoproporcionalasudistanciaalfondodelrbol.
Dadalascaractersticasdeunrbol,lagranmayoradeloselementosestnalfondoomuycercadel,porlo
cualpaganuncostomuybajo.Enunanlisisaproximado,lamitaddeloselementospagan0(yaestnal
fondo),lacuartapartepaga1,laoctavapartepaga2,etc.Sumandotodoesto,tenemosqueelcostototalest
acotadopor

locualesigualan.
Radixsort
Losmtodosanterioresoperanmediantecomparacionesdellaves,yestnsujetos,porlotanto,alacota
inferiorO(nlogn).Veremosacontinuacinunmtodoqueoperadeunamaneradistinta,ylograordenarel
conjuntoentiempolineal.
Supongamosquequeremosordenarnnmeros,cadaunodeelloscompuestodekdgitosdecimales.El
siguienteesunejemploconn=10,k=5.

73895
93754
82149
99046
04853
94171
54963
70471
80564
66496
Imaginandoqueestosdgitosformanpartedeunamatriz,podemosdecirquea[i,j]eseljsimodeli
simoelementodelconjunto.
Esfcil,enunapasada,ordenarelconjuntosilallavedeordenacinesunsolodgito,porejemploeltercero
deizquierdaaderecha:
99046
82149
94171
70471
66496
80564
93754
73895
04853
54963
Llamemosjalaposicindeldgitomedianteelcualseordena.Laordenacinsepuedehacerutilizandouna
coladeentrada,quecontienealconjuntoaordenar,yunarreglode10colasdesalida,subindicadasde0a9.
LoselementossevansacandodelacoladeentradaysevanencolandoenlacoladesalidaQ[dj],dondedj
eseljsimodgitodelelementoqueseesttransfiriendo.
Alterminaresteproceso,loselementosestnseparadospordgito.Paracompletarlaordenacin,basta
concatenarlaskcolasdesalidayformarnuevamenteunasolacolacontodosloselementos.

Esteprocesosehaceenunapasadasobrelosdatos,ytomatiempoO(n).
Paraordenarelconjuntoporlasllavescompletas,repetimoselprocesodgitopordgito,encadapasada
separandoloselementossegnelvalordeldgitorespectivo,luegorecolectndolosparaformarunasolacola,
yrealimentandoelprocesoconesosmismosdatos.Elconjuntocompletoquedafinalmenteordenadosilos
dgitossevantomandodederechaaizquierda(estonoesobvio!).
ComohayquerealizarkpasadasycadaunadeellastomatiempoO(n),eltiempototalesO(kn),queesel
tamaodelarchivodeentrada(enbytes).Porlotanto,laordenacintomatiempolinealeneltamaodelos
datos.
Elprocesoanteriorsepuedegeneralizarparacualquieralfabeto,noslodgitos(porejemplo,ASCII).Esto
aumentaelnmerodecolasdesalida,peronocambiasustancialmenteeltiempoquedemoraelprograma.
Archivosconrecordsdelargovariable
Silaslneasaordenarnosontodasdelmismolargo,esposiblealargarlashastacompletarellargomximo,
conlocualelalgoritmoanterioresaplicable.Perosihayalgunaspocaslneasdesproporcionadamentelargas
yotrasmuycortas,sepuedeperdermuchaeficiencia.
Esposible,aunquenolovamosaveraqu,generalizarestealgoritmoparaordenarlneasdelargovariablesin
necesidaddealargarlas.Elresultadoesquelaordenacinserealizaentiempoproporcionalaltamaodel
archivo.
MergesortyOrdenamientoExterno
Sitenemosdosarchivosqueyaestnordenados,podemosmezclarlosparaformarunsoloarchivoordenado
entiempoproporcionalalasumadelostamaosdelosdosarchivos.
Estosehaceleyendoelprimerelementodecadaarchivo,copiandohacialasalidaalmenordelosdos,y
avanzandoalsiguienteelementoenelarchivorespectivo.Cuandounodelosdosarchivossetermina,todos

loselementosrestantesdelotrosecopianhacialasalida.Esteprocesosedenomina"mezcla",obien"merge",
porsunombreeningls.
Comocadaelementosecopiaslounavez,yconcadacomparacinsecopiaalgnelemento,esevidente
queelcostodemezclarlosdosarchivoseslineal.
Sibienesposiblerealizarelprocesodemezcladedosarregloscontiguosinsitu,elalgoritmoesmuy
complicadoynoresultaprctico.Porestarazn,elprocesoseimplementageneralmentecopiandodeun
archivoaotro.
Usandoestaideaenformareiterada,esposibleordenarunconjunto.Unaformadeverestoes
recursivamente,usando"dividirparareinar".Elsiguienteseudocdigoilustraestaidea:
mergesort(S)#retornaelconjuntoSordenado
{
if(Sesvacootieneslo1elemento)
return(S);
else
{
DividirSendosmitadesAyB;
A'=mergesort(A);
B'=mergesort(B);
return(merge(A',B'));
}
}
Eltiempototalestdadoaproximadamenteporlaecuacinderecurrencia
T(n)=2T(n/2)+n
lacualtienesolucinO(nlogn),demodoqueelalgoritmoresultaserptimo.
Estomismosepuedeimplementarenformanorecursiva,agrupandoloselementosdeadosymezclndolos
paraformarparesordenados.Luegomezclamosparesparaformarcudruplasordenadas,yas
sucesivamentehastamezclarlasltimasdosmitadesyformarelconjuntocompletoordenado.Comocada
"ronda"tienecostolinealyserealizanlognrondas,elcostototalesO(nlogn).
LaideadeMergesorteslabasedelamayoradelosmtodosdeordenamientoexterno,estoes,mtodosque
ordenanconjuntosalmacenadosenarchivosmuygrandes,endondenoesposiblecopiartodoelcontenidodel
archivoamemoriaparaaplicaralgunodelosmtodosestudiadosanteriormente.
Enlasimplementacionesprcticasdeestosmtodos,seutilizaelenfoquenorecursivo,optimizadousandolas
siguientesideas:

Nosecomienzaconelementosindividualesparaformarparesordenados,sinoquesegeneranarchivos
ordenadoslomsgrandesposibles.Paraesto,elarchivodeentradasevaleyendoportrozosamemoriay
seordenamedianteQuicksort,porejemplo.
Enlugardemezclarslodosarchivossehaceunamezclamltipleconkarchivosdeentrada.Comoen
cadaiteracinhaykcandidatosaserelsiguienteelementoensalir,ysiemprehayqueextraralmnimode
ellosysustituirloenlalistadecandidatosporsusucesor,laestructuradedatosapropiadaparaelloesun
heap.
Encasoquenobasteconunapasadademezclamltipleparaordenartodoelarchivo,elprocesoserepite
lasvecesqueseanecesario.
Aligualqueenloscasosanteriores,elcostototalesO(nlogn).

CC3001AlgoritmosyEstructurasdeDatos:Grafos
DefinicionesBsicas
UngrafoconsistedeunconjuntoVdevrtices(onodos)yunconjuntoEdearcosqueconectanaesos
vrtices.
Ejemplos:

V={v1,v2,v3,v4,v5}
E={{v1,v2},{v1,v3},{v1,v5},{v2,v3},{v3,v4},{v4,v5}}V={v1,v2,v3,v4}
E={(v1,v2),(v2,v2),(v2,v3),(v3,v1),(v3,v4),(v4,v3)}
Ademsdeesto,losgrafospuedenserextendidosmediantelaadicindertulos(labels)alosarcos.Estos
rtulospuedenrepresentarcostos,longitudes,distancias,pesos,etc.
Representacionesdegrafosenmemoria
Matrizdeadyacencia
UngrafosepuederepresentarmedianteunamatrizAtalqueA[i,j]=1sihayunarcoqueconectaviconvj,y
0sino.Lamatrizdeadyacenciadeungrafonodirigidoessimtrica.
Unamatrizdeadyacenciapermitedeterminarsidosvrticesestnconectadosonoentiempoconstante,pero
requierenO(n2)bitsdememoria.Estopuedeserdemasiadoparamuchosgrafosqueaparecenen
aplicacionesreales,endonde|E|<<n2.OtroproblemaesqueserequieretiempoO(n)paraencontrarlalista
devecinosdeunvrticedado.
Listasdeadyacencia
Estarepresentacinconsisteenalmacenar,paracadanodo,lalistadelosnodosadyacentesal.Parael
segundoejemploanterior,

v1:v2
v2:v2,v3
v3:v1,v4
v4:v3
EstoutilizaespacioO(|E|)ypermiteaccesoeficientealosvecinos,peronohayaccesoaleatorioalosarcos.
Caminos,ciclosyrboles
Uncaminoesunasecuenciadearcosenqueelextremofinaldecadaarcocoincideconelextremoinicialdel
siguienteenlasecuencia.

Uncaminoessimplesinoserepitenvrtices,exceptoposiblementeelprimeroyelltimo.
Uncicloesuncaminosimpleycerrado.

Ungrafoesconexosidesdecualquiervrticeexisteuncaminohastacualquierotrovrticedelgrafo.
Sedicequeungrafonodirigidoesunrbolsiesconexoyacclico.

RecorridosdeGrafos
Enmuchasaplicacionesesnecesariovisitartodoslosvrticesdelgrafoapartirdeunnododado.Algunas
aplicacionesson:
Encontrarciclos
Encontrarcomponentesconexas
Encontrarrbolescobertores
Haydosenfoquebsicos:
Recorrido(obsqueda)enprofundidad(depthfirstsearch):
Laideaesalejarselomsposibledelnodoinicial(sinrepetirnodos),luegodevolverseunpasoeintentarlo
mismoporotrocamino.
Recorrido(obsqueda)enamplitud(breadthfirstsearch):
Sevisitaatodoslosvecinosdirectosdelnodoinicial,luegoalosvecinosdelosvecinos,etc.
RecorridoenProfundidad(DFS)
Amedidaquerecorremoselgrafo,iremosnumerandocorrelativamentelosnodosencontrados(1,2,...).
Suponemosquetodosestosnmerossonceroinicialmente,yutilizamosuncontadorglobaln,tambin
inicializadoencero.
Elsiguientealgoritmoenseudocdigomuestracmosepuedehacerestetipoderecorridorecursivamente:
DFS(v)//recorreenprofundidadapartirdelvrticev
{
++n;
DFN[v]=n;
for(todowtalque{v,w}estenEyDFN[w]==0)
DFS(w);
}
Parahacerunrecorridoenprofundidadapartirdelnodov,utilizamoselsiguienteprogramaprincipal:

n=0;
for(todow)
DFN[w]=0;
DFS(v);
Sihubieramsdeunacomponenteconexa,estonollegaraatodoslosnodos.Paraestopodemoshacer:
n=0;
ncc=0;//nmerodecomponentesconexas
for(todow)
DFN[w]=0;
while(existevenVconDFN[v]==0)
{
++ncc;
DFS(v);
}
Ejercicio:Cmoutilizarestealgoritmoparadetectarsiungrafoesacclico?
Tambinesposibleimplementarunrecorridonorecursivoutilizandounapila:
Pilapila=newPila();
n=0;
for(todow)
DFN[w]=0;
pila.apilar(v);//pararecorrerapartirdev
while(!pila.estaVacia())
{
v=pila.desapilar();
if(DFN[v]==0)//primeravezquesevisitaestenodo
{
++n;
DFN[v]=n;
for(todowtalque{v,w}estaenE)
pila.apilar(w);
}
}
Recorridoenamplitud(BFS)
LaimplementacinessimilaraladeDFS,peroseutilizaunacolaenlugardeunapila.
Elresultadoesquelosnodossevisitanenordencrecienteenrelacinasudistanciaalnodoorigen.

rbolescobertores
DadoungrafoGnodirigido,conexo,sedicequeunsubgrafoTdeGesunrbolcobertorsiesunrboly
contieneelmismoconjuntodenodosqueG.

Todorecorridodeungrafoconexogeneraunrbolcobertor,consistentedelconjuntodelosarcosutilizados
parallegarporprimeravezacadanodo.
Paraungrafodadopuedenexistirmuchosrbolescobertores.Siintroducimosunconceptode"peso"(o
"costo")sobrelosarcos,esinteresantetratardeencontrarunrbolcobertorquetengacostomnimo.
rbolCobertorMnimo
Enestaseccinveremosdosalgoritmosparaencontrarunrbolcobertormnimoparaungrafonodirigido
dado,conexoyconcostosasociadosalosarcos.Elcostodeunrboleslasumadeloscostosdesusarcos.
AlgoritmodeKruskal
Esteesunalgoritmodeltipo"avaro"("greedy").Comienzainicialmenteconungrafoquecontieneslolos
nodosdelgrafooriginal,sinarcos.Luego,encadaiteracin,seagregaalgrafoelarcomsbaratoqueno
introduzcaunciclo.Elprocesoterminacuandoelgrafoestcompletamenteconectado.
Engeneral,laestrategia"avara"nogarantizaqueseencuentreunptimoglobal,porqueesunmtodo
"miope",queslooptimizalasdecisionesdecortoplazo.Porotraparte,amenudoestetipodemtodos
proveenbuenasheursticas,queseacercanalptimoglobal.
Enestecaso,afortunadamente,sepuededemostrarqueelmtodo"avaro"lograsiempreencontrarelptimo
global,porlocualunrbolcobertorencontradoporestavaestgarantizadoqueesunrbolcobertormnimo.
Unaformadeverestealgoritmoesdiciendoquealprincipiocadanodoconstituyesupropiacomponente
conexa,aisladodetodoslosdemsnodos.Duranteelprocesodeconstruccindelrbol,seagregaunarco
slosisusdosextremosseencuentranencomponentesconexasdistintas,yluegodeagregarloesasdos
componentesconexassefusionanenunasola.
Paralaoperatoriaconcomponentesconexassupondremosquecadacomponenteconexaseidentifica
medianteunrepresentantecannico(el"lider"delconjunto),yquesedisponedelassiguientesoperaciones:

Union(a,b):Sefusionanlascomponentescannicasrepresentadasporayb,respectivamente.
Find(x):Encuentraalrepresentantecannicodelacomponenteconexaalacualpertenecex.
Conestasoperaciones,elalgoritmodeKruskalsepuedeescribiras:
OrdenarlosarcosdeEenordencrecientedecosto;
C={{v}|vestenV};//Elconjuntodelascomponentesconexas
while(|C|>1)
{
Seae={v,w}elsiguientearcoenordendecostocreciente;
if(Find(v)!=Find(w))
{
Agregarealrbol;
Union(Find(v),Find(w));
}
}
Eltiempoquedemoraestealgoritmoestdominadoporloquedemoralaordenacindelosarcos.Si|V|=ny
|E|=m,eltiempoesO(mlogm)msloquedemorarealizarmoperacionesFindmsnoperacionesUnion.
EsposibleimplementarUnionFinddemodoquelasoperacionesUniondemorantiempoconstante,ylas
operacionesFinduntiempocasiconstante.Msprecisamente,elcostoamortizadodeunFindestacotado
porlog*n,dondelog*nesunafuncindefinidacomoelnmerodevecesqueesnecesariotomarel
logaritmodeunnmeroparaqueelresultadoseamenorque1.
Porlotanto,elcostototalesO(mlogm)o,loqueeslomismo,O(mlogn)(porqu?).
Ejemplo:

LacorrectituddelalgoritmodeKruskalvienedelsiguientelema:
Lema

SeaV'subconjuntopropiodeV,yseae={v,w}unarcodecostomnimotalquevestenV'ywestenV
V'.Entoncesexisteunrbolcobertormnimoqueincluyeae.
Estelemapermitemuchasestrategiasdistintasparaescogerlosarcosdelrbol.Veamosporejemplola
siguiente:
AlgoritmodePrim
Comenzamosconelarcomsbarato,ymarcamossusdosextremoscomo"alcanzables".Luego,acadapaso,
intentamosextendernuestroconjuntodenodosalcanzablesagregandoelarcomsbaratoquetengaunode
susextremosdentrodelconjuntoalcanzableyelotrofueradel.
Deestamanera,elconjuntoalcanzablesevaextendiendocomouna"manchadeaceite".
Seae={v,w}unarcodecostomnimoenE;
Agregarealrbol;
A={v,w};//conjuntoalcanzable
while(A!=V)
{
Encontrarelarcoe={v,w}msbaratoconvenAywenVA;
Agregarealrbol;
AgregarwalconjuntoalcanzableA;
}
Paraimplementarestealgoritmoeficientemente,podemosmantenerunatabladonde,paracadanododeVA,
almacenamoselcostodelarcomsbaratoqueloconectaalconjuntoA.Estoscostospuedencambiarencada
iteracin.
Siseorganizalatablacomounacoladeprioridad,eltiempototalesO(mlogn).Sisedejalatabla
desordenadaysebuscalinealmenteencadaiteracin,elcostoesO(n2).Estoltimoesmejorqueloanterior
sielgrafoesdenso.
DistanciasMnimasenunGrafoDirigido
Enesteproblemalosrtulosdelosarcosseinterpretancomodistancias.Ladistancia(olargo)deuncamino
eslasumadeloslargosdelosarcosquelocomponen.
Elproblemadeencontrarloscaminosmscortostienedosvariantes:
Caminosmscortosdesdeunnodo"origen"
Encontrarlosncaminosmscortosdesdeunnododadoshastatodoslosnodosdelgrafo.
Todosloscaminosmscortos
Encontrarlosn2caminosmscortosentretodoslosparesdenodos(origen,destino).Estosepuede
resolverresolviendonveceselproblemaanterior,cambiandocadavezdenodoorigen,peropuedeserms
eficienteencontrartodosloscaminosdeunasolavez.

AlgoritmodeDijkstraparaloscaminosmscortosdesdeunnodo"origen"
LaideadelalgoritmoesmantenerunconjuntoAdenodos"alcanzables"desdeelnodoorigeneirextendiendo
esteconjuntoencadaiteracin.
Losnodosalcanzablessonaquellosparaloscualesyasehaencontradosucaminoptimodesdeelnodo
origen.Paraesosnodossudistanciaptimaalorigenesconocida.InicialmenteA={s}.
ParalosnodosquenoestnenAsepuedeconocerelcaminoptimodesdesquepasaslopornodosdeA.
Estoes,caminosenquetodoslosnodosintermediossonnodosdeA.Llamemosaestosucaminoptimo
tentativo.
Encadaiteracin,elalgoritmoencuentraelnodoquenoestenAycuyocaminoptimotentativotienelargo
mnimo.EstenodoseagregaaAysucaminoptimotentativoseconvierteensucaminoptimo.Luegose
actualizanloscaminosptimostentativosparalosdemsnodos.
Elalgoritmoeselsiguiente:
A={s};
D[s]=0;
D[v]=cost(s,v)paratodovenVA;//infinitosielarconoexiste
while(A!=V)
{
EncontrarvenVAtalqueD[v]esmnimo;
AgregarvaA;
for(todowtalque(v,w)estenE)
D[w]=min(D[w],D[v]+cost(v,w));
}
Implementaciones:
UsandounacoladeprioridadparalatablaDeltiempoesO(mlogn).
UsandounarregloconbsquedasecuencialdelmnimoeltiempoesO(n2).
Ejemplo:

AlgoritmodeFloydparatodaslasdistanciasmscortas
Paraaplicarestealgoritmo,losnodossenumeranarbitrariamente1,2,...n.Alcomenzarlaiteracinksimase
suponequeunamatrizD[i,j]contieneladistanciamnimaentreiyjmedidaatravsdecaminosquepasen
slopornodosintermediosdenumeracin<k.
Estasdistanciassecomparanconlasqueseobtendransisepasaraunavezporelnodok,ysideesta
maneraseobtendrauncaminomscortoentoncesseprefiereestenuevocamino,delocontrarionos
quedamosconelnodoantiguo.

Alterminarestaiteracin,lasdistanciascalculadasahoraincluyenlaposibilidaddepasarpornodos
intermediosdenumeracin<=k,conlocualestamoslistosparairalaiteracinsiguiente.
Parainicializarlamatrizdedistancias,seutilizanlasdistanciasobtenidasatravsdeunarcodirectoentrelos
paresdenodos(oinfinitosinoexistetalarco).Ladistanciainicialentreunnodoysmismoescero.
for(1<=i,j<=n)
D[i,j]=cost(i,j);//infinitosinohayarcoentreiyj
for(1<=i<=n)
D[i,i]=0;
for(k=1,...,n)
for(1<=i,j<=n)
D[i,j]=min(D[i,j],D[i,k]+D[k,j]);
EltiempototalquedemoraestealgoritmoesO(n3).
AlgoritmodeWarshallparacerraduratransitiva
Dadalamatrizdeadyacenciadeungrafo(conD[i,j]=1sihayunarcoentreiyj,y0sino),resultatil
calcularlamatrizdeconectividad,enqueelcasillerorespectivocontieneun1siyslosiexisteuncamino(de
largo>=0)entreiyj.Estamatrizsellamatambinlacerraduratransitivadelamatrizoriginal.
Lamatrizdeconectividadsepuedeconstruirdelasiguientemanera:
1.PrimerocalcularlamatrizdedistanciasmnimasusandoFloyd.
2.Luegosustituircadavalorinfinitopor0ycadavalornoinfinitopor1.

Mejortodava,podramosmodificarelalgoritmodeFloydparaquevayacalculandoconcerosyunos
directamente,usandolascorrespondenciassiguientes:
min

infinito

<infinito

infinito

infinito

<infinito

<infinito

<infinito

<infinito

or

infinito

<infinito

infinito

infinito

infinito

<infinito

infinito

<infinito

and

ElresultadosedenominaAlgoritmodeWarshall:
for(1<=i,j<=n)
D[i,j]=adyacente(i,j);//1siexiste,0sino
for(1<=i<=n)
D[i,i]=1;
for(k=1,...,n)
for(1<=i,j<=n)
D[i,j]=D[i,j]or(D[i,k]andD[k,j]);

CC3001AlgoritmosyEstructurasdeDatos:Bsquedaen
texto
Labsquedadepatronesenuntextoesunproblemamuyimportanteenlaprctica.Susaplicacionesen
computacinsonvariadas,comoporejemplolabsquedadeunapalabraenunarchivodetextooproblemas
relacionadosconbiologacomputacional,endondeserequierebuscarpatronesdentrodeunasecuenciade
ADN,lacualpuedesermodeladacomounasecuenciadecaracteres(elproblemaesmscomplejoquelo
descrito,puestoqueserequierebuscarpatronesendondeocurrenalteracionesconciertaprobabilidad,esto
es,labsquedanoesexacta).
Enestecaptuloseconsiderarelproblemadebuscarlaocurrenciadeunpatrndentrodeuntexto.Se
utilizarnlassiguientesconvenciones:
ndenotarellargodeltextoendondesebuscarelpatrn,esdecir,texto=a1a2...an.
mdenotarellargodelpatrnabuscar,esdecir,patrn=b1b2...bm.
Porejemplo:

Algoritmodefuerzabruta
Sealinealaprimeraposicindelpatrnconlaprimeraposicindeltexto,ysecomparanloscaracteresunoa
unohastaqueseacabeelpatrn,estoes,seencontrunaocurrenciadelpatrneneltexto,ohastaquese
encuentreunadiscrepancia.

Sisedetienelabsquedaporunadiscrepancia,sedeslizaelpatrnenunaposicinhacialaderechayse
intentacalzarelpatrnnuevamente.

Enelpeorcasoestealgoritmorealiza

comparacionesdecaracteres.

AlgoritmoKnuthMorrisPratt(KMP)
Supongaqueseestcomparandoelpatrnyeltextoenunaposicindada,cuandoseencuentrauna
discrepancia.

SeaXlapartedelpatrnquecalzaconeltexto,eYlacorrespondientepartedeltexto,ysupongaqueellargo
deXesj.Elalgoritmodefuerzabrutamueveelpatrnunaposicinhacialaderecha,sinembargo,estopuede
onopuedeserlocorrectoenelsentidoquelosprimerosj1caracteresdeXpuedenonopuedencalzarlos
ltimosj1caracteresdeY.
LaobservacinclavequerealizaelalgoritmoKnuthMorrisPratt(enadelanteKMP)esqueXesigualaY,por
loquelapreguntaplanteadaenelprrafoanteriorpuedeserrespondidamirandosolamenteelpatrnde
bsqueda,locualpermiteprecalcularlarespuestayalmacenarlaenunatabla.
Porlotanto,sideslizarelpatrnenunaposicinnofunciona,sepuedeintentardeslizarloen2,3,...,hastaj
posiciones.
Sedefinelafuncindefracaso(failurefunction)delpatrncomo:

Intuitivamente,f(j)esellargodelmayorprefijodeXqueademsessufijodeX.Notequej=1esuncaso
especial,puestoquesihayunadiscrepanciaenb1elpatrnsedeslizaenunaposicin.
Sisedetectaunadiscrepanciaentreelpatrnyeltextocuandosetratadecalzarbj+1,sedeslizaelpatrnde
maneraquebf(j)seencuentredondebjseencontraba,yseintentacalzarnuevamente.

Suponiendoquesetienef(j)precalculado,laimplementacindelalgoritmoKMPeslasiguiente:
//n=largodeltexto
//m=largodelpatron
//Losindicescomienzandesde1
intk=0;
intj=0;
while(k<n&&j<m)
{
while(j>0&&texto[k+1]!=patron[j+1])
{
j=f[j];
}
if(texto[k+1])==patron[j+1]))
{
j++;
}
k++;
}
//j==m=>calce,jelpatronestabaeneltexto
Ejemplo:

Eltiempodeejecucindeestealgoritmonoesdifcildeanalizar,peroesnecesariosercuidadosoalhacerlo.
Dadoquesetienendosciclosanidados,sepuedeacotareltiempodeejecucinporelnmerodevecesque
seejecutaelcicloexterno(menoroigualan)porelnmerodevecesqueseejecutaelciclointerno(menoro
igualam),porloquelacotaesiguala

,queesigualaloquedemoraelalgoritmodefuerzabruta!.
Elanlisisdescritoespesimista.Notequeelnmerototaldevecesqueelciclointerioresejecutadoesmenor
oigualalnmerodevecesquesepuededecrementarj,dadoquef(j)<j.Perojcomienzadesdeceroyes
siempremayoroigualquecero,porloquedichonmeroesmenoroigualalnmerodevecesquejes
incrementado,elcualesmenorquen.Porlotanto,eltiempototaldeejecucines

.Porotraparte,knuncaesdecrementado,loqueimplicaqueelalgoritmonuncasedevuelveeneltexto.
Quedaporresolverelproblemadedefinirlafuncindefracaso,f(j).Estosepuederealizarinductivamente.
Paraempezar,f(1)=0pordefinicin.Paracalcularf(j+1)supongaqueyasetienenalmacenadoslosvaloresde
f(1),f(2),...,f(j).Sedeseaencontraruni+1talqueel(i+1)simocarcterdelpatrnseaigualal(j+1)simo
carcterdelpatrn.

Paraestosedebecumplirquei=f(j).Sibi+1=bj+1,entoncesf(j+1)=i+1.Encasocontrario,sereemplazaiporf(i)
yseverificanuevamentelacondicin.
Elalgoritmoresultanteeselsiguiente(notequeessimilaralalgoritmoKMP):
//meslargodelpatron
//losindicescomienzandesde1
int[]f=newint[m];
f[1]=0;
intj=1;
inti;
while(j<m)
{
i=f[j];
while(i>0&&patron[i+1]!=patron[j+1])
{
i=f[i];
}

if(patron[i+1]==patron[j+1])
{
f[j+1]=i+1;
}
else
{
f[j+1]=0;
}
j++;
}
Eltiempodeejecucinparacalcularlafuncindefracasopuedeseracotadoporlosincrementosy
decrementosdelavariablei,quees

.
Porlotanto,eltiempototaldeejecucindelalgoritmo,incluyendoelpreprocesamientodelpatrn,es

AlgoritmoBoyerMoore
Hastaelmomento,losalgoritmosdebsquedaentextosiemprecomparanelpatrnconeltextodeizquierda
aderecha.Sinembargo,supongaquelacomparacinahoraserealizadederechaaizquierda:sihayuna
discrepanciaenelltimocarcterdelpatrnyelcarcterdeltextonoapareceentodoelpatrn,entoncesste
sepuededeslizarmposicionessinrealizarningunacomparacinextra.Enparticular,nofuenecesario
compararlosprimerosm1caracteresdeltexto,locualindicaquepodrarealizarseunabsquedaeneltexto
conmenosdencomparacionessinembargo,sielcarcterdiscrepantedeltextoseencuentradentrodel
patrn,stepodradesplazarseenunnmeromenordeespacios.
ElmtododescritoeslabasedelalgoritmoBoyerMoore,delcualseestudiarndosvariantes:Horspooly
Sunday.

BoyerMooreHorspool(BMH)
ElalgoritmoBMHcomparaelpatrnconeltextodederechaaizquierda,ysedetienecuandoseencuentra
unadiscrepanciaconeltexto.Cuandoestosucede,sedeslizaelpatrndemaneraquelaletradeltextoque
estabaalineadaconbm,denominadac,ahorasealinieconalgnbj,conj<m,sidichocalceesposible,ocon
b0,uncarcterficticioalaizquierdadeb1,encasocontrario(esteeselmejorcasodelalgoritmo).
Paradeterminareldesplazamientodelpatrnsedefinelafuncinsiguientecomo:
0sicnopertenecealosprimerosm1caracteresdelpatrn(Porqunoseconsideraelcarcterbm?).

jsicpertenecealpatrn,dondej<mcorrespondealmayorndicetalquebj==c.
Estafuncinslodependedelpatrnysepuedeprecalcularantesderealizarlabsqueda.
Elalgoritmodebsquedaeselsiguiente:
//mesellargodelpatron
//losindicescomienzandesde1
intk=m;
intj=m;
while(k<=n&&j>=1)
{
if(texto[k(mj)]==patron[j])
{
j;
}
else
{
k=k+(msiguiente(a[k]));
j=m;
}
}
//j==0=>calce!,j>=0=>nohubocalce.
EjemplodeusodelalgoritmoBMH:

SepuededemostrarqueeltiempopromedioquetomaelalgoritmoBMHes:

dondeceseltamaodelalfabeto(c<<n).Paraunalfabetorazonablementegrande,elalgoritmoes

.
Enelpeorcaso,BMHtieneelmismotiempodeejecucinqueelalgoritmodefuerzabruta.

BoyerMooreSunday(BMS)
ElalgoritmoBMHdeslizaelpatrnbasadoenelsmbolodeltextoquecorrespondealaposicindelltimo
carcterdelpatrn.Estesiempresedeslizaalmenosunaposicinsiseencuentraunadiscrepanciaconel
texto.
Esfcilverquesiseutilizaelcarcterunaposicinmsadelanteeneltextocomoentradadelafuncin
siguienteelalgoritmotambinfunciona,peroenestecasoesnecesarioconsiderarelpatrncompletoal
momentodecalcularlosvaloresdelafuncinsiguiente.EstavariantedelalgoritmoesconocidacomoBoyer
MooreSunday(BMS).
Esposiblegeneralizarelargumento,esdecir,sepuedenutilizarcaracteresmsadelanteeneltextocomo
entradadelafuncinsiguiente?Larespuestaesno,dadoqueenesecasopuedeocurrirquesesalteuncalce
eneltexto.

CC3001AlgoritmosyEstructurasdeDatos:Algoritmos
probabilsticos
AlgoritmosProbabilsticos
Enmuchoscasos,alintroducireleccionesaleatoriasenunalgoritmosepuedenobtenermejoresrendimientos
quealaplicarelalgoritmodeterminsticopuro.
UnalgoritmotipoMontecarloasegurauntiempofijodeejecucin,peronoestgarantizadoquelarespuesta
seacorrecta,aunquelopuedeserconaltaprobabilidad.
UnalgoritmotipoLasVegassiempreentregalarespuestacorrecta,peronogarantizaeltiempototalde
ejecucin,aunqueconaltaprobabilidadsteserbajo.
Ejemplo:algoritmotipoMontecarloparaverificarlamultiplicacindedosmatrices.
SeanA,B,CmatricesdeNxN.Sedeseachequearsi

.Determinsticamente,estotomatiempoO(n3)usandoelalgoritmoestndar.
Probabilsticamente,sepuedechequearsi

entiempoO(n2)conbajaprobabilidaddeerror.Elalgoritmoeselsiguiente:
for(i=1;i<=k;i++)
{
GenerarunvectoraleatoriodeNx1conentradasen{1,1};
if(A*(Bx)!=Cx)
returnfalse;//A*B!=C
}
returntrue;//A*B=Cconaltaprobabilidad
Lacomplejidaddeestealgoritmoes

.Acontinuacinsemuestraqueparaestealgoritmo:

Sea

.Si

paraalgni,j,entonces

,dondex'eselvectordondesecambiaxjporxj.Porlotanto,encadaiteracindelalgoritmosetieneque

,ydadoqueserealizankiteracionessetieneque

.
Ejemplo:algoritmotipoLasVegasparacolorearconjuntos.
SeankconjuntosC1,...,Ckconrelementoscadauno(nodisjuntos),y

.Sepidecolorearloselementosdecolorrojooazul,talqueningnCiseahomogeneo.
Algoritmo:
while(true)
{
Colorearloselementosaleatoriamente;
if(ningnCieshomogeneo)
break;
}
Cuntasvecesesnecesariorepetirelcicloparaobtenerunarespuesta?
Pr(Cihomogeneo)=Pr(todosloselementosdeCirojos)+Pr(todosloselementosdeCiazules)=1/2r+1/2r=
1/2r1
=>Pr(algnCihomogeneo)=k/2r1<=1/2(yaquek<=2r2).
Estoimplicaqueenpromedioelcicloseejecuta2veces=>O(k*r).

CC3001AlgoritmosyEstructurasdeDatos:Compresinde
datos
Compresindedatos
Enestaseccinveremoslaaplicacindelateoraderbolesalacompresindedatos.Porcompresinde
datosentendemoscualquieralgoritmoquerecibaunacadenadedatosdeentradayqueseacapazdegenerar
unacadenadedatosdesalidacuyarepresentacinocupamenosespaciodealmacenamiento,yquepermite
medianteunalgoritmodedescompresinrecuperartotaloparcialmenteelmensajerecibidoinicialmente.A
nosotrosnosinteresaparticularmentelosalgoritmosdecompresinsinprdida,esdecir,aquellosalgoritmos
quepermitenrecuperarcompletamentelacadenadedatosinicial.

Codificacindemensajes
Supongamosqueestamoscodificandomensajesenbinarioconunalfabetodetamao

.Paraestosenecesitan

bitsporsmbolo,sitodosloscdigossondelamismalongitud.
Ejemplo:paraelalfabetoA,

,Zde26letrassenecesitancdigosde

bits
Problema:Esposibledisminuirelnmeropromediodebitsporsmbolo?
Solucin:Asignarcdigosmscortosalossmbolosmsfrecuentes.
Unejemploclarodeaplicacindeesteprincipioeselcdigomorse:

...

..

Sepuederepresentarmedianteunarbolbinario:

Podemosverenelrbolqueletrasdemayorprobabilidaddeaparicin(enidiomaingls)estnmscercade
laraz,yporlotantotienenunacodificacinmscortaqueletrasdebajafrecuencia.
Problema:estecdigonoesautodelimitante
Porejemplo,SOSyIAMStienenlamismacodificacin
Paraeliminarestasambigedades,enmorseseusauntercerdelimitador(espacio)parasepararelcdigode
cadaletra.Sedebetenerencuentaqueesteproblemaseproduceslocuandoelcdigoesdelargovariable
(comoenmorse),puesenotroscdigosdelargofijo(porejemploelcdigoASCII,dondecadacaracterse
representapor8bits)esdirectodeterminarcualeselementoscomponencadacaracter.
Lacondicinquedebecumplirunacodificacinparanopresentarambigedades,esquelacodificacinde
ninguncaracterseaprefijodeotra.Estonosllevaadefinirrbolesqueslotieneninformacinenlashojas,
comoporejemplo:

Comonuestroobjetivoesobtenerlasecuenciacodificadamscortaposible,entoncestenemosqueencontrar
lacodificacinqueenpromediouseelmenorlargopromediodelcdigodecadaletra.
Problema:Dadounalfabeto

talquelaprobabilidaddequelaletra

aparezcaenunmensajees

,encontraruncdigolibredeprefijosqueminimiceellargopromediodelcdigodeunaletra.
Supongamosquealaletra

seleasignaunacodificacindelargo

,entoncesellargoesperadoes:

esdecir,elpromedioponderadodetodaslasletrasporsuprobabilidaddeaparicin.
Ejemplo:

probabilidad

0.30

cdigo
00

0.25

10

0.08

0110

0.20

11

0.05

0111

0.12

010

EntropadeShannon
Shannondefinelaentropadelalfabetocomo:

ElteoremadeShannondicequeelnmeropromediodebitsesperableparaunconjuntodeletrasy
probabilidadesdadasseaproximaalaentropadelalfabeto.Podemoscomprobarestoennuestroejemplo
anteriordondelaentropiadeShannones:

queesbastantecercanoalcostoesperadode2.38quecalculamosanteriormente.
Acontinuacindescribiremosalgoritmosquenospermitanencontrarrepresentacionesqueminimicenelcosto
total.

AlgoritmodeHuffman
ElalgoritmodeHuffmanpermiteconstruiruncdigolibredeprefijosdecostoesperadomnimo.
Inicialmente,comenzamoscon

hojasdesconectadas,cadaunarotuladaconunaletradelalfabetoyconunaprobabilidad(ponderaciono
peso).
Consideremosesteconjuntodehojascomounbosque.Elalgoritmoes:

while(nroderbolesdelbosque>1){
Encontrarlos2rbolesdepesomnimoy
unirlosconunanuevarazquesecreaparaesto.
Arbitrariamente,rotulamoslasdos
lneascomo0y1
Darlealanuevarazunpesoquees
lasumadelospesosdesussubrboles.
}
Ejemplo:
Sitenemosquelasprobabilidadesdelasletrasenunmensajeson:

EntonceslaconstruccindelrboldeHuffmanes(losnmerosennegritaindicanlosrbolesconmenorpeso):

Sepuedeverqueelcostoesperadoesde2,53bitsporletra,mientrasqueunacodificacindelargofijo(igual
nmerodebitsparacadasmbolo)entregauncostode3bits/letra.
ElalgoritmodecodificacindeHuffmansebasaendossupuestosquelerestaneficiencia:
1.suponequeloscaracteressongeneradosporunafuentealeatoriaindependiente,loqueenlaprcticano
escierto.Porejemplo,laprobabilidaddeencontrarunavocaldespusdeunaconsonanteesmuchomayor
queladeencontrarladespusdeunavocaldespusdeunaqesmuyprobableencontrarunau,etc
2.Debidoaquelacodificacinsehacecaracteracaracter,sepierdeeficienciaalnoconsiderarlassecuencias
decaracteresmsprobablesqueotras.

LempelZiv
Unacodificacinquetomaencuentalosproblemasdelossupuestosenunciadosanteriormenteparala
codificacindeHuffmanseraunadondenosoloseconsiderarancaracteresunoauno,sinoquedonde
ademsseconsideraranaquellassecuenciasdealtaprobabilidadeneltexto.Porejemplo,eneltexto:
aaabbaabaa
Obtendramosunmayorgradodeeficienciasiademsdeconsiderarcaracterescomoayb,tambin
considersemoslasecuenciaaaalmomentodecodificar.
UnageneralizacindeestaideaeselalgoritmodeLempelZiv.Estealgoritmoconsisteensepararlasecuencia
decaracteresdeentradaenbloquesosecuenciasdecaracteresdedistintoslargos,manteniendouna
diccionariodebloquesyavistos.AplicandoelalgoritmodeHuffmanparaestosbloquesysusprobabilidades,
sepuedesacarprovechodelassecuenciasqueserepitanconmsprobabilidadeneltexto.Elalgoritmode
codificacineselsiguiente:
1.Inicializareldiccionariocontodos
losbloquesdelargo1
2.Seleccionarelprefijomslargodel
mensajequecalceconalgunasecuenciaW
deldiccionarioyeliminarWdelmensaje
3.CodificarWconsundiceeneldiccionario
4.AgregarWseguidodelprimersmbolodel
prximobloquealdiccionario.
5.Repetirdesdeelpaso2.
Ejemplo:
Sielmensajees

lacodificacinylosbloquesagregadosaldiccionarioseran(dondelosbloquesreconocidossonmostrados
entreparntesisylasecuenciaagregadaaldiccionarioencadaetapaesmostradacomounsubndice):

Tericamente,eldiccionariopuedecrecerindefinidamente,peroenlaprcticaseoptaportenerundiccionario
detamaolimitado.Cuandosellegaallmitedeldiccionario,noseagreganmsbloques.
LempelZivesunadelasalternativasaHuffman.Existenvariasotrasderivadasdeestasdosprimeras,como
LZW(LempelZivWelch),queesusadoenprogramasdecompresincomoelcompressdeUNIX.

También podría gustarte