53
Programación inicial
Estructuras de datos y algoritmos
Introducción al curso
Objetivos
•Presentaryanalizar lasestructurasdedatosyalgoritmosqueforman labasepara laresolucióndeproblemasencomputación.•Diseñarmateriales,enparticularprácticos,sobre los temasdelcurso,convistasasu
incorporaciónencursosdeltecnólogo(PPyEDA).•Aprenderadiseñarproyectosobligatoriosqueenglobenlosconceptosfundamentales
delcursoyquepermitanexperimentareneldiseñodesistemaseficientesdeportemediano.
El curso
Lafinalidaddelcursoespresentaralgunasdelasestructurasdedatosbásicasdelapro-gramación,losmétodosfundamentalesdeorganizacióndegrandescantidadesdedatos,losconceptosdeabstraccióndeinstruccionesydedatos(tiposabstractosdedatos),eintroducealanálisisdealgoritmos:laestimaciónycálculodeltiempodeejecucióndelosalgoritmosyelanálisisdelaeficienciaenespaciodealmacenamiento.Elcursohaceespecialénfasisenelroldelaabstraccióndedatoseneldiseño,desarrollo,
ylaaplicacióndelasestructurasdedatos.
Tópicos
Introducción
•NocionesGenerales.•Abstracciónenprogramación:particiones refinamientos.Abstracción“procedural”e
introducciónalaabstraccióndedatos.Compilaciónseparadademódulos.
Análisis de Algoritmos
• Introducciónalanálisisdealgoritmos.Eficienciaenespaciodealmacenamientoytiem-podeejecución.Tiempodeejecución.Ordendelpeorcasoycasopromedio.Propiedades.Cálculodetiempodeejecuciónparaprogramasiterativoseintroducciónalcálculodetiempodeejecuciónparaprogramasrecursivos.
Inducción y Recursión
•Recursión en un sistema computacional: el stack de ejecuciones.Definicióndetiposdedatosinductivos.Teoremasdeinducciónasociados.Pruebadepro-piedades.
54
Prog
ram
ació
n in
icia
l
•Programaciónrecursiva:tiposyaplicaciones.Programaciónrecursivaconprecondicio-nes.EstructurasDinámicas.•Estructurasestáticasyestructurasdinámicas.Punteroymanejodememoriadinámi-
ca.Definiciónde listasdememoriadinámica.Algoritmos sobre listas.Definición dees-tructurasarborescentesdememoriadinámica.Algoritmossobreestructurasarborescentes.
Introducción a Tipos Abstractos de Datos (TADs)
•Abstracciónproceduralyabstraccióndedatos.•Especificación de TADs: uso de pre y post condiciones.
ImplementacióndeTADs.UsodeTADs.AnálisisdelasventajasdelaprogramaciónconTADs.•TADsFundamentales.•EspecificacióneimplementacionesdeTADsfundamentales.Porejemplo:Listas,Pilas,
Colas,Arboles,ConjuntosyDiccionarios.Variantes.Aplicaciones.
Material del curso
•Guías de cada tema•Libros (básicos)
•DatastructuresandAlgorithmanalysisinC.MarkAllenWeiss•EstructurasdeDatosyAlgoritmos.MarkAllenWeiss•EstructurasdeDatosyAlgoritmos.A.Aho,J.E.Hopcroft&J.D.Ullman•CómoProgramarenC/C++.H.M.Deitel&P.J.Deitel•Olaversión2:CómoprogramarenC++.
Tema 1:
IntroducciónProgramas de computadora y Lenguajes de programación
Programa de Computadora
Computadora-Tecnológica,concreta
Compromisovigencia/practicidad
Programa-General,abstractaPrioridad Visión
55
Programación inicial
Perspectiva abstracta
•La noción de programa:•Difícildedefinir.• Intento:DescripcióndeAcción/Actividad(quehacelaactividadreproducibledema-
neramecánica).
“Subjetividad” de la noción intuitiva de programa
•Dadaunadescripción(texto)hay,engeneral,quienlaentiendecomoprogramayquienno,dadoquequienlaentiendacomoprogramapuedeseronocapazdeejecutarla.
Ejemplos:
•Revisarlasbujías.Siestánbienentonces...•Ordenarunasecuenciadearchivos.• ...
Entodocaso,calificar:“programaparax”(alguienoalgo)capazdeejecutarlo.
•Problema:Acordarunanoción(más)objetivadeprograma.•Acordarreglasparaescribirprogramas.
Reglas
•Notación,sintaxis,• significado(quéaccionessonrepresentadas),semántica.LenguajedeProgramación.•Conjuntoconcretodeprogramas.•Decidibilidad:debesertrivial/mecánicoverificarlasreglasdenotación.•Modelodeprogramas.Teoría(Maneradeentenderelconcepto).•Estointroduceel“problema”delformalismo.•Loslógicos(matemáticos)enladécadadel‘30buscaron“modelosuniversales”depro-
gramas.
Autómatas/Máquinas con Estados
•Encadamomento,lamáquinaestáenunciertoestado.•Elconjuntodeestadosseespecificaprecisamente.•Hayunconjuntodeacciones(transiciones)quesonlasformasdeoperarlamáquina.
Lastransicionescambianelestadodelamáquina.
56
Prog
ram
ació
n in
icia
l
Ejemplos:Cisterna,máximodedosnaturales,ordenacióndeunarchivo.•Efectodelprograma-consisteenelcambiodeestadoComputaciónporcambiode
estado.•Algunodelosestadosposibles(p.ej:el“final”)contieneinformacióninteresante.
Máquinas de Estado programables
•Losejemplosvistossonprogramasindividuales.¿CómoseríaunamáquinaprogramablecapazdeejecutarCUALQUIERPROGRAMA?•NociónuniversaldePrograma(Programaparalamáquinauniversal).•Idea:•Programa+indicadordehastadóndesehaejecutado.•Estoformapartedelestado(estánalmacenadosenlamáquina).
Esquema:Componentes: Memoria
•Listadecasillasidentificadas.•Cadacasillapuedecontenerunsímbolodeunalistadada.•Lascasillasseusanparaalmacenar:InstruccionesyDatos•Puntodecontrol-“instruction/programcounter”.Señalaallugardememoriadondeseencuentralasiguienteinstrucciónaejecutar.
Instrucciones:
•Hayunconjuntodeinstruccionesprecisamenteespecificado.•Engeneral,cadainstrucciónmodificaelestadodelamáquina.
Máquina de Turing•1936-Modelode“procedimientocomputable”.¿Esdecidiblemecánicamentesiunenunciadomatemáticoesverdaderoofalso?
Computadora Electrónica•RealizacióndelmodelodeTuring(~1945).•Lasceldaspuedencontenersólo0o1(Bits).• Instruccionesydatoscodificadosensecuenciasdebits(códigobinario).•LanociónabstractadePROGRAMAantecedióalascomputadoraselectrónicas.(Másaún:constituyólabasedesudiseño).•Resultadosinesperadosdeinvestigacionesaltamenteteóricas.
Abstracción
Queremoslosprogramasdecomputadorapararesolverproblemas.Enelenunciadodelosproblemassemanejanconceptos“abstractos”.
57
Programación inicial
Ej:númeroentero,matrizdereales,cliente.Construirprogramaspararesolverproblemasdadosinvolucrarepresentarconceptosabs-
tractosentérminosdellenguajedeprogramación.ComplejidaddelaProgramacióninherentealosproblemas-procesodeconstrucciónde
losprogramas.
Metodologías de Programación
Engeneral:•Partición.•Refinamiento.Sinónimodeproblema:ESPECIFICACION.Elproblemaespecificaquédebesatisfacerelprogramabuscado,elconjuntodeprogra-
masaceptables.
Partición•Descomponerlaespecificacióninicialensubproblemas.Verificarquelaestructuraobtenidaresuelveelproblema,asumiendoqueloscomponen-
tesestánresueltoscorrectamente.
RefinamientoProcederdelamismaformaconloscomponentesaúnnoimplementados.Elprocesosiguerefinandoconceptos“abstractos”hastaalcanzarelniveldellenguajede
máquina.Ciertasclasesdeestosrefinamientospuedenrealizarseautomáticamente.Entonces,esposibledefinirlenguajesdeprogramaciónmásabstractos.Lenguajesdealtonivel(deabstracción)dondesonprimitivosciertosconceptosabstrac-
tos.Hayunprograma(compilador)queproducerepresentacionesdeesosconceptos.
Lenguajes de programación
Ejemplo:programaqueleecoordenadasdevérticesdeuntriánguloycalculaeláreadeéste.Podemosexpresarloenunlenguajede“altonivel”comoC/C++delasiguienteforma:
<importaciones><declaraciones>main()//AreaTriang.<declaraciones>{<instrucciones>}//AreaTriang.
58
Prog
ram
ació
n in
icia
l
Ejemplo: Área del Triángulo
Podemoscomenzarintroduciendoeltipodedatosquerepresentaráelconceptodepunto(encoordenadascartesianas):<declaraciones>structPunto{floatx;floaty;};–<···>•yluegolasvariablesdelprograma:•<declaraciones...>Puntop1,p2,p3;–<···>
Luegorefinamoslapartedeinstrucciones:
<instrucciones><Leer(p1,p2,p3)>;<Desplegar(AreaTri(p1,p2,p3))>;–<···>•Dondeestamoshaciendousode“instruccionesabstractas”.•Abstractasporquenoestán(todavía)dadasalnivelconcretodedetalledellenguajede
programación.Peropodemosespecificarsuefectoconprecisión.
•Otraformadedecirlomismo:soninstrucciones(sepuedeespecificarsuefecto),peronosoninstruccionesconcretasdellenguaje.•Elproblemaoriginal(construirunprograma)seresuelvepormediodeunaestructura
cuyoscomponentessonobieninstruccionesconcretasobienotrosprogramasaserrefina-dosseparadamente.
El método permite acotar el nivel de detalle a ser considerado cada vez.
•Otraformadedecirlomismo:seusanabstraccionesparaparticionarelproblemadado.Luegoserefinanlasabstraccionessiguiendoelmismométodo.•EnelejemplointroducimosunafunciónAreaTriquehayquerefinar:
•–<declaraciones...>•floatAreaTri(Puntop1,Puntop2,Puntop3)•{<declaracionesAreaTri...>•<Calcularbase=distancia(p1,p2)>;•<Calcularaltura=distanciap3ap1p2>;• returnbase*altura/2.0;•};//endAreaTri.
Abstracción Procedural
•Elusodeinstruccionesabstractassellama:•ABSTRACCIÓNdePROCEDIMIENTO.
59
Programación inicial
•SUBPROGRAMAS.•PROCEDIMENTAL.• (Inglés:PROCEDURALABSTRACTION)yeslaformamáselementaldeabstracción.
•Algunasinstruccionesabstractasserefinanensubprogramas(procedimientos,funcio-nes)enC/C++.•Otras,simplementeeninstruccionesquesustituyentextualmentealainstrucciónabs-
tracta.
Abstracción de Datos
MásadelanteveremosenestecursocómoextenderlaideadeabstracciónalosTIPOSdeDATOS.Esdecir,usarTIPOSABSTRACTOSdeDATOS,ademásde instruccionesabstractas,
paradiseñarprogramas(enparticularsistemasdeportemediano,talescomounmanejadordebasededatosounadministradordelfilesystemdeunsistemaoperativo).
Jerarquía de Lenguajes
•Ciertosconceptosdeprogramaciónquepuedenimplementarseenformaautomática.•Lajerarquíaespotencialmenteinfinita.•Enlarealidad,unaespeciedecaos.
Lenguaje L
Lenguaje L
Metodología
Compilación
•Elprincipiodelacompilaciónseparada:•Amenudo,losprogramasusancomponentesquesonconstruídosenformatotalmente
independiente.Ej:funcionesdebiblioteca.•Sicambiamoslaimplementacióndeunafuncióndebiblioteca,noqueremostenerque
recompilartodoslosprogramasqueusanesafunción.•Elprogramay(ciertos)componentesauxiliaressoncompilablesseparadamente.
programa
compilación vinculación
errores objetoejecutable
erroresdesintaxis
códigointermedio
Biblioteca
60
Prog
ram
ació
n in
icia
l
Tiempo de Ejecución
Análisis de Algoritmos: Introducción
• ¿Quéalgoritmoselegirpararesolverunproblema?Queseanfácilesdeentender,codificarydepurar.Queuseneficientementelosrecursosdelsistema:queusenpocamemoriayqueseejecu-
tenconlamayorrapidezposible.•Ambosfactoresengeneralsecontraponen…•Nosconcentraremosahoraenelsegundofactoryenparticular,enelanálisisdeltiempo
deejecución..
Tiempo de ejecución de un programa
Factoresqueintervienen:•Losdatosdeentradaalprograma.•Lacalidaddelcódigogeneradoporelcompilador.•Lanaturalezayrapidezdelasinstruccionesdemáq.•Lacomplejidaddetiempodelalgoritmobase.Eltiempodeejecucióndeunprogramadependedelaentraday,engeneral,deltamaño
delamisma.
T(n)
•T(n)=tiempodeejecucióndeunprogramaconunaentradadetamañon.=númerodeinstruccionesejecutadasenuncomputadoridealizadoconunaentradade
tamañon.•Paraelproblemadeordenarunasecuenciadeelementos,nseríalacantidaddeelemen-
tos.Ejemplo:T(n)=c.n2,dondecesunaconstante.•Tpeor(n)=tiempodeejecuciónparaelpeorcasoTprom(n)=tiempodeejecucióndel
casopromedio.NoscentraremosenTpeor(n)ylollamaremossimplementeT(n).
Velocidad de crecimiento - O(n)
T(n)esO(f(n))“ordenf(n)”siexistenconstantespositivascyn0talesqueT(n)c.f(n)cuandonn0.f(n)esunacotasuperiorparalavelocidad(taza)decrecimientodeunprogramacontiem-
podeejecuciónT(n).Ejemplo:T(n)=3n3+2n2esO(n3)•Seann0=0yc=5,3n3+2n25n3,paran0•TambiénT(n)esO(n4),peroseríaunaaseveraciónmásdébilquedecirqueesO(n3)
< _ < _
< _ < _
61
Programación inicial
Velocidad de crecimiento - (n)
T(n)es(g(n))siexistenconstantespositivascyn0talesqueT(n)c.g(n)cuandonn0.g(n)esunacotainferiorparalavelocidad(taza)decrecimientodeunprogramacontiempodeejecuciónT(n).•Ejemplo:–T(n)=3n3+2n2es(n3).•Tomemosn0=0yc=1,3n3+2n2n3,paran0.•TambiénT(n)es(n2),peroseríaunaaseveraciónmásdébilquedecirquees(n3).
Evaluación de programas
•UnprogramacontiempodeejecuciónO(n2)esmejorqueunoconO(n3)pararesolverunmismoproblema.•SupongamosdosprogramasP1yP2conT1(n)=100n2yT2(n)=5n3.¿Cuálprogramaespreferible?Sin<20,P2esmásrápidoqueP1.(paraentradas“pequeñas”esmejorP2.)Sin>20,P1esmásrápidoqueP2.(paraentradas“grandes”esmejorP1.)
•Lavelocidaddecrecimientodeunprogramadeterminaeltamañodelosproblemasquesepuedenresolverenuncomputador.•Sibienlascomputadorassoncadavezmásveloces,tambiénaumentanlosdeseosde
resolverproblemasmásgrandes.•Salvo que los programas tengan una velocidad de crecimiento baja, ej:O(n) uO(n.
log(n)),unincrementoenlarapidezdelcomputadornoinfluyesignificativamenteenelta-mañodelosproblemasquepuedenresolverseenunacantidadfijadetiempo.
Tiempos de ejecución de cuatro programas
Aunquelavelocidaddeuncomputadoraumente1000%,unalgoritmoineficientenoper-mitiráresolverproblemasmuchomásgrandes.Laideaes,entonces,desarrollaralgoritmoseficientes.
< _ < _
< _ < _
62
Prog
ram
ació
n in
icia
l
Algunas velocidades de crecimiento típicas
Cálculo del tiempo de ejecución
RegladelaSuma:
SiT1(n)esO(f1(n))yT2(n)esO(f2(n)),entoncesT1(n)+T2(n)esO(max(f1(n),f2(n))).Puedeusarseparacalculareltiempodeejecucióndeunasecuenciadepasosdeprograma.
Ejemplo:supongamostresprocesossecuencialescontiemposdeejecuciónO(n2),O(n3)yO(n.log(n)).EltiempodeejecucióndelacomposiciónesO(n3).
Sipara todon n0 (n0cte) f1(n) f2(n), entoncesO(f1(n)+f2(n))es lomismoqueO(f1(n)).Ejemplo:O(n2+n)eslomismoqueO(n2).
• Regla del Producto:
SiT1(n)esO(f1(n))yT2(n)esO(f2(n)),entoncesT1(n).T2(n)esO(f1(n).f2(n)).O(c.f(n))eslomismoqueO(f(n))(cesunactepostiva).Ejemplo:O(n2/2)eslomismoqueO(n2).
Cálculo de T(n) - Algunas reglas
•Paraunaasignación(lectura/escritura)es,engeneral,O(1)(tiempoconstante).•Paraunasecuenciadepasossedeterminaporlaregladelasuma(dentrodeunfactor
cte,el“máximo”).•Paraun“if (Cond)Sent”eseltiempoparaSentmáseltiempoparaevaluarCond(este
último,engeneral,O(1)paracondicionessimples).•Paraun“if (Cond)Sent1elseSent2”eseltiempoparaevaluarCondmáselmáximo
entrelostiemposparaSent1ySent2.•Parauncicloeslasuma,sobretodaslasiteracionesdelciclo,deltiempodeejecucióndel
cuerpoydelempleadoparaevaluarlacondicióndeterminación(esteúltimosueleserO(1)).Amenudoestetiempoes,despreciandofactoresconstantes,elproductodelnúmerode
iteracionesdelcicloyelmayortiempoposibleparaunaejecucióndelcuerpo.
< _ < _
63
Programación inicial
Secalculaeltiempodeejecucióndelprocedimientoquenodependedeotro:P3.LuegoeldeP2yentonceseldeP1.
Cálculo de T(n) - Ejemplos
Escribiralgoritmosenpseudocódigoparalossiguientesproblemasydeterminareltiem-podeejecución(O(n)):
•Calcularelmáximoentredosnúmeros.•Calcularlasumatoriadeloselementosdeunarreglodetamañondenúmerosenteros.•Imprimirloselementosdeunamatrizcuadrada(nxn)denúmerosenteros.•Calcularlasumatoriadeloselementosdeunamatrizdetamañonxmdenúmerosnatu-
rales.
Ejemplos
Considere los siguientes fragmentos de programas:•for(i=0;i<n;i++)cout<<A[i][i];•for(i=0;i<n;i++)for(j=0;j<n;j++)if (i==j)cout<<A[i][j];¿Quéhacen?¿Cuálesmáseficienteyporqué?
Ejercicios
Considere la siguiente función:intF(intn){intm=A[0];for(inti=n-1;0<i;i--)if (A[i]<m)m=A[i];returnm;};
DondeAesunaarreglodeenterosdefinidocomounavariableglobalalafunción.a)¿QuécalculalafunciónF?b)CalculeelOrden(O)detiempodeejecucióndelafunción.
Considereelsiguienteprocedimiento:voidP(intk){inti,j;boolesta=false;
64
Prog
ram
ació
n in
icia
l
for(i=0;i<n&&!esta;i++)if (A[i]==k){esta=true;for(j=0;j<n;j++)cout<<j*i;}};
DondeAesunaarreglodeenterosdefinidocomounavariableglobalalafunción.¿CuáleselOrden(O)detiempodeejecucióndelprocedimientoP?
Considere el siguiente procedimiento:
voidP(intn){for(inti=1;i<n+1;i++)for(intj=i;j<n+1;j++)for(intk=j;k<i+1;k++)cout<<i+j+k;};
CalculeelOrden(O)detiempodeejecucióndelprocedimientoP.Nota:
Aspectos importantes además de O(n)
•Siunalgoritmosevaautilizarsóloalgunasveces,elcostodeescrituraydepuraciónpuedesereldominante.•Siunprogramasevaaejecutarsóloconentradas“pequeñas”,elordenO(n)puedeserme-
nosimportantequeelfactorconstantedelafórmuladetiempodeejecución.•Unalgoritmoeficienteperocomplicadopuededificultarelmantenimientodelmismo.•Unalgoritmoeficienteentiempodeejecución,peroqueocupademasiadoespaciodealma-
cenamiento,puedeserinadecuado.
Bibliografía
•EstructurasdeDatosyAnálisisdeAlgoritmosMarkAllenWeiss(Capítulo2)•EstructurasdeDatosyAlgoritmos.A.Aho,J.E.Hopcroft&J.D.Ullman(Capítulo1,sec-
ciones1.4y1.5)
Más ejercicios...
ConsiderelasiguientefunciónenC/C++:boolF(int*A,int*B,intn){boolb=true;
65
Programación inicial
for(inti=0;i<n;i++)for(intj=n-1;j>-1;j--)b=b&&(A[i]<B[j]);returnb;};
a)¿QuécalculalafunciónF?b)CalculeeltiempodeejecuciónparaelpeorcasodelafunciónFyelOrden(O).c)ConsidereahoraqueelsegundoarregloparámetrodeFsiempreestáordenado(esuna
precondicióndeF).ElproblemaqueresuelveFpodríaresolversebajoesesupuestoenunmenororden(O)detiempodeejecuciónenelpeorcaso?Justifique.
ConsiderelasiguientefunciónenC/C++:boolF(int*A,intn){boolb=true;for(inti=0;i<n;i++)for(intj=n-1;j>-1;j--)b=b&&(A[i]==A[j];returnb;};
a)¿QuécalculalafunciónF?b)CalculeeltiempodeejecuciónparaelpeorcasodelafunciónFyelOrden(O).c)¿ElproblemaqueresuelveFpodríaresolverseenunmenororden(O)detiempode
ejecuciónenelpeorcaso?Justifique.
ConsiderelasiguientefunciónenC/C++:boolF(int*A,int*B,intn){boolb=false;for(inti=0;i<n;i++)for(intj=n-1;j>-1;j--)b=b||(A[i]<B[j]);returnb;};
a)¿QuécalculalafunciónF?b)CalculeeltiempodeejecuciónparaelpeorcasodelafunciónFyelOrden(O).c)EscribaunaFunciónGqueresuelvaelmismoproblemaquelafunciónFperoenO(n)
peorcaso.Justifique.
ConsiderelasiguientefunciónenC/C++:boolF(int*A,intn){boolb=false;for(inti=0;i<n;i++)for(intj=0;j<n;j++)b=b||(A[i]==A[j]&&i!=j);returnb;};
66
Prog
ram
ació
n in
icia
l
a)¿QuécomputalafunciónF?b)CalculeeltiempodeejecuciónparaelpeorcasodelafunciónFyelOrden(O).c)EscribaunaFunciónGqueresuelvaelmismoproblemaquelafunciónFperoenO(n)
peorcaso,asumiendoqueelarregloparámetroestáordenadodemenoramayor.Justifique.d)¿PuederesolverseelproblemaanteriorenO(n)peorcaso,perosinasumirqueelarre-
gloparámetroestáordenado?Justifique.
Escribaunprogramaquecalculeaproximacionesdelvalordepapartirdelasreducidasn-ésimasdelasiguienteserieinfinita:
¿CuáleselordenOdetiempodeejecuciónparaelpeorcasodesuprograma?
Dadoelproblemadebuscarunelementoenunarreglodesordenadodetamañon,sa-biendoqueelelementoseencuentrayquelasprobabilidadesdequeseencuentreencadaposiciónsonlasmismas:
•ImplementarlarutinadebúsquedaenC/C++.•Calculareltiempoparaelpeorcasoyelordendelalgoritmo.•Calculareltiempopromediodelalgoritmo.
Aciertosestudiantesselesdicequesucalificaciónfinalseráelpromediodelascuatrocalificacionesmásaltasdeentrelascincoquehayanobtenidoenelcurso.Escribirunafun-ciónC/C++concincoparametrosdeentradayunparametrodesalidaquerealiceelcálculo.Calcularluegoeltiempodeejecuciónenelmejorcaso,casopromedioypeorcaso.EscribaunprocedimientoSort012enC/C++que,dadounarreglodevaloresenelcon-
junto{0,1,2}detamañon,loordenedemenoramayorenO(n)peorcaso.Justifique.Porejemplo,sin=6,Sort012delarreglo[0,2,2,1,0,0]dejaelarreglo[0,0,0,1,2,2].
EscribaunafunciónEsPermutacionenC/C++quedadounarreglodeenterosdetama-ñon,retornetrue si,ysólosi,elarregloalmacenaunapermutacióndelosenteros0,...,n-1.SerequierequeEsPermutaciontengaO(n)enelpeorcaso.Justifique.Porejemplo,sin=5,EsPermutacionretornatrueparaelarreglo[1,3,0,4,2]yfalseenlossiguientescasos:[1,1,0,4,2]y[1,3,0,8,2].
EscribaunafunciónSonPermutacionesenC/C++que,dadosdosarreglosdetamañondevaloresenterosenelrango[0,K],retornetruesi,ysólosi,losarreglossonpermutaciones.Kesunvalorconstante.SerequierequeSonPermutacionestengaO(n)enelpeorcaso.Justifique.Porejemplo,sin=5yK=3,SonPermutacionesretornatrueparalosarreglos:[1,1,0,3,2],
[0,1,2,3,1];yfalseparalossiguientesarreglos:[1,1,0,3,2]y[0,3,0,1,2].
67
Programación inicial
Unpalíndromoesunacadenaqueseescribedelamismaformahaciaadelanteyhaciaatrás.Algunosejemplosdepalíndromosson“radar”,“ablewasiereisawelba”y“amanaplanacanalpanama”.•Escribaunafuncióniterativa“testPalindrome”quedevuelvatruesilacadenaalmacena-
daenunarregloesunpalíndromoyfalsedelocontrario.Lafuncióndebeignorarespaciosypuntuacionesincluidasenlacadena.•Calculeelorden(O)detiempodeejecucióndeambasversiones.
Considereelsiguienteprocedimiento:voidP(intn){intm=0;for(inti=0;i<n;i++)for(intj=n-1;j>-1;j--)if (A[i]==A[j]&&i!=j)m=m+1;if (m%2==1)cout<<m;};DondeimparesunafunciónbooleanadeO(1)yAesunarreglodefinidocomounavaria-
bleglobalalprocedimiento.a)¿QuéhaceelprocedimientoP?b)CalculeelOrden(O)detiempodeejecucióndelprocedimientoP.
Ejercicios adicionales propuestos
•Losdelfinaldelcapítulo2del libro:EstructurasdeDatosyAnálisisdeAlgoritmos.MarkAllenWeiss.•Losdelfinaldelcapítulo1dellibro:EstructurasdeDatosyAlgoritmos.A.Aho,J.E.
Hopcroft&J.D.Ullman
68
Prog
ram
ació
n in
icia
l
Recurrencia, inducción y recursión +Análisis de programas recursivos
Introducción
Diccionario castellano
recurrirvolverunacosaalsitiodedondesalió;retornar,repetirse,reaparecer.(pocofrecuente)recurriraalgo->hacerusodeello.(máscomún)
Subprogramas recurrentes
•Seinvocan(llaman)asímismos.•Definidosentérminosdesímismos.
• ¿Circularidad?•Recurrenciainútil.•voidP(){P();}•Terminaconunerrordeejecución:nohaymásmemoria(p.ej:“stackoverflow”).¿Porqué?•CadavezqueunsubprogramaQllamaaotroRdebeguardarseunaindicacióndelpun-
toenQdondeelcontroldeberetornaralfinalizarlaejecucióndeR.•Lasllamdasaprocedimientospuedenencadenarsearbitrariamente:Q1Q2Q3...Qn...
Hayunaestructuradedatosdondesealmacenan lossucesivospuntosde retorno.Engeneralsetiene:
dondeQneselqueseestáejecutando.Paralelamente,sehaformadolaestructurade“puntosderetorno”.
69
Programación inicial
•Laestructuracrececoncadanuevallamada(unlugar)ydecrecealterminarlaejecucióndeunsubprograma.•LaestructurasecomportacomounaPILA(análogoaunapiladeplatos).
pn-1pn-2
...
...
p1p0
•Eltopedelapilaeselpuntodondedeberetor-narseelcontroltraslaterminacióndelsubprogramacorriente.•Porlotanto,sielsubprogramacorrientellamaa
otro,elcorrespondientepuntoderetornodebecolo-carsecomonuevotopedelapila.•Y, al finalizar un subprograma, se usa el tope
comodirecciónderetornoyseloremuevedelapila.
PILA(LIFO):Estructuralinealdinámicadondeseagreganyquitanelementossóloenunodesusextremos.COLA(FIFO):Estructura linealdinámicadondeseagreganelementosenunodesus
extremosysequitandelotro.
Comparar con versión iterativa:
intFact(intn){intf =1;for(inti=2;i<=n;i++)f =f *i;returnf;}
•Laversiónrecurrenteesmássimple,análogaaunadefiniciónmatemática.•Laversióniterativaesmáseficiente(nousapila).Seacomodamejoralesquemademáquinasdeestados.
Enparticular,podríadarseque:laversiónrecurrenteterminarapordesbordarlapilaencasosenquelaversióniterativaterminaríanormalmente.
Primeras conclusiones:
•Usamossubprogramasrecurrentes.•Operandosobrenuevosdatos.•Produciendoademásotrosefectos.•Estoledasentidoalacircularidad.
Porejemplo,podemosdecirquelafunciónFactestádefinidaentérminosdesímisma.Estosugiereunacircularidaddeladefinición,peroenrealidadesunaafirmaciónnode-
masiadoprecisa.
70
Prog
ram
ació
n in
icia
l
Enrealidad,paracadan,Fact(n)noestádefinidocircularmente(i.e.entérminosdesímismo)sinoentérminosdeFact(n-1)obien(sin=0)directamente(i.esinusarFact).
El cómputo de Fact(n) se realiza:
•Directamente(n=0).•ReduciéndoloaFactdeunnúmeromáschico(mascercanoa0).Estogarantizaque
todaejecucióndeFact(n)esfinitayque,porlotanto,Fact(n)estabiendefinidaparatodon(amenosdelproblemade”Intoverflow”).•Elusode recurrenciapermiteescribirprogramascuyascomputaciones sonde largo
variable•Solapamientorecurrencia/iteración.Redundancia.•Teóricamente,alcanzaconunadelasdos.•Dehecho,puedenconsiderarselenguajes:•Siniteración.•Sinasignación.(verFactrecurrente,alcanzaconelconceptodefunciónqueretornaunvalor).•Sinvariablesdeestado.Estoeslabasedelosllamados.
LENGUAJES DECLARATIVOS
Lenguajes declarativos
•Funcionales,sonparticularmenteinteresantes.•Lógicos.
Loslenguajesconvariablesdeestado,asignacióneiteraciónsonllamadoslenguajesIM-PERATIVOS.
•Lamayoríadeloslenguajesimperativosmodernosadmiterecurrencia.•Elusoderecurrenciapermitedesarrollarsolucionessimplesyelegantes.Enmuchos
casosenquelascorrespondientessolucionesiterativassondemasiadocomplejas.•Tambiénsedaloinverso.
Orígenes
•Lógica:TeoríadelosNúmerosNaturalesydelasfuncionescomputablesmecánicamen-te.•EnMatemática,losnúmerosnaturalesusualmenteseasumencomobienconocidos,seescribenennotacióndecimal.•(TambiénenC/C++,Java,Pascal,...).•Enlógica,losnaturalessedefinenexplícitamente.•Laideaesabstraersedecualquiersistemadenumeraciónposicional.
71
Programación inicial
Unsistemadenumeraciónes,dehecho,unsistemaderepresentacióndenúmeros.
El sistema en base b usa b símbolos
Ejemplo:dígitos
dndn-1....dodetalformaqueelnúmerorepresentadoes:dn*b^n+.....+do*b^0(unpolinomio)
•Tratamosdeabstraernosdetodasestasrepresentacionesi.e.buscaruna“másgeneral”quepodamostomarcomoladefinición(loesencial)delconceptodenúmeronatural.•Estonosllevaaconsiderarelsistemadenumeraciónmássimpleposible:
SISTEMA UNARIO
Sistema unario de numeración:
–Hayunsólodígito:|–Representamoslosnúmeroscomosecuenciasdeesedígito:|||||||–Esconvenientetenerunarepresentaciónparael0(cero).
•Estonosllevaaladefinicióndelosnúmerosnaturales.EsuncasodedefiniciónInductivadeunconjunto.Damosreglasparaconstruirtodoslos
elementosdelconjunto:
Regla 1:0esunnatural.Regla 2:Sinesunnatural, entonces(Sn)esotronatural.Regla 3:Esossontodoslosnaturales.
Un conjunto inductivo (nat) e inducción
Otra notación:
0ySsonllamados(operadores)CONSTRUCTORESdelconjuntoN.•LaRegla3permitejustificarelPRINCIPIOdeDEMOSTRACIÓNporINDUCCIÓN
MATEMÁTICANATURAL(inducciónprimitiva).
SeaPunapropiedaddenúmerosnaturales,osea:
72
Prog
ram
ació
n in
icia
l
P(n)esunaproposición-enunciado(matemático)Ejemplos
nespar n>2 nesprimo
Entonces,elsiguienteesunprincipio(esquema)dedemostracionesdeenunciadosdelaforma:P(n)valeparatodon.(Obviamente,noesunmétodoparaprobar“P(n)valeparatodon”cualquieraseaP,sino
parahacerevidenteque“P(n)valeparatodon”paraciertasP.)
Si (1)P(0)vale(CB)y(2)asumiendoqueP(n)vale(HI),podemosdemostrarqueP(Sn)vale(TI).Entonces, P(n) vale para todo número natural n.
•Idea: “Juegodefichasdedominó”:Paratirartodaslasfichas:Tirarlaprimera.Ladistanciaentredossucesivasdebesertalqueasegurequesicaelapreviaentoncesella
tiraalasiguiente.
•Otra idea:Lapropiedadaprobardebeser:Unapropiedaddelpadre(0).Serhereditaria.
•Lamismaideasirveparadefinirfuncionessobrelosnaturales.f:NX•“tirar”->asociarlesuimagenenf,Definirf(n).f(0)=xo(nodependedef).f(Sn)=c(n,f(n))(dondecnodependedef).
Silafunciónestádefinidaen0yeshereditaria(podemosdefinirlaenSnusandoqueestádefinidaenni.e.usandof(n)),entoncesquedadefinidaparatodon.
(RECURRENCIA PRIMITIVA)Ejemplos:
fac:NNfac:0=1fac:(Sn)=(Sn)*fac(n)Ej:fac3=3*fac2=3*2*fac1=3*2*1*fac0=3*2*1*1=6
Métodomecánicodecálculo(simplesustitución).Otromodelodecómputo(programa)mecánico.(funcionesrecurrentes(recursivas).)
73
Programación inicial
(compararconlamáquinadeestados.)
+:NxNN *:NxNNm+0=m m*0=0m+(Sn)=S(m+n) m*(Sn)=(m*n)+m
Recursión general
•EnC++usamosnotacióndecimalenlugardelaunaria.Lasecuacionesdeladefinicióndefacseexpresan:
if (n==0)return1;elsereturnn*fac(n-1);
•Otroejemplo(máscomplejo):Fib:NN(losnúmerosdeFibonacci)Fib(0)=1Fib(1)=1Fib(n+2)=Fib(n)+Fib(n+1)(dosllamadasendistintospuntos)(noesuncasoderecurrenciaprimitiva)
Principio de Inducción completa
SipodemosprobarP(n)asumiendoP(z)paratodoz<nentoncesvaleP(n)paratodon:•Entérminosdelasfichasdedominó:Siunacualquierasecaetodavezquetodassuspredecesorassecaen,entoncestodasse
caen.•Notarquetodaaplicacióndeesteprincipiorequiereprobarlapropiedadpara0.¿Por
qué?
Recursión general
Casogeneraldedefiniciónrecurrentedefuncionesf:NXCasosBase(lasbinodependendef)f(n0)=b0...f(nk)=bkCasosRecurrentes(laseidependendef)f(nk+1)=e1...f(nk+r)=er
Paraquef estédefinidacomofuncióndebeprobarse,paratodon:EXISTENCIAYUNICI-DADdef(n).
•Paracadandebehaberunaecuación(caso)queseaplique(exhaustividad).•Cadantienequecorresponderaunaúnicaecuación(exclusión)of(n)debeserigual
paralosnqueviolenexclus.• (terminación)Lasllamadasrecurrentesdebenserdelaformaf(n)=c(f(m1),......,f(mp))donde
74
Prog
ram
ació
n in
icia
l
mi<nparacadamienunordenbienfundado.Estodauncriteriosuficienteparagarantizarlabuenadefinicióndef.•SejustificaporINDUCCIONCOMPLETA(notarque<es“bienfundado”).•Metodológicamente:pensarloscasosden.*Basey*Reducciónaunpredecesor.
Listas
•VamosadefinirelconjuntodelaslistassecuencialesfinitadenaturalesInductivamente:
75
Programación inicial
Algunas conclusiones
Losnúmerosnaturales,laslistas,losárbolesbinarios,entreotros,sonconjuntosquepue-denserdefinidosinductivamenteatravésdereglas.Losconjuntosinductivospermiten:•Probarpropiedadesporinducciónprimitiva(estructural).•Definirfuncionesporrecursiónprimitiva(estructural).Esposible,también,definirfuncionesrecursivasmásgenerales,perohayqueprobarexis-
tenciayunicidad.Trescondicionessuficientesparaestoson:•exhaustividad,•exclusión,• terminación:verquecadallamadorecursivoesmáspequeñosegúnunordenbienfun-
dado(sejustificaporinduccióncompleta).Cuandounafunciónrecursivatieneprecondición,hayqueasegurarsedequelosparáme-
trosconlosquesellamaalafunciónsatisfaganlaprecondición.•Enparticular,quelosllamadosrecursivosdelafunciónpreservenelcumplimientode
suprecondición.
77
Programación inicial
Análisis de programas recursivos: tiempo de ejecución
T(n) para programas recursivos
Ejercicios
Bibliografía
EstructurasdeDatosyAnálisisdeAlgoritmos,MarkAllenWeiss(Capítulo2)EstructurasdeDatosyAlgoritmos.A.Aho,J.E.Hopcroft&J.D.Ullman(Capítulo1,
secciones1.4y1.5)(Capítulo9:recurrencias)
85
Programación inicial
Salto de Tema
Pasaje de parámetros a funciones y procedimientos por valor y por referencia
94
Prog
ram
ació
n in
icia
l
Bibliografía
H.M.Deitel&P.J.Deitel;PrenticeHall,1994.ComoProgramarenC/C++,