2. Programación inicial - Campus Virtual CETP-UTUcampusvirtual.edu.uy/libro1/capitulo2.pdf · A....

49
2. Programación inicial Lic. Carlos Luna

Transcript of 2. Programación inicial - Campus Virtual CETP-UTUcampusvirtual.edu.uy/libro1/capitulo2.pdf · A....

2. Programación inicial

Lic. Carlos Luna

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.

76

Prog

ram

ació

n in

icia

l

Ejercicios propuestos sobre naturales

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)

78

Prog

ram

ació

n in

icia

l

Tipos inductivos (recursivos)Estructuras dinámicas: Punteros y listas

79

Programación inicial

80

Prog

ram

ació

n in

icia

l

81

Programación inicial

82

Prog

ram

ació

n in

icia

l

83

Programación inicial

84

Prog

ram

ació

n in

icia

l

85

Programación inicial

Salto de Tema

Pasaje de parámetros a funciones y procedimientos por valor y por referencia

86

Prog

ram

ació

n in

icia

l

Bibliografía recomendada

ComoProgramarenC/C++,H.M.Deitel&P.J.Deitel

87

Programación inicial

Estructuras ArborescentesArboles (introducción)

88

Prog

ram

ació

n in

icia

l

89

Programación inicial

90

Prog

ram

ació

n in

icia

l

91

Programación inicial

92

Prog

ram

ació

n in

icia

l

93

Programación inicial

94

Prog

ram

ació

n in

icia

l

Bibliografía

H.M.Deitel&P.J.Deitel;PrenticeHall,1994.ComoProgramarenC/C++,

95

Programación inicial

Tipos Abstractos de Datos

96

Prog

ram

ació

n in

icia

l

97

Programación inicial

98

Prog

ram

ació

n in

icia

l

99

Programación inicial