estructuras de datos cc by-sa 3.0

222

Upload: sebas-olarte

Post on 02-Oct-2015

155 views

Category:

Documents


3 download

DESCRIPTION

Este es un libro abierto sobre Estructuras de datos.

TRANSCRIPT

  • AUTORES

    Jos FagerW. Libardo Pantoja Ypez

    Marisol VillacrsLuz Andrea Pez Martnez

    Daniel OchoaErnesto Cuadros-Vargas

  • Estructuras de Datos

    1a ed. - Iniciativa Latinoamericana de Libros de Texto Abiertos (LATIn), 2014. 222 pag.

    Primera Edicin: Marzo 2014Iniciativa Latinoamericana de Libros de Texto Abiertos (LATIn)http://www.proyectolatin.org/

    Los textos de este libro se distribuyen bajo una licencia Reconocimiento-CompartirIgual 3.0 Unported(CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/deed.es_ES

    Esta licencia permite:Compartir: copiar y redistribuir el material en cualquier medio o formato.Adaptar: remezclar, transformar y crear a partir del material para cualquier finalidad.

    Siempre que se cumplan las siguientes condiciones:

    Reconocimiento. Debe reconocer adecuadamente la autora, proporcionar un enlace a lalicencia e indicar si se han realizado cambios. Puede hacerlo de cualquier manera razonable,pero no de una manera que sugiera que tiene el apoyo del licenciador o lo recibe por el usoque hace.

    CompartirIgual Si remezcla, transforma o crea a partir del material, deber difundir suscontribuciones bajo la misma licencia que el original.

    Las figuras e ilustraciones que aparecen en el libro son de autora de los respectivos au-tores. De aquellas figuras o ilustraciones que no son realizadas por los autores, se coloca la

    referencia respectiva.

    Este texto forma parte de la Iniciativa Latinoamericana de Libros de Texto abiertos (LATIn), proyectofinanciado por la Unin Europea en el marco de su Programa ALFA III EuropeAid.

    El Proyecto LATIn est conformado por: Escuela Superior Politcnica del Litoral, Ecuador (ESPOL);Universidad Autnoma de Aguascalientes, Mxico (UAA), Universidad Catlica de San Pablo, Per(UCSP); Universidade Presbiteriana Mackenzie, Brasil(UPM); Universidad de la Repblica, Uruguay(UdelaR); Universidad Nacional de Rosario, Argentina(UR); Universidad Central de Venezuela, Venezuela(UCV), Universidad Austral de Chile, Chile (UACH), Universidad del Cauca, Colombia (UNICAUCA),Katholieke Universiteit Leuven, Blgica (KUL), Universidad de Alcal, Espaa (UAH), Universit PaulSabatier, Francia (UPS).

  • ndice general

    1 Introduccin a las Estructuras de Datos . . . . . . . . . . . . . . . . . . . . . . 111.1 Conceptos bsicos sobre estructuras de datos 111.1.1 Definicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.1.2 Operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.2 Clasificacin 121.2.1 Estructuras de Datos Estticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.2.2 Estructuras de Datos Dinmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    2 Introduccin al Diseo y Anlisis de Algoritmos . . . . . . . . . . . . . . 132.1 Tipos de Datos 14

    2.2 Tipos de Datos Abstractos 142.2.1 Especificacin de un TDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.2.2 Tipos de Operaciones de los TDAs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.2.3 Ejemplo de un TAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.2.4 Ejercicios Propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    2.3 Clasificacin de los Tipos de Datos 232.3.1 Clasificacin desde el punto de vista funcional . . . . . . . . . . . . . . . . . . . . . . 232.3.2 Clasificacin desde el punto de vista de Estructuras de Datos . . . . . . . . . . 27

    2.4 Anlisis de Algoritmos 282.4.1 Los Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.4.2 Anlisis de Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.4.3 Funcin de Complejidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.4.4 Operaciones elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.4.5 Calcular T(n) para Ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.4.6 Orden de Magnitud (Notacin O Grande) . . . . . . . . . . . . . . . . . . . . . . . . . . 382.4.7 Recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.4.8 Complejidad de un Algoritmo Recursivo . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    2.5 Algoritmos de Bsqueda y Ordenamiento 452.5.1 Algoritmos de Bsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452.5.2 Algoritmos de Ordenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    3 Algoritmos de Bsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693.1 Introduccin a los algoritmos de bsqueda 69

  • 3.2 Bsqueda Secuencial 693.2.1 Conceptos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693.2.2 Complejidad computacional de la bsqueda secuencial . . . . . . . . . . . . . 70

    3.3 Bsqueda Binaria 703.3.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703.3.2 Complejidad de la bsqueda binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713.3.3 Versin recursiva de la bsqueda binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . 723.3.4 Complejidad de la bsqueda binaria recursiva . . . . . . . . . . . . . . . . . . . . . . 72

    3.4 Bsqueda Hash 733.4.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733.4.2 Colisiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    3.5 Ejercicios sobre bsquedas 77

    4 Algoritmos de Ordenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794.1 Introduccin a los algoritmos de Ordenamiento 79

    4.2 Ordenamiento por seleccin 79

    4.3 Ordenamiento burbuja 81

    4.4 Ordenamiento por insercin 83

    4.5 Ordenamiento Shell 85

    4.6 Merge Sort 88

    4.7 Quick Sort 90

    4.8 Ejercicios sobre algoritmos de ordenamiento 93

    5 Complejidad computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955.1 Conceptos 955.1.1 Definicin de algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955.1.2 Factores que influyen en la eficiencia de un algoritmo . . . . . . . . . . . . . . . . 955.1.3 Anlisis de Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    5.2 Funcin de Complejidad 975.2.1 Definicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975.2.2 Tipos de operaciones Elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975.2.3 Clculo del T(n) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

    5.3 Algoritmos recursivos 105

    5.4 Complejidad computacional de los algoritmos recursivos 1065.4.1 Mtodo del rbol de recursin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    5.5 Ejercicios sobre anlisis de algoritmos 108

    6 Tipos Abstractos de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116.1 Conceptos TADs 1116.1.1 Tipos Abstractos de Datos (TADs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116.1.2 Aspectos Tericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116.1.3 La modularidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

  • 6.1.4 Mtodos para Especificar un TAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1126.1.5 Clasificacin de las Operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1146.1.6 Ejemplo de un TAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

    6.2 Ejercicios sobre TADs 116

    7 TDAs Lineales: Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177.1 Definicin y Formas de Uso 1177.1.1 Definicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177.1.2 Formas de Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

    7.2 Implementacin 1217.2.1 Mediante Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217.2.2 Mediante Referencias a Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    7.3 Casos de estudio 1307.3.1 Tienda de Libros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307.3.2 TDA String con Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317.3.3 Materias y Estudiantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337.3.4 Anlisis del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

    7.4 Ejercicios propuestos 136

    8 TDAs Lineales: Pilas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1398.1 Definicin y Formas de Uso 1398.1.1 Definicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1398.1.2 Formas de Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

    8.2 Implementaciones y Algoritmos fundamentales. 1418.2.1 Implementacin en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1418.2.2 Implementacin en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

    8.3 Formas de representacin. 1448.3.1 Representacin como Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    8.4 Casos de Estudio 1458.4.1 Correspondencia de delimitadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1458.4.2 Evaluacin de expresiones aritmticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1458.4.3 Convertir una expresin dada en notacin INFIJA a una notacin POSTFIJA 1468.4.4 Evaluacin de la Expresin en notacin postfija . . . . . . . . . . . . . . . . . . . . . . 147

    8.5 Ejercicios Propuestos 148

    9 Estructuras de Datos Lineales. Colas. . . . . . . . . . . . . . . . . . . . . . . . 1519.1 Aspectos Tericos de las Colas 151

    9.2 Especificacin de las colas 1519.2.1 Especificacin semi formal del TAD Cola . . . . . . . . . . . . . . . . . . . . . . . . . . . 1519.2.2 Especificacin no formal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

    9.3 Formas de Representacin 153

    9.4 Implementaciones y Algoritmos Fundamentales 1539.4.1 Implementacin en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

  • 9.5 Casos de Estudio del uso de Colas 155

    9.6 Ejercicios Colas 156

    10 Estructuras de Datos No Lineales. Arboles Binarios . . . . . . . . . . . 15910.1 Casos de estudio del uso de rboles Binarios 16010.1.1 Eficiencia en la bsqueda de un rbol equilibrado . . . . . . . . . . . . . . . . . . . 160

    10.1.2 rbol binario equilibrado, rboles AVL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16110.1.3 Tarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

    10.2 Conceptos de rboles 16810.2.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16810.2.2 Definicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16810.2.3 Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16910.2.4 Ejercicio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

    10.3 Aspectos tericos. Especificacin formal. 17110.3.1 TAD ARBOL BINARIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

    10.4 Formas de Representacin de los Arboles Binarios 17110.4.1 Estructura de un rbol binario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

    10.5 Conceptos de rboles binarios 17210.5.1 Definicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17210.5.2 Equilibrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17210.5.3 Arboles binario completos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    10.5.4 rbol de expresin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17310.5.5 Recorrido de un rbol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17410.5.6 Implementacin de los recorridos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

    10.6 Implementaciones de los Arboles Binarios y Algoritmos fundamentales175

    10.6.1 Nodo de un rbol binario de bsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17610.6.2 Operaciones en rboles binarios de bsqueda . . . . . . . . . . . . . . . . . . . . . . 17710.6.3 Insertar un nodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17710.6.4 Bsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17810.6.5 Eliminar un nodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18010.6.6 Implementacin iterativa de la eliminacin . . . . . . . . . . . . . . . . . . . . . . . . . 18210.6.7 Tarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

    10.7 Ejercicios propuestos para rboles Binarios 184

    11 Estructura de Datos No Lineales. Introduccin a Grafos . . . . . . 18711.1 Definiciones 18711.1.1 Grafo, vrtice y arista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18711.1.2 Grafos dirigidos y no dirigidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18711.1.3 Grado de entrada de un vrtice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18811.1.4 Grafos ponderados y no ponderados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

    11.2 Ejercicios - Definiciones 18911.2.1 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18911.2.2 Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

  • 11.3 Caminos y Ciclos 19111.3.1 Definicin de camino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19111.3.2 Peso de un camino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19211.3.3 Ciclo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19311.3.4 Grafos conexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

    11.4 Ejercicios - Caminos y Ciclos 19411.4.1 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19411.4.2 Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

    12 Estructuras de Datos No Lineales. Grafos. . . . . . . . . . . . . . . . . . . . 19712.1 Introduccin 198

    12.2 Definicin 200

    12.3 Tipos de Grafos y Conceptos 20012.3.1 Conceptos asociados a los grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20012.3.2 Caminos en grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

    12.4 TDA Grafo 204

    12.5 Representacin de grafos 204

    12.6 Recorrido de un Grafo 206

    12.7 Algoritmos tiles en Grafos 20812.7.1 El algoritmo de Warshall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20812.7.2 Algoritmo de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20912.7.3 Algoritmo de Floyd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21012.7.4 rbol de expasion mnima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21012.7.5 Algoritmo de Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21112.7.6 Algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

    12.8 Preguntas 214

    12.9 Ejercicios 216

  • 1 Introduccin a las Estructuras deDatos

    1.1 Conceptos bsicos sobre estructuras de datos

    1.1.1 Definicin

    En un lenguaje de programacin, un tipo de dato esta definido por el conjunto de valoresque representa y por el conjunto de operaciones que se pueden realizar con dicho tipo de dato.Por ejemplo, el tipo de dato entero en Java puede representar nmeros en el rango de -2^31 a2^31-1 y cuenta con operaciones como suma, resta, multiplicacin, divisin, etc.

    Por otro lado, podemos decir que en la solucin de un problema a ser procesado por uncomputador podemos encontrar dos grandes tipos de datos: datos simples y datos estructurados.Los datos simples son aquellos que, al ser representados por el computador, ocupan solo unacasilla de memoria. Debido a esto, una variable de un tipo de dato simple hace referencia aun nico valor a la vez. Ejemplo de estos tipos de datos son los enteros, reales, caracteres ybooleanos.

    As mismo, los datos estructurados se caracterizan por que su definicin est compuestade otros tipos de datos simples, as como de otros datos estructurados. En este caso, un nombre(identificador de la variable estructurada) hace referencia no solo a una casilla de memoria, sinoa un grupo de casillas.

    En programacin, el trmino estructura de datos se utiliza para referirse a una forma deorganizar un conjunto de datos que se relacionan entre si, sean estos simples o estructurados, conel objetivo de facilitar su manipulacin y de operarlo como un todo.

    Por otro lado, tenemos el trmino Tipo de Dato Abstracto, o TDA, que es muy comunmenteutilizado como equivalente al trmino estructura de datos para referirse justamente a un tipo dedato estructurado que representa un concepto a travs de la definicin de sus caractersticas(datosque lo conforman) y de sus operaciones(algoritmos que manipulan los datos que lo conforman)

    1.1.2 Operaciones

    Sobre una estructura de datos se puede efectuar diferentes tipos de operaciones, entre lasms importantes estn:

    Insercin. Es aquella mediante la cual se incluye un nuevo elemento en la estructura.Modificacin. Permite variar parcial o totalmente el contenido de la informacin de loselementos de la estructura.Eliminacin. Como su nombre lo indica, es la que permite suprimir elementos de laestructura.Navegar por la estructura: Esta es una operacin bsica que garantiza que se puederecuperar informacin almacenada.Bsqueda. Permite determinar si un elemento se encuentra o no en la estructura.Consulta de la informacin. Permite obtener informacin de uno o ms elementos de laestructura.

  • 12 Introduccin a las Estructuras de Datos

    Copia parcial o total: Mediante esta operacin se puede obtener total o parcialmente unaestructura con caractersticas similares a la original.Prueba. Permite determinar si uno o varios elementos cumplen determinadas condiciones.Verificar si es vaca. Permite determinar si existen o no elementos sobre la estructura.

    1.2 ClasificacinUna clasificacin de estructuras de datos es segn dnde residan: Internas y externas. Si

    una estructura de datos reside en lamemoria central del computador se denomina estructura dedatos interna. Recprocamente, si reside en un soporte externo, se denomina estructura de datosexterna.

    Las estructuras de datos internas pueden ser de dos tipos:Estructuras de Datos Estticas.Estructuras de Datos Dinmicas.

    1.2.1 Estructuras de Datos EstticasTienen un nmero fijo de elementos que queda determinado desde la declaracin de la

    estructura en el comienzo del programa. Ejemplo los arreglos. Las estructuras de datos estticas,presentan dos inconvenientes:

    1. La reorganizacin de sus elementos, si sta implica mucho movimiento puede ser muycostosa. Ejemplo: insertar un dato en un arreglo ordenado.

    2. Son estructuras de datos estticas, es decir, el tamao ocupado en memoria es fijo, elarreglo podra llenarse y si se crea un arreglo de tamao grande se estara desperdiciandomemoria.

    1.2.2 Estructuras de Datos DinmicasLas estructuras de datos dinmicas nos permiten lograr un importante objetivo de la progra-

    macin orientada a objetos: la reutilizacin de objetos. Al contrario de un arreglo, que contieneespacio para almacenar un nmero fijo de elementos, una estructura dinmica de datos se amplay contrae durante la ejecucin del programa.

    A su vez, este tipo de estructuras se pueden dividir en dos grandes grupos segn la forma enla cual se ordenan sus elementos.

    LinealesNo lineales

    Estructuras de Datos LinealesEn este tipo de estructuras los elementos se encuentran ubicados secuencialmente. Al ser

    dinmica, su composicin vara a lo largo de la ejecucin del programa que lo utiliza a travs deoperaciones de insercin y eliminacin. Dependiendo del tipo de acceso a la secuencia, haremosla siguiente distincin:

    Listas: podemos acceder (insertar y eliminar) por cualquier lado.Pilas: slo tienen un nico punto de acceso fijo a travs del cual se aaden, se eliminan ose consultan elementos.Colas: tienen dos puntos de acceso, uno para aadir y el otro para consultar o eliminarelementos.

    Estructuras de Datos No LinealesDentro de las estructuras de datos no lineales tenemos los rboles y grafos. Este tipo de

    estructuras los datos no se encuentran ubicados secuencialmente. Permiten resolver problemascomputacionales complejos.

  • 2 Introduccin al Diseo y Anlisis deAlgoritmos

    El diseo de la solucin a un problema que nos lleve a la generacin de un algoritmo tienedos principales componentes: la identificacin de los datos que intervienen en la solucin consu respectiva especificacin de diseo y la especificacin de las instrucciones a ejecutar pararesolver el problema.

    Los datos son los valores que manejamos en la resolucin de un problema, tanto los valoresde entrada, como los de proceso y los de salida. Es decir, los datos son informacin y por lotanto, para manejarlos se requieren varios tipos de datos.

    Un tipo de dato se puede definir como un conjunto de valores y un conjunto de operacionesdefinidas por esos valores. Clasificar los datos en distintos tipos aporta muchas ventajas, comopor ejemplo indicarle al compilador la cantidad de memoria que debe reservar para cada instanciadependiendo del tipo de dato al que pertenezca. Los tipos de datos abstractos van todava msall; extienden la funcin de un tipo de dato ocultando la implementacin de las operacionesdefinidas por el usuario. Esta capacidad de ocultamiento permite desarrollar software reutilizabley extensible.

    Por otro lado, un algoritmo es sinnimo de procedimiento computacional y es fundamentalpara las ciencias de la computacin. Un algoritmo es una secuencia finita de instrucciones, cadacual con un significado concreto y cuya ejecucin genera un tiempo finito. Un algoritmo debeterminar en un tiempo finito.

    Algoritmo es toda receta, proceso, rutina, mtodo, etc. que adems de ser un conjunto deinstrucciones que resuelven un determinado problema, cumple las siguientes condiciones:

    Ser finito. La ejecucin de un algoritmo acaba en un tiempo finito; un procedimiento quefalle en la propiedad de la finitud es simplemente un procedimiento de clculo.Ser preciso. Cada instruccin de un algoritmo debe ser precisa; deber tenerse en cuenta unrigor y no la ambigedad, esta condicin es la definibilidad: cada frase tiene un significadoconcreto.Posee entradas. Las entradas se toman como un conjunto especfico de valores que inicial-izan el algoritmo.Posee salida. Todo algoritmo posee una o ms salidas; la salida es la transformacin de laentrada.Ser eficaz. Un algoritmo es eficaz cuando resuelve el problema.Ser eficiente. Un algoritmo es eficiente cuando resuelve el problema de la mejor maneraposible, o sea utilizando la mnima cantidad de recursos.

    Este captulo pretende cubrir estas dos grandes areas: la relevancia de los datos y sus tiposen la solucin de un problema, y el anlisis de eficiencia de las instrucciones que se eligen pararesolver un problema.

  • 14 Introduccin al Diseo y Anlisis de Algoritmos

    2.1 Tipos de Datos

    En el diseo de un algoritmo, y su paso de algoritmo a programa, se manejan constantementeconceptos como tipo de datos, estructura de datos y tipo de datos abstracto. A pesar de quesuenan similares, es extremadamente relevante entender la diferencia entre estos trminos.

    En un lenguaje de programacin, el tipo de dato de una variable esta definido por elconjunto de valores que una variable puede tomar y por el conjunto de operaciones que sepueden realizar con y sobre dicha variable. Por ejemplo, el tipo de dato entero en Java puederepresentar nmeros en el rango de -2^31 a 2^31-1 y cuenta con operaciones como suma, resta,multiplicacin, divisin, etc.

    Por otro lado, podemos decir que en la solucin de un problema a ser procesado porun computador usualmente se encuentran dos grandes tipos de datos: datos simples y datosestructurados. Los datos simples son aquellos que, al ser representados por el computador,ocupan solo una casilla de memoria. Debido a esto, una variable de un tipo de dato simple hacereferencia a un nico valor a la vez. Ejemplo de estos tipos de datos son los enteros, reales,caracteres y booleanos.

    As mismo, los datos estructurados se caracterizan por que su definicin est compuestade otros tipos de datos simples, as como de otros datos estructurados. En este caso, un nombre(identificador de la variable estructurada) hace referencia no solo a una casilla de memoria, sinoa un grupo de casillas. Un ejemplo de esto es cuando definimos un arreglo de 10 enteros, elarreglo sera un dato estructurado. Otro ejemplo sera la definicin del tipo de dato estructuradoFecha, el cual estara compuesto por un entero para el definir el da, otro para el mes y finalmenteuno ms para definir el ao de la fecha.

    Por otro lado, tenemos el trmino Tipo de Dato Abstracto, o TDA, que muy comunmente serelaciona con los tipos de datos estructurados. Un TDA permite representa un concepto a travsde la definicin de sus caractersticas(datos que lo conforman) y de sus operaciones(algoritmosque manipulan los datos que lo conforman). La implementacin de un TDA en un lenguajede programacin usualmente se sirve de un tipo de dato estructurado para la definicin de losdatos que lo conforman. Por ejemplo, si, quisieramos crear un modelo matemtico de las fechasque nos rodean, tendramos que comenzar definiendo las caractersticas o datos que conformanuna Fecha: un mes, un da y un ao, todos nmeros enteros. Luego, deberamos definir lasoperaciones que se pueden realizar con las Fechas: dos fechas se pueden restar, dando comoresultado el nmero de das entre ellas, a una fecha se le puede sumar un nmero de das, dandocomo resultado otra fecha, etc. Para representar la definicin de los datos de la Fecha usuaramosel tipo de dato estructurado Fecha, que definimos en el ejemplo anterior.

    Ahora, usualmente en programacin se utiliza el trmino estructura de datos para referirsea la forma concreta en que la descripcin lgica de un TDA ser implementada. Un ejemplode esto sera el TDA Lista que se refiere a figura lgica de un conjunto de datos que, en teora,puede crecer indefinidamente, al cual se le pueden agregar y eliminar elementos sin mayoresrestricciones. El TDA Lista puede ser implementado por diferentes estructuras de de datos, comopor ejemplo, por una lista enlazada o por un arreglo.

    2.2 Tipos de Datos Abstractos

    Como ya se revis, un TDA se refiere al concepto matemtico bsico que define a un tipo dedato. Estn formados por los datos (estructuras de datos) y las operaciones (procedimientos ofunciones) que se realizan sobre esos datos.

    TDA = Valores +operaciones

  • 2.2 Tipos de Datos Abstractos 15

    La definicin de un TDA habilita al diseador de una solucin a imaginar variables de estetipo de dato. Estas variables, sin embargo, ya no seran consideradas variables de tipos de datossimples, como un entero. Seran consideradas entidades abstractas llamadas objetos. El crearvariables de un TDA se conoce como instanciar un TDA. Cada objeto de un TDA sera unainstancia del mismo, con su propia identidad nica. Ejemplo:

    Si existiese el TDA Fecha, podemos crear dos instancias del mismo: Fecha a y Fecha b. a yb son objetos de tipo Fecha: ambos con da, mes y ao y con la capacidad de realizar todas lasoperaciones definidas para el TDA Fecha. Sin embargo, cada uno tendr sus propios valores deda, mes y ao y la ejecucin de sus operaciones ser realizar con dichos valores nicos: Si seejecuta un aumento de los das de la Fecha a, esta operacin no afectar los das de la Fecha b.

    Los TDAs son diseados bajo los principios de abstraccin, encapsulamiento y modulari-dad. Por el principio de abstraccin, el TDA es diseado para resaltar su definicin y operaciones,y esconder los detalles de su funcionamiento. Por ejemplo, si se definiese el TDA Polinomio,su diseo estara enfocado en resaltar que un Polinonio es un conjunto de Trminos, que unPolinomio se puede sumar con otro, que se puede derivar, etc. Pero no estara enfocado endetallar como se representar cada trmino, como se representar el conjunto de Trminos nicomo o que variables se vern afectadas cuando se ejecute la operacin que deriva un Polinomiodando un nuevo Polinomio como resultado. Por el principio de encapsulamiento, estos detallesse encontrarn escondidos, encapsulados por lo realmente importante para el diseo: la forma enque se interactuar con el TDA.

    Esto implica que, en la implementacin del TDA usando un lenguaje de programacin, ni lasestructuras de datos que utilizamos para almacenar la representacin del TDA, ni los detalles deimplementacin de las operaciones que lo definen, sern visibles para los usuarios programadoresque usarn eventualmente el TDA. Para lograrlo, la implementacin del TDA est basada en elprincipio de modularidad: En la programacin modular se descompone un programa creado enpequeas abstracciones independientes las unas de las otras, que se pueden relacionar fcilmenteunas con las otras. La implementacin de un TDA en un lenguaje de programacin se puededescomponer de una seccin de definicin llamada interfaz y de una seccin de implementacin;mientras que en la interfaz se declaran las operaciones y los datos, la implementacin contiene el

  • 16 Introduccin al Diseo y Anlisis de Algoritmos

    cdigo fuente de las operaciones, las cuales permanecen ocultos al usuario.Es por esto que, cuando vamos a disear un TDA es necesario tener una representacin

    abstracta del objeto sobre el cual se va a trabajar, sin tener que recurrir a un lenguaje deprogramacin. Esto nos va permitir crear las condiciones ,expresiones ,relaciones y operacionesde los objetos sobre los cuales vamos a trabajar.

    Por ejemplo, si se va a desarrollar software para la administracin de notas de una es-cuela, los TDAs Curso, Estudiante, Nota, Lista, etc., van a permitir expresar la solucin decualquier problema planteado, independientemente del lenguaje de programacin con el cual seimplementarn.

    2.2.1 Especificacin de un TDA

    El diseo de un TDA puede ser especficado utilizando ya sea un enfoque informal, como unenfoque formal.

    Especificacin informal: Describe en lenguaje natural todos los datos y sus operaciones, sinaplicar conceptos matemticos complicados para las persona que no estn familiarizados con losTADs, de manera, que todas las personas que no conocen a fondo las estructura de los TADs, lopuedan entender de manera sencilla y que esas mismas personas puedan explicarlo de la mismamanera natural , a todos con la misma facilidad con la que ellos lo entendieron.

    Podemos representar de manera informal un TAD de la siguiente manera :

    Nombre del TDAValores: Descripcin de los posibles valores que definirn al TDA .Operaciones: descripcion de cada operacion.

    Comenzamos escribiendo el nombre del TAD, luego describimos los posibles valores de estetipo de dato de manera abstracta, sin tener que pensar en la realizacion concreta y por ultimosdescribiremos cada una de las operaciones creadas para el TAD

    A continuacin, definiremos de manera informal un TDA sencillo.

    Ejemplo: Especificar de manera informal un TDA Vector.

    //nombre del TDAVector//ValoresConjunto de elementos todos del mismo tipo.//OperacionesCrear VectorAsignar un elemento al Vector .Obtener nmero de elementos del Vector .

    Especificacin Formal: Una de las ventajas de especificar formalmente el diseo de un TDA esque permite la posibilidad de simular especificaciones a travs de la definicin de precondicionesy postcondiciones para las operaciones de los TDAs

    Tipos: nombre de los tipos de datos.Sintaxis: Forma de las operaciones.Semntica: Significado de las operaciones.

  • 2.2 Tipos de Datos Abstractos 17

    La sintaxis proporciona el tipo de dato de entrada como los tipos de datos de salida de lasoperaciones creadas , mientras que la semntica nos dice el comportamiento de las operacionescreadas en el TDA.

    TAD

    ...: < dominio >

    /*Explicacin de la operacin*/{ precondicion : . . . . } /* condicin logica */{ post condicion: . . . } /*condicin logica */

    La precondicin y las postcondicin mencionadas anteriormente se refieren a los elementosque componen los objetos abstractos y a los argumentos que recibe . En la especificacin se debeconsiderar implcito en la precondicin y la postcondicin ,que el objeto abstracto sobre el cualse va a operar deba cumplir con el invariante .

    Es importante elaborar una breve descripcin de cada operacin que se crea,de maneraque el usuario del TDA pueda darse una rpida idea de las cosas que puede realizar el TDA,sin necesidad de entrar a un anlisis detallado, por lo cual esto va dirigido en especial a losprogramadores.

    Ejemplo: Tomaremos el ejemplo anterior para la creacin del TAD de manera formal:

    /*Objeto abstracto de vector */TAD Vector[ T ] /* nombre del vector , donde T puede ser cualquier tipo de dato*/{ invariante: n>0 }-

    /*Crea y retorna un vector de dimensin [ 0...fil-1, 0 ] inicializada en 0 */Vector crearVector( int fil , int col , int valor ){ pre : 0 fil = 0 col< N}{ post : crearVector es un vector de dimensin [ 0...fil-1 ], xik = 0 }/* Asigna a la casilla de coordenadas [ fil, col ] el valor val */void asignarValorACasilaVector(Vector v,int){ pre: 0 fil =, 0 col < N }{ post: X fil, col = val }-

    /* Retorna el contenido de la casilla de coordenadas [ fil, col ] */int obtenerInfoVector( Vector v, int fil, int col ){ pre: 0 fil =0, col < N }

  • 18 Introduccin al Diseo y Anlisis de Algoritmos

    { post: infoMat = X fil, col }-

    /* Retorna el nmero de columnas del vector */int obtenerColumVect( Vector v ){ post: colum_Vect = N }-

    2.2.2 Tipos de Operaciones de los TDAs

    Las operaciones de un TDA se clasifican en 3 grupos, segn su funcin sobre el objetoabstracto:

    Constructora: es la operacin encargada de crear elementos del TDA. En el caso tpico, es laencargada de crear el objeto abstracto ms simple. Tiene la siguiente estructura:

    Clase ( ){ pre: }{ post: }

    En el ejemplo anterior crearVector la operacin constructora del TDA Vector, pero un vec-tor puede tener varias operaciones constructoras.

    Modificadora: esta operacin que puede alterar el estado de un elemento del TDA. Su misines simular una reaccin del objeto.

    void ( , ){ pre: }{ post: }

    En el ejemplo anterior del TDA Vector creado anteriormente, la operacin modificadora esasignarValorACasilaVector,que altera el contenido de una casilla del vector.

    Analizadora: es una operacin que no altera el estado del objeto, sino que tiene como misinconsultar su estado y retornar algn tipo deinformacin.

    ( , ){ pre: }{ post: = funcin ( ) }

    Existen otro tipos de operaciones que podemos agregar a un TDA como lo son :

    Comparacin: Es una analizadora que permite hacer calculable la nocin de igualdad en-tre dos objetos del TDA.Copia: Es una modificadora que permite alterar el estado de un objeto del TDA copiandolo apartir de otro.Destruccin: Es una modificadora que se encarga de retornar el espacio de memoria dinmicaocupado por un objeto abstracto. Despus de su ejecucin el objeto abstracto deja de existir,y cualquier operacin que se aplique sobre l va a generar un error. Slo se debe llamar esta

  • 2.2 Tipos de Datos Abstractos 19

    operacin, cuando un objeto temporal del programa ha dejado de utilizarse.Salida a pantalla: Es una analizadora que le permite al cliente visualizar el estado de un ele-mento del TDA. Esta operacin, que parece ms asociada con la interfaz que con el modelo delmundo, puede resultar una excelente herramienta de depuracin en la etapa de pruebas del TDA.Persistencia: Son operaciones que permiten salvar/leer el estado de un objeto abstracto de algnmedio de almacenamiento en memoria secundaria. Esto permite a los elementos de un TDAsobrevivir a la ejecucin del programa que los utiliza.

    2.2.3 Ejemplo de un TAD

    Crear el TDA RACIONAL, que corresponde al concepto matemtico de un nmero racional.Un nmero racional es aquel que puede expresarse como el cociente de dos nmeros enteros. Sedefinen que las operaciones disponibles para este TDA sern: la creacin de un nmero racionala partir de dos enteros, la adicin, la multiplicacin, una prueba de igualdad y la impresin de unnmero racional en pantalla. A continuacin el TDA especificado de manera semi formal:

    abstract typedef RACIONAL;condition RACIONAL[1]!=0;

    /* definicin del operador */abstract RACIONAL crearRacional(a,b)int a,b;precondition b!=0;postcondition crearRacional[0]==a;

    crearRacional[1]==b;

    /* a+ b */abstract RACIONAL sumar(a,b)RACIONAL a,b;postcondition sumar[1]==a[1]*b[1];

    sumar[0]==a[0]*b[1]+b[0]*a[1];

    /* a*b */abstract RACIONAL multiplicar(a,b)RACIONAL a,b;postcondition multiplicar[0]==a[0]*b[0];multiplicar[1]==a[1]*b[1];

    /* a==b */abstract sonIguales(a,b)RACIONAL a,b;postcondition sonIguales ==(a[0]*b[1]==b[0]*a[1]);

    /* imprimir(a) */abstract imprimirRacional(a)RACIONAL a,b;

  • 20 Introduccin al Diseo y Anlisis de Algoritmos

    2.2.3.1 Uso del TDAUna vez que se cuenta con una definicin clara del TDA, se pueden disear soluciones que

    lo utilicen. En el caso del TDA Racional, por ejemplo, podra querer resolverse el siguienteproblema:

    Escriba un programa que reciba 10 nmeros racionales por teclado y que muestre en pan-talla el resultado de su suma.

    Un ejemplo del diseo de una solucin a este problema, utilizando la definicin dada y pseu-docodigo sera:

    Programa: Suma de 10 nmeros racionalesEntorno: Enteros n,d,iRacional A, rSumaAlgoritmo:i = 0rSuma = crearRacional(0,1)mientras (i < 10)

    escribir Introduzca el numerador y el denominador del Racional # + ileer n, dA = crearRacional(n,d)rSuma = sumar(rSuma,A)i = i+1

    finmientrasescribir El resultado de la suma es imprimirRacional(rSuma)

    FinprogramaNtese que, por los principios de abstraccin y encapsulamiento, en toda la solucin, el

    usuario jams se deber preocupar por lo que encierra el TDA, por como se manipulan elnumerador y denominador para realizar la suma de dos racionales, o para imprimir un racional.

    2.2.3.2 ImplementacinLa implementacin de un TDA en un lenguaje de programacin se realiza en base a la

    definicin del mismo. Durante la implementacin, el programador s se enfoca en los detalles decomo se manipulan los datos para realizar las operaciones necesarias. En esta fase, el programadortendr acceso a todos los datos del TDA de forma irrestricta.

    En este libro, se procuraran dar ejemplos de implementacin tanto en lenguaje C como enJava:

    /***************** MODULO DE INTERFAZ ************************************/#ifndef _racional_H#define _racional_H

    typedef struct Racional{int numerador, denominador;

    }Racional;Racional * racionalCrear(int n, int d);Racional *racionalSumar(Racional *a, Racional *b);Racional *racionalMultiplicar(Racional *a, Racional *b);int sonIguales(Racional *a, Racional *b);

  • 2.2 Tipos de Datos Abstractos 21

    void racionalImprimir(Racional *a, Racional *b);#endif /* _racional_H */

    /***************** MODULO DE IMPLEMENTACION ******************************/#include #include racional.h

    Racional * racionalCrear(int n, int d){Racional *nuevo = NULL;if(d != 0){

    nuevo = (Racional *)malloc(sizeof(Racional));nuevo->numerador = n;nuevo->denominador = d;

    }return nuevo;

    }Racional *racionalSumar(Racional *a, Racional *b){

    int nr, dr;Racional *r;nr = a->numerador*b->denominador + b->numerador*a->denominador;dr = a->denominador * b->denominador;r = racionalCrear(nr, dr);return r;

    }Racional *racionalMultiplicar(Racional *a, Racional *b){

    int nr, dr;Racional *r;nr = a->numerador*b->numerador;dr = a->denominador * b->denominador;r = racionalCrear(nr, dr);return r;

    }int sonIguales(Racional *a, Racional *b){

    return (a->numerador*b->denominador==b->numerador*a->denominador);}void racionalImprimir(Racional *a){

    printf(%d/%d\n, a->numerador, a->denominador);}

    /***************** MODULO DE USO ************************************/#include #include racional.h

    void main(){Racional *A, *rsuma;int i=0, d, n;rsuma = racionalCrear(0,1);while(i

  • 22 Introduccin al Diseo y Anlisis de Algoritmos

    scanf(%d%d, &n, &d);A = racionalCrear(n,d);rsuma = racionalSumar(rsuma, A);i++;

    }printf(El resultado de la suma es:);racionalImprimir(rsuma);

    }

    2.2.4 Ejercicios Propuestos1. Crear un TDA Raiz en el que se creen la operaciones necesarias para ver si el elemento

    ingresado es vlido o no.2. Crear un TAD Logaritmo en el cual se le hagan todas las operaciones necesarias para su

    desarrollo.3. Crear un TAD Clnica, en el se informe informe de una pequea lista de pacientes ,en que

    veamos su informacin ,su prioridad de atencin y su orden de salida.4. Crea un TAD alcanca ,en el que se informe cuanto billetes y monedas hay en la alcanca,

    ingresar una nueva moneda y un nuevo billete ,decir el mayor valor de las monedas y e losbilletes ingresados.

    5. Crear un TAD garaje en el cual se digan el numero de auto ingresados y el de salida,saberla hora de ingreso y cuanto es la tarifa ms alta pagar.

    6. En una heladera se ofrecen conos con bolas de 25 gramos de 3 sabores distintos a escogerentre chocolate, vainilla, fresa y limn. El congelador de helados almacena una cubeta porcada sabor, cada cubeta con su cantidad de helado disponible. Al congelador se le puede:Aumentar una cantidad de helado de un determinado sabor, consultar es alcanza heladopara crear un cono dados tres sabores disponibles, consultar las combinaciones de bolasde helado disponibles para crear conos. Cree un TDA para representar un congelador dehelados e implemente los metodos indicados

    7. Crear un TDA Binario que represente un numero binario. El TDA debe disponer de lassiguientes operaciones:

    a) Sumar dos numeros binariosb) Convertir un numero binario a un numero decimalc) Convertir un numero entero a un numero binario

    8. Crear un TDA Fecha compuesta de dia mes y ao, y defina las siguientes operacionesa) Sumar un dia a una fechab) Restar dos fechas

    9. Crear un TDA EnteroGrande que represente un numero entero de hasta 100 digitos. Proveaal mismo de las siguientes operaciones:

    a) Suma de dos enteros grandesb) Conversion de un entero normal en un entero grandec) Conversion de un entero grande si es posible a un entero normal

    10. Crear un TDA CajaRegistradora que tiene 6 contenedores, uno para cada denominacion: 5,10, 20, 50, 100, 200. Una caja permite

    a) Cargar, lo cual incrementa un contenedor con la cantidad de billetes indicadab) DarVuelto que dada una cantidad multiplo de 5 e inferior de 500, devuelve el numero

    de billetes de cada tipo que la satisface utilizando lso billetes de mayor valor siempreque haya disponibles en el cajero

    c) EstadoySaldo que devuelve el saldo total del cajero y la disponibilidad de cada tipode billete

  • 2.3 Clasificacin de los Tipos de Datos 23

    2.3 Clasificacin de los Tipos de Datos

    Podemos clasificar los tipos de datos tanto desde el punto de vista funcional del usuariocomo desde el punto de vista de las estructuras de datos que se usan para su implementacin.Ahora, la primera clasificacin estara basada en tipos de datos y no en tipos de datos abstractos,debido a que realmente la percepcin de abstraccin depende del punto de vista de quien useel tipo de dato. Por ejemplo, incluso el tipo de dato entero puede ser representado de formaabstracta: sus valores estn definidos por la definicin matemtica de los nmeros enteros y entresus operaciones se encuentran la suma, resta, multiplicacin, etc.

    2.3.1 Clasificacin desde el punto de vista funcionalDale y Walker (1990) explican que desde el punto de vista del usuario, lo nico relevante es

    como interactuar con el tipo de dato para obtener el resultado esperado y proponen la siguienteclasificacin desde este punto de vista:

    Tipos de Datos: Escalares y CompuestosLos escalares se refieren a tipos de datos bsicos que describen un nico valor con operaciones

    que tpicamente permiten combinar dos valores y generar un tercero, o modificar el valor quealmacenan con otro nuevo valor. Los tipos de datos compuestos se refieren a aquellos quedescriben varios valores como una unidad, y cuyas operaciones usualmente permiten almacenarun valor en el grupo de valores que componen variables de estos tipos, recuperar valores delconjunto o eliminar valores del conjunto.

    Escalares: Ordinales y ContinuosLos tipos de datos ordinales se refieren a una representacin de los valores como entidades

    discretas, separadas, como por ejemplo, los nmeros enteros. Usualmente los valores en estostipos de datos guardan un orden, y las operaciones suelen aprovechar esto permitiendo consultarel valor anterior o el sucesor del actual, as como operaciones relacioanles como >, >=, etc.

  • 24 Introduccin al Diseo y Anlisis de Algoritmos

    As mismo, como la mayora de los tipos de datos ordinales describen valores numricos, lasoperaciones ms comunes son la suma, resta, multiplicacin y divisin.

    Por otro lado, los tipos de datos continuos representan valores que son parte de una regincontinua de una linea, plano o espacio. Una vez ms, usualmente estos tipos de datos describennmeros, pero como son valores continuos, no permiten operaciones para conocer antecesor osucedor de un valor dado. Ms bien, permiten operaciones aritmticas como suma, multiplicaciny divisin. En el caso de que los valores que se representan guarden un orden entre s, se permitentambin operaciones relacionales.

    Compuestos: No Estructurados, Estructurados y Semi-estructuradosDado que los tipos de datos compuestos representan varios valores como un solo todo,

    estos siempren dependen de operaciones que permitan el almacenamiento de nuevos valores,recuperacin de valores existentes y eliminacin de valores del conjunto.

    En ocasiones, ser requerido que los valores que se almacenan como uno solo, manejenuna cierta estructura: que se almacenen en un cierto orden, que se encuentren indexados, o queguarden cierta relacin entre ellos. En ese caso, a estos tipos de datos compuestos se les conocecomo estructurados.

    Cuando no se requiere que se guarde ninguna relacin entre los valores que conforman eltodo, se los conoce como tipos de datos copuestos sin estructura. Un ejemplo son los conjuntos,donde no importa en que orden sean almacenados los datos cuando se agregan al conjunto y lasoperaciones son orientadas al almacenamiento, recuperacin, eliminacin o determinacin depresencia de los valores del conjunto.

    En un invel intermedio, algunos tipos de datos compuestos restrigen el orden en que losdatos son almacenados o pueden ser consultados. Estos tipos de datos se conocen como semi-estructurados. Un ejemplo es la Pila, donde, al agregar un elemento, este debe ir al final delconjunto, y al consultar un elemento, el nico en capacidad de ser consultado es el ltimoelemento que se agreg.

    Compuestos/Estructuados: Sin Dimensiones, Lineares y Multi-DimensionalesLa clasificacin de los tipos de datos estructurados se basa en el tipo de conexin o estructura

    que relacion a los valores del conjunto. En los tipos de datos sin dimension, se requiere queconexin entre varios pares de elementos del conjunto se indique ya sea de forma explicitao de forma implicita. Por ejemplo, para los rboles, se indica que la relacin entre un valory otro es de tipo jerarquica y esto implicitamente indica como ser la conexi entre un parde elementos; en un grafo todas las relaciones entre los pares de elementos del conjunto sonindicadas explicitamente a travs de los arcos que los unen.

  • 2.3 Clasificacin de los Tipos de Datos 25

    Fuente: http://decsai.ugr.es/~jfv/ed1/c++/cdrom5/ejercicios/ej_grafos.htm

    Las operaciones para los tipos de datos sin dimension incluyen almacenamiento, recuperacin,eliminacin de elementos, as como especificacin de la conexin entre elementos y formas derecorrer el conjunto (pasar de un elemento a otro).

    Cuando la estructura se impone en base a uno o ms valores que permiten indexar unelemento, o en base a un orden natural (puede ser de llegada o orden numrico, etc) de loselementos, el tipo de dato estructurado puede ser lineal o multilineal. Una estructura basadaen un valor para indexar un elemento o en el ordenamiento de los elementos, se conoce comolineal. Por ejemplo, un arreglo de una sola dimensin es una estructura lineal. Una estructuramulti-dimensional se basa en dos o mas valores para indexar un elemento del conjunto. Unejemplo de esto son los arreglos multidimensionales. Las operaciones para los tipos de datosmulti-dimensionales usualmente son de almacenamiento y recuperacin de elementos.

  • 26 Introduccin al Diseo y Anlisis de Algoritmos

    Compuestos/Estructurados/Lineales: No indexados e indexadosEn un tipo de dato lineal indexado, el orden de los elementos es especficado por una variable

    que sirve para referirse a un elemento dado. Un ejemplo de esto es el arreglo multidimensionalde dos dimensiones, donde se usan 2 indices para referirse al elemento: uno para la fila y otropara la columna.

    En un tipo de dato lineal no indexado no se necesita una variable que se permita referise aun elemento dado, el ordenamiento de los datos puede darse ya sea por el orden en que fueronalmacenados o por un orden numrico, etc.). Un ejemplo de esto es el tipo de dato Lista, dondelos datos son almacenados uno detrs de otro. Operaciones tpicas en estos tipos de datos sonde almacenamiento, eliminacin, recuperacin del primer elemento, recuperacin del ltimoelemento, recorrido de elementos, etc.

    Compuestos/Estructurados/Lineales/No indexados: Homognos y No HomogneosUn tipo de dato no indexado contiene datos que se encuentran en orden, ya sea impuesto

    por el programador o implicitamente debido a la estructura de conexin de los elementos (Porejemplo, orden de llegada). Tomando esto en cuenta, los tipos de datos no indexados puedenser utilizados para almacenar elementos del diferentes tipos de datos, cuyo caso se los conocecomo tipos de datos no homogneos. Las operaciones de estos tipos de datos no podran permitircomparacin entre elementos, bsqueda ni recorrido. Estas acciones las debera llevar a cabo elusuario programador que conozca los tipos de datos almacenados en la estructura. Operacionesque usualmente se dan en estos tipos de datos son de almacenamiento, eliminacin, recuperacindel primero, recuperacin del siguiente elemento a un elemento dado, y la recuperacin del tipode dato de un elemento dado.

    Por otro lado, un tipo de dato que almacene elementos todos del mismo tipo se conoce comoHomogneo.

    Compuestos/Estructurados/Lineales/No Indexados/Homogneos: Sin Ordenar y Orde-nados

    Los tipos de datos homogneos almacenan varios elementos y estos se encuentran en unorden lineal. El ordenamiento puede ser inferido de los datos almacenados, en cuyo caso se hablade tipos de datos ordenados. Si, por otro lado, el ordenamiento se da por otros casos, como elorden de llegada, se dice habla de tipos de datos sin ordenar.

    En los tipos de datos sin ordenar, el usuario programador del TDA debe especificar donde enel orden lineal de la estructura, desea que se almacene un nuevo elemento. Por ejemplo, en una

  • 2.3 Clasificacin de los Tipos de Datos 27

    Lista, el usuario programador debe indicar si quiere que un nuevo elemento se almacene antesdel primer elemento, luego de un elemento ya existente o al final. Otras operaciones comunes enestos tipos de datos son la obtencin de la longitud de la lista, recuperacin del primero o delltimo de la lista, etc.

    2.3.2 Clasificacin desde el punto de vista de Estructuras de DatosUna clasificacin de los tipos de datos desde el punto de vista de las estructuras de datos que

    se usan para implementarlos, inica basndose en el lugar donde residen: Internas y externas. Siuna estructura de datos reside en la memoria central del computador se denomina estructura dedatos interna. Recprocamente, si reside en un soporte externo, se denomina estructura de datosexterna.

    Las estructuras de datos internas pueden ser de dos tipos:Estructuras de Datos Estticas.Estructuras de Datos Dinmicas.

    Estructuras de Datos EstticasTienen un nmero fijo de elementos que queda determinado desde la declaracin de la

    estructura en el comienzo del programa. Ejemplo los arreglos. Las estructuras de datos estticas,presentan dos inconvenientes:

    1. La reorganizacin de sus elementos, si sta implica mucho movimiento puede ser muycostosa. Ejemplo: insertar un dato en un arreglo ordenado.

    2. Son estructuras de datos estticas, es decir, el tamao ocupado en memoria es fijo, elarreglo podra llenarse y si se crea un arreglo de tamao grande se estara desperdiciandomemoria.

    Estructuras de Datos DinmicasLas estructuras de datos dinmicas nos permiten lograr un importante objetivo de la progra-

    macin orientada a objetos: la reutilizacin de objetos. Al contrario de un arreglo, que contieneespacio para almacenar un nmero fijo de elementos, una estructura dinmica de datos se amplay contrae durante la ejecucin del programa.

    A su vez, este tipo de estructuras se pueden dividir en dos grandes grupos segn la forma enla cual se ordenan sus elementos.

    LinealesNo lineales

    Estructuras de Datos LinealesEn este tipo de estructuras los elementos se encuentran ubicados secuencialmente. Al ser

    dinmica, su composicin vara a lo largo de la ejecucin del programa que lo utiliza a travs deoperaciones de insercin y eliminacin. Dependiendo del tipo de acceso a la secuencia, haremosla siguiente distincin:

    Listas: podemos acceder (insertar y eliminar) por cualquier lado.Pilas: slo tienen un nico punto de acceso fijo a travs del cual se aaden, se eliminan ose consultan elementos.Colas: tienen dos puntos de acceso, uno para aadir y el otro para consultar o eliminarelementos.

    Estructuras de Datos No LinealesDentro de las estructuras de datos no lineales tenemos los rboles y grafos. Este tipo de

    estructuras los datos no se encuentran ubicados secuencialmente. Permiten resolver problemascomputacionales complejos.

  • 28 Introduccin al Diseo y Anlisis de Algoritmos

    2.4 Anlisis de Algoritmos

    2.4.1 Los Algoritmos

    Una vez que tenemos un algoritmo que resuelve un problema y podemos decir que es dealguna manera correcto, un paso importante es tener idea de la cantidad de recursos, como tiempode procesador o espacio en la memoria principal que requerir.

    Los objetivos del anlisis de algoritmos son:Conocer los factores que influyen en la eficiencia de un algoritmo.Aprender a calcular el tiempo que emplea un algoritmo.Aprender a reducir el tiempo de ejecucin de un programa (por ejemplo, de das o aos afracciones de segundo).

    Factores que influyen en la eficiencia de un algoritmo

    Podemos tomar en cuenta muchos factores que sean externos al algoritmo como la computa-dora donde se ejecuta (hardware y software) o factores internos como la longitud de entrada delalgoritmo. Veamos algunos de estos factores.

    El Hardware. Por ejemplo: procesador, frecuencia de trabajo, memoria, discos, etc.El Software. Por ejemplo: sistema operativo, lenguaje de programacin, compilador, etc.La longitud de entrada. El enfoque matemtico considera el tiempo del algoritmo comouna funcin del tamao de entrada. Normalmente, se identifica la longitud de entrada(tamao de entrada), con el nmero de elementos lgicos contenidos en un ejemplar deentrada, por ejemplo: en un algoritmo que calcula el factorial de un nmero, la longitudde entrada sera el mismo nmero, porque no es lo mismo calcular el factorial de 4 quecalcular el factorial de 1000, las iteraciones que tenga que hacer el algoritmo dependerde la entrada. De igual manera se puede considerar como longitud de entrada: al tamaode un arreglo, el nmero de nodos de una lista enlazada, el nmero de registros de unarchivo o el nmero de elementos de una lista ordenada). A medida que crece el tamaode un ejemplar del programa, generalmente, crece el tiempo de ejecucin. Observandocmo vara el tiempo de ejecucin con el tamao de la entrada, se puede determinar latasa de crecimiento del algoritmo, expresado normalmente en trminos de n, donde nes una medida del tamao de la entrada. La tasa de crecimiento de un problema es unamedida importante de la eficiencia ya que predice cunto tiempo se requerir para entradasmuy grandes de un determinado problema. Para que un algoritmo sea eficiente, se debeoptimizar el tiempo de ejecucin y el espacio en la memoria, aunque se producir laoptimizacin de uno a costa del otro.

    2.4.2 Anlisis de Algoritmos

    El anlisis de algoritmo que hacemos toca nicamente el punto de vista temporal (tiempo deejecucin de un algoritmo) y utilizamos como herramienta el lenguaje de programacin Java.

    Es difcil realizar un anlisis simple de un algoritmo que determine la cantidad exacta detiempo requerida para ejecutarlo. La primera complicacin es que la cantidad exacta de tiempodepender de la implementacin del algoritmo y de la mquina real en que se ejecuta. El anlisisnormalmente debe ser independiente de la computadora (hardware y software) y del lenguajeo mquina que se utilice para implementar el algoritmo. La tarea de calcular el tiempo exactorequerido suele ser bastante pesado.

    Un algoritmo es un conjunto de instrucciones ordenados de manera lgica que resuelven unproblema. Estas instrucciones a su vez pueden ser: enunciados simples (sentencias) o enunciadoscompuestos (estructuras de control). El tiempo de ejecucin depender de como est organizadoese conjunto de instrucciones, pero nunca ser constante.

  • 2.4 Anlisis de Algoritmos 29

    Es conveniente utilizar una funcin T(n) para representar el nmero de unidades de tiempo(o tiempo de ejecucin del algoritmo) tomadas por un algoritmo de cualquier entrada de tamaon. La evaluacin se podr hacer desde diferentes puntos de vista:

    Peor caso. Se puede hablar de T(n) como el tiempo para el peor caso. Se trata de aquellosejemplares del problema en los que el algoritmo es menos eficiente (no siempre existe elcaso peor). Ejemplos: insertar al final de una lista, ordenar un vector que est ordenado enorden inverso, etc. Nos interesa mucho.Mejor caso. Se habla de T(n) como el tiempo para el mejor caso. Se trata de aquellosejemplares del problema en los que el algoritmo es ms eficiente; por ejemplo: insertar enuna lista vaca, ordenar un vector que ya est ordenado, etc. Generalmente no nos interesa.Caso medio. Se puede computar T(n) como el tiempo medio de ejecucin del programasobre todas las posibles ejecuciones de entradas de tamao n. El tiempo de ejecucin medioes aveces una medida ms realista del rendimiento en la prctica, pero es, normalmente,mucho ms difcil de calcular que el tiempo de ejecucin en el pero caso, ya que requieredefinir una distribucin de probabilidades de todo el conjunto de datos de entrada, el cultpicamente es una tarea difcil.

    2.4.3 Funcin de ComplejidadDefinicin

    La funcin de complejidad de un algoritmo es el nmero de operaciones elementales queutiliza un algoritmo cualquiera para resolver un problema de tamao n. Matemticamente sedefine la Funcin de complejidad asi:

    Sea A un algoritmo, la funcin de complejidad del algoritmo A T(n) se define como el nmeromximo de operaciones elementales que utiliza el algoritmo para resolver un problema de tamaon.

    T(n) = Max {nx: nx es el nmero de operaciones que utiliza A para resolver una instanciax de tamao n}

    Nota: Una operacin elemental es cualquier operacin cuyo tiempo de ejecucin es acota-do por una constante (que tenga tiempo constante). Por ejemplo: una operacin lgica, unaoperacin aritmtica, una asignacin, la invocacin a un mtodo.

    2.4.4 Operaciones elementales

    Que es una operacin elemental? Una operacin elemental, tambin llamado operador bsicoes cualquier operacin cuyo tiempo de ejecucin es constante, es decir, es una operacin cuyotiempo de ejecucin siempre va a ser el mismo.

    Tipos de Operaciones Elementales

    Operacin Lgica: Son operaciones del tipo a > b, o por ejemplo los indicadores que sesuelen utilizar en los condicionales que si se cumpla esta condicin o esta otra haga esto.Ese o es una operacin lgica.Operacion Aritmetica: Son operaciones del tipo a + b, o a / b, etc.Asignacin: Es cuando asignamos a una variable un valor, ejemplo: int a = 20+30, el igual(=) en este caso es la operacin de asignacin.Invocacin a un Mtodo: Como su nombre lo dice es cuando llamamos, cuando invocamos

  • 30 Introduccin al Diseo y Anlisis de Algoritmos

    a un mtodo.

    Clculo del T(n)

    Para hallar la funcin de complejidad (t(n)) de un algoritmo se puede evaluar el algoritmosdesde tres puntos de vista:

    Peor Caso: Se puede hablar de T(n) como el tiempo de ejecucin para el peor de los casos,en aquellos ejemplares del problema en el que el algoritmo es Menos Eficiente.Caso Medio: Se puede comportar el T(n) como el tiempo medio de ejecucin del programasobre todas las posibles ejecuciones de entrada de tamao n. Es una medida ms realistadel rendimiento del algoritmo en la prctica, pero es mucho ms difcil del clculo, ya querequiere una distribucion de probabilidades de todo el conjunto de entrada lo cual es unatarea difcil.Mejor Caso: Se puede hablar de T(n) como el tiempo de ejecucin para el mejor de loscasos, en aquellos ejemplares del problema en el que el algoritmo es Ms Eficiente.

    Lo ideal sera poder evaluar el algoritmo en el caso promedio, pero por el nivel de operacionesy dificultad que conlleva este, el estudio de la complejidad de los algoritmos se evala en el peorde los casos.

    Para calcular el T(n), se deben calcular el nmero de operaciones elementales de un algoritmo,las cuales estan dadas por: Sentencias consecutivas, condicionales y ciclos.

    Calcular T(n) para Sentencias Consecutivas

    Las sentencias consecutivas como su nombre lo dicen son aquellas que tienen una secuencia,que van una detrs de otra, y se derivan en dos casos:

    1. Si se tiene una serie de instrucciones consecutivas:

    Sentencia 1 n1 operaciones elementalesSentencia 2 n2 operaciones elementales

    .

    .

    .Sentencia k nk operaciones elementales

    k

    i=1

    ni = n1+n2 +nk

    2. Procedimientos:Procedimiento 1 f1(n)Procedimiento 2 f2(n)

    .

    .

    .Procedimiento k fk(n)

    n

    i=1

    f (i)

  • 2.4 Anlisis de Algoritmos 31

    2.4.5 Calcular T(n) para Ciclos

    Para hallar la complejidad computacional de un ciclo existen, los siguientes casos:

    Caso A: Cuando los incrementos o decrementos son de uno en uno y son constantes.

    El ciclo While o Mientras es el bsico, a partir de l se analizan los dems ciclos.

    Codigo base:

    i 1mientras i 12 i = 1 - > 13 Mientras (i nc = 14 A = A + i > 25 i = i + 1 > 2 np = (2+2) = 46 imprima A - > 1

    La complejidad se analiza por lineas, de la siguiente forma:

    Lineas Complejidad

    de 2 a 5 1 + ( n + 1 ) * nc + (n * np) 1 + ( n + 1 ) * 1 + (n * 4)1 + n + 1 + 4n5n + 2

    de 1 a 6 5n + 2 + 2

    Finalmente:

    T(n) = 5n + 4

  • 32 Introduccin al Diseo y Anlisis de Algoritmos

    Ejemplo: Hallar la funcin de complejidad del siguiente algoritmo.lineas Cdigo # De Operaciones

    1 x = 1 > 12 i = 1 -> 13 Mientras (i nc = 14 x = x * i -> 25 i = i + 1 > 2 np = (2+2) = 46 Si (x > 100) entonces > nc = 17 x = 100 > 18 imprima x > 1

    Lineas Complejidad

    de 2 a 5 1 + (n+1)nc + n * np1 + (n+1)1 + n * 41 + n + 1 + 4n5n + 2

    de 6 a 7 nc + max1 + 12

    de 1 a 8 (5n + 2) + (2) + 1 + 15n + 6

    Finalmente:

    T(n) = 5n + 6

    Ciclo For o Para:

    Codigo base:

    Para (i1 ; i

  • 2.4 Anlisis de Algoritmos 33

    Ejemplo: Hallar la funcin de complejidad del siguiente algoritmo.

    lineas Cdigo # De Operaciones

    1 f = 0 > 12 Para (i = 1 ; i nc = 13 f = f * i > 2 operaciones > np = 24 imprima f -> 1

    Lineas Complejidad

    de 2 a 3 1 + (n+1)nc + n(np + 1)1 + (n+1)1 + n(2 + 1)1 + n + 1 + n(3)1 + n + 1 + 3n4n + 2

    de 1 a 4 (4n + 2) + 24n + 4

    Finalmente:

    T(n) = 4n + 4

    Ejemplo:

    NOTA PARA TENER EN CUENTA:

    Para ciclos ya sean MIENTRAS(while) O PARA(for), observamos que cada ciclo tiene unlmite superior que define hasta donde va a iterar(repetir) ya sea definido estrictamente menor(

  • 34 Introduccin al Diseo y Anlisis de Algoritmos

    Para comprobar lo dicho en este caso, entonces usamos la frmula:

    n = Ls - Li + 1n = (n-1) - (1) + 1n = n-1

    En conclusin, como n = n-1 ; el nmero total de veces que se ingresa al ciclo es (n-1) ve-ces; en consecuencia reemplazamos el valor de n que es (n-1) en la complejidad.

    lineas Cdigo # De Operaciones1 f = 1 > 12 Para (i = 1 ; i < n ; i++) > nc = 13 f = f * i > 2 operaciones > np = 24 imprima f -> 1

    Lineas Complejidad

    de 2 a 3 1 + (n+1)nc + n(np + 1) como n=(n-1) entonces1 + ((n-1)+1)(1) + (n-1)(2 + 1)1 + n + (n-1)(3)1 + n + (3n - 3)1 + n + 3n - 34n - 2

    de 1 a 4 (4n - 2) + 24n

    FInalmente:

    T(n) = 4n

    Caso B: Cuando los incrementos o decrementos dependen del valor que tome i.

    While o Mientras:Codigo base:

    i 1mientras i

  • 2.4 Anlisis de Algoritmos 35

    For o ParaCodigo base:

    Para (i1 ; i 12 Para (i = 1 ; i nc = 13 Para (j = 1 ; j nc = 14 s = s + 1 -> 2 operaciones > np = 25 imprima f > 1Lineas Complejidad

    de 3 a 4 1+(n+1)nc+n(np+1) CasoA n = i1+(i+1)1+ i(2+1)1+ i+1+ i(3)1+ i+1+3i4i+2> f (i)

    de 2 a 4 1+(n+1)nc+n+n

    i=1

    f (i)

    1+(n+1)nc+n+n

    i=1

    4i+2

    2n+2+n

    i=1

    4i+n

    i=1

    2

    2n+2+4n

    i=1

    i+2n

    i=1

    1

    2n+2+4(

    n(n+1)

    2

    )+2n

    4n+2+(2n2)+2n(2n2)+6n+2

    de 1 a 5 (2n2)+6n+2+2(2n2)+6n+4

  • 36 Introduccin al Diseo y Anlisis de Algoritmos

    En conclusin:

    T (n) = 2n2 +6n+4

    CASO C: Cuando no sabemos cunto va a ser el incremento o decremento del proceso.

    Cdigo base:

    mientras HagaProceso

    # De Operaciones (Formula) = (nr + 1) * nc + (nr * np)

    siendo:

    nc: Nmero de operaciones de la condicin del ciclo.np: Nmero de operaciones del ciclo.nr: Nmero de veces que se repite el proceso, en s es una frmula que cumple las veces que seejecuta el proceso para todo nmero n.

    Funcin Piso / Techo

    Sabemos claramente que (5/4) es igual a 1.25

    Funcin piso es aproximar el fraccionario a su ms cercano valor entero menor o igual al, un ejemplo sera:

    Funcin piso:5

    4

    = sera 1

    ahora bien si tomamos el mismo fraccionario y hallamos funcin techo sera aproximarlo a sums cercano valor mayor o igual a l, un ejemplo sera:

    Funcin Techo:5

    4

    = sera 2

    NOTA: Si tenemos un entero la funcin piso y techo es el mismo entero

    Como hallar el nr?

    Para permitirnos calcular t(n) o funcin de complejidad con un incremento no lineal serincierto saber cual es el nmero de veces que va a iterar el ciclo ya sea while o un for

    Cuando un incremento por lo general no en todas las ocasiones sean de suma de 2 (conta-dor=contador+2) dentro del ciclo, el contador ir sumando de 2 en 2; el nr podra ser un frac-cionario con numerador siempre n y denominador la constante que se est sumando en este caso 2.

  • 2.4 Anlisis de Algoritmos 37

    Ejemplo: Hallar la funcin de complejidad del siguiente algoritmolineas Cdigo # De Operaciones

    1 t = 0 -> 12 i = 1 -> 13 Mientras (i nc = 14 t = t + 1> 25 i = i + 2 > 2

    np = (2 + 2) = 46 imprima t > 1

    Estudio para hallar nr se debe analizar la cantidad de veces que itera el bucle para cada valor den:

    Para para hallar nr se debe analizar la cantidad de veces que itera el bucle para cada valor de n.En este caso es clave observar que la variable controladora del ciclo es i, y tiene incrementos de2 en 2, por lo tanto,

    nr =dne2

    Por tanto, la complejidad del algoritmo se calcula as:Lineas Complejidad

    de 3 a 5 (nr+1)nc+nr (np)(dne2

    +1) (1)+

    (dne2

    ) (4)

    d5ne2

    +1

    de 1 a 6d5ne

    2+1+3

  • 38 Introduccin al Diseo y Anlisis de Algoritmos

    Finalmente,

    T (n) =d5ne

    2+4

    Ejemplo:lineas Cdigo # De Operaciones

    1 t = 0 -> 12 i = 1 -> 13 Mientras (i nc = 14 t = t + 1> 25 i = i * 2 > 2

    np = (2 + 2) = 46 imprima t > 1

    En este caso el ciclo mientras tiene incrementos en base 2 (i = i*2), por lo tanto nr es unaexpresin logartmica dada por la formula:

    nr = blog2(n)c+1

    Por tanto, la complejidad del algoritmo se calcula as:Lineas Complejidad

    de 3 a 5 (nr+1)nc+nr (np)((blog2(n)c+1)+1) (1)+(blog2(n)c+1)(4)

    Simplificando la expresin,5blog2(n)c+6

    de 1 a 6 (5blog2(n)c+6)+3

    Finalmente,

    5blog2(n)c+9

    2.4.6 Orden de Magnitud (Notacin O Grande)Cuando se trata de algoritmos, el clculo detallado del tiempo de ejecucin de todas las

    operaciones primitivas llevara mucho tiempo. Adems, qu importancia tendra el nmero deinstrucciones primitivas ejecutadas por un algoritmo? Es ms til en el anlisis de algoritmos, verla velocidad de crecimiento del tiempo de ejecucin como una funcin del tamao de la entradan, en lugar de realizar clculos detallados. Es ms significativo saber que un algoritmo crece,por ejemplo, proporcionalmente a n, a razn de un factor constante pequeo que depende delhardware o software y puede variar en un cierto rango, dependiendo de una entrada n especfica.Esto lo que se conoce como orden de magnitud O(g(n)) o notacin asinttica o notacin Ogrande. El orden de magnitud se utiliza para comparar la eficiencia de los algoritmos.

  • 2.4 Anlisis de Algoritmos 39

    La notacin O grande es una tcnica utilizada para el anlisis de la complejidad computa-cional de un algoritmo, este anlisis se centra en el trmino dominante (El trmino que msaumenta), permitiendo as ignorar constantes y trminos de orden menor.

    Por ejemplo:

    Definicin conceptual del Orden de MagnitudSean f(n) y g(n) funciones definidas sobre enteros no negativos. Diremos que f(n) es O(g(n))

    si existe un nmero real constante c>0 y un entero constante n0>=1, tal que f(n)c*g(n) paratodo entero n>=n0.

    Por consiguiente, g(n) es un lmite superior para f(n), como se ilustra en la figura 2.4.6.

    El orden de magnitud es ampliamente utilizado para caracterizar los tiempos de ejecucin entrminos de la longitud de entrada n, el cual vara de problema en problema, pero es usualmenteuna nocin intuitiva del tamao del problema.

    Asimismo, el orden de magnitud nos permite ignorar factores constantes y trminos de ordenmenor y apuntar a los componentes principales de una funcin que influyen en su crecimiento.

    Cuando se dice que f(n) es del O(g(n)), se est garantizando que la funcin f(n) crece a unavelocidad no mayor que g(n); as g(n) es una cota superior de f(n).

    Propiedades del Orden de Magnitud1. O( f(x) ) + k = O( f(x) )2. O( k f(x) ) = O( f(x) )

  • 40 Introduccin al Diseo y Anlisis de Algoritmos

    3. O( f(x) ) * O( g(x) ) = O( f(x) * g(x) )O( f(x) ) + O( g(x) ) = max ( O( f(x) ), O( g(x) ) )

    2.4.7 Recursividad

    Def: Es una tcnica de programacin en la cual un mtodo puede llamarse a s mismo, en lamayora de casos un algoritmo iterativo es ms eficiente que uno recursivo si de recursos de lacomputadora se trata, pero un algoritmo recursivo en muchos casos permite realizar problemasmuy complejos de una manera ms sencilla.

    Reglas de la recursividad:

    Para que un problema pueda resolverse de forma recursiva debe cumplir las siguientes 3 reglas:

    Regla 1:Por lo menos debe tener un caso base y una parte recursiva.Regla 2:Toda parte recursiva debe tender a un caso base.Regla 3:El trabajo nunca se debe duplicar resolviendo el mismo ejemplar de un problema enllamadas recursivas separadas.

    Ejemplo: Calcular el factorial de un nmero.

    FACTORIAL DE UN NMERO N

    8! = 8 * 7!7! = 7 * 6!6! = 6 * 5!

    .

    .En general,n! = n * (n-1)!

    Veamos un caso particular, calculemos el factorial de 5 ( 5! ):

    factorial de 5 = 5 * 4! -> factorial de 5 es igual 5 multiplicado por factorial de 4factorial de 4 = 4 * 3! ->factorial de 4 es igual 4 multiplicado por factorial de 3factorial de 3 = 3 * 2!-> factorial de 3 es igual 3 multiplicado por factorial de 2factorial de 2 = 2 * 1!-> factorial de 2 es igual 2 multiplicado por factorial de 1factorial de 1 = 1 -> factorial de 1 es 1 > caso base

    Una implementacin en java seria:

    public long factorial (int n){

    if (n == 0 || n==1) //Caso Base

    return 1;

    else

    return n * factorial (n - 1); //Parte Recursiva}

  • 2.4 Anlisis de Algoritmos 41

    2.4.8 Complejidad de un Algoritmo RecursivoMtodo del rbol de recursin

    Existen varios mtodos para calcular la complejidad computacional de algoritmos recursivos.Uno de me los mtodos ms simples es el rbol de recursin, el cual esadecuado para visualizarque pasa cuando una recurrencia es desarrollada. Un rbol de recursin se tienen en cuenta lossiguientes elementos:

    Nodo: Costo de un solo subproblema en alguna parte de la invocacin recursiva.Costo por Nivel: La suma de los costos de los nodos de cada nivel.*Costo Total: Es la suma de todos los costos del rbol.

    Ejemplo. Utilizando el mtodo del rbol de recursin calcular la complejidad computacional delalgoritmo recursivo del factorial. Lo primero es calcular las operaciones elementales de cadalinea:

    public long factorial (int n){ #operaciones elementalesif (n == 0 || n==1) //Caso Base 3

    return 1; 1else

    return n * factorial (n - 1); //Parte Recursiva 4}

    Para hallar la complejidad se debe resolver esta recurrencia:

    T(n) = 7 + T (n - 1)

    El rbol de recursin es el siguiente.

    El costo total es la sumatoria de los costos de cada nivel:n

    i=1

    7 = 7n O(n) Orden lineal

    Ejemplo

  • 42 Introduccin al Diseo y Anlisis de Algoritmos

    Utilizando el mtodo del rbol de recursin, calcular la complejidad computacional de lasiguiente recurrencia:

    T(n) = 2 T(n/2) + n

    Para entender mejor el rbol de recursin anterior, ilustramos cmo sera cuando n = 8:

    Finalmente, la complejidad de la recurrencia est dada por la suma de los costos de cadanivel del rbol:

    Log2n+1

    i=1

    n = n+n+n+n = n log2(n+1) O(nLog2(n))

    Ejercicios Propuestos

    *Ejercicios Caso A.Calcular la funcin de complejidad T(n) de los siguientes algoritmos:1)c = 0i = 1Mientras (i

  • 2.4 Anlisis de Algoritmos 43

    c = c + 1i = i + 1

    imprima c2)a = 0i = 1Mientras (i

  • 44 Introduccin al Diseo y Anlisis de Algoritmos

    Para( k = 5; k

  • 2.5 Algoritmos de Bsqueda y Ordenamiento 45

    Mientras (i

  • 46 Introduccin al Diseo y Anlisis de Algoritmos

    distintos. Si existen elementos iguales, al realizar la bsqueda se localiza nicamente uno deellos, pudiendo dar lugar a errores al no contener la informacin correcta que se quera recuperar.

    Cada algoritmo de bsqueda procura localizar en un arreglo un elemento X. Una vezfinalizada la bsqueda puede suceder:

    Que la bsqueda haya tenido xito, habiendo localizado la posicin donde estaba almace-nado el elemento X.Que la bsqueda no haya tenido xito, concluyendo que no exista ningn elemento X.

    Despus de la bsqueda sin xito, a veces es interesante introducir el elemento X. Unalgoritmo con tal objetivo se denomina de bsqueda e insercin

    2.5.1.1. Bsqueda Secuencial

    La bsqueda secuencial o lineal, consiste en recorrer y examinar cada uno de los elementosdel arreglo, mediante un bucle voraz de izquierda a derecha, hasta encontrar el o los elementosbuscados, o hasta que se han evaluado todos los elementos del arreglo.

    El algoritmo implementado en java es el siguiente:

    public class Busqueda {/*** Busca secuencialmente un valor en el arreglo* ORDEN(N) EN EL PEOR CASO* @param valor* valor a buscar* @param arreglo* arreglo de datos en cualquier orden* @return true si lo encuentra, false si no encuentra el valor*/public boolean buscarSecuencial(int valor, int[] arreglo) {

    boolean encontrado = false;int i = 0;int n = arreglo.length;while (i < n && !encontrado) {

    if (arreglo[i] == valor)encontrado = true;

    else {i++;

    }return encontrado;

    }

    El programa principal que invoca este mtodo de bsqueda sera:

    public class ClienteMain { public static void main(String[] args) {Busqueda b = new Busqueda();int[] arreglo = { 1, 2, 3, 4, 5, 6, 8, 9 };System.out.println(b.secuencial(5, arreglo));

    }}

  • 2.5 Algoritmos de Bsqueda y Ordenamiento 47

    Complejidad computacional de la bsqueda secuencialEl mejor caso, se produce cuando el elemento a buscado sea el primero que se examina, de

    modo ques slo se necesita una comparacin. En el peor caso, el elemento deseado es el ltimoque se examina, de modo ques se necesitan ncomparaciones. En el caso medio, se encontrar elelemento deseado aproximadamente en el centro de la coleccin, haciendo n/2 comparacionesSu complejidad es:

    T (n) =n

    i=1

    1 = O(n)

    Concluimos entonces que:Para el mejor caso T(n) = O(1)Para el caso Promedio y Peor caso T(n) = O(n)

    2.5.1.2. Bsqueda BinariaSi los elementos sobre los que se realiza la bsqueda estn ordenados, entonces podemos

    utilizar un algoritmo de bsqueda mucho ms rpido que el secuencial: la bsqueda binaria.Consiste en reducir en cada paso el mbito de bsqueda a la mitad de los elementos, basndoseen comparar el elemento a buscar con el elemento que se encuentra en la mitad del intervalo ycon base en esta comparacin:

    Si el elemento buscado es menor que el elemento medio, entonces sabemos que el elemen-to est en la mitad inferior de la tabla.Si es mayor es porque el elemento est en la mitad superior.Si es igual se finaliza con xito la bsqueda ya que se ha encontrado el elemento.

    Si se vuelve a repetir el mismo proceso anterior con la parte del arreglo que no hemosdescartado, iremos avanzando rpidamente hacia el valor que queremos localizar.

    Puede darse el caso en el que el sub-arreglo a dividir est vaco y an no se a encontrado elelemento. Sobre entendemos que el valor buscado no existe en el arreglo.

    El algoritmo implementado en java es el siguiente:

    public class Busqueda {

    /*ORDEN (LOG N) EN EL PEOR CASO Y CASO MEDIO. ORDEN(1) EN EL MEJOR*CASO* @param valor* valor que estamos buscando* @param arreglo* arreglo ordenado de datos* @return true cuando lo encuentra, false cuando no encuentra el dato a* buscar*/

    public boolean binaria(int valor, int[] arreglo) {boolean encontrado = false;int inicio = 0;int fin = arreglo.length - 1;while (inicio

  • 48 Introduccin al Diseo y Anlisis de Algoritmos

    int medio = (inicio + fin) / 2;if (arreglo[medio] == valor) {encontrado = true;}else {if (arreglo[medio] > valor)fin = medio - 1;elseinicio = medio + 1;}}return encontrado;}

    El programa principal que invoca este mtodo de bsqueda sera:

    public class ClienteMain {public static void main(String[] args) {Busqueda b = new Busqueda();int[] arreglo = { 1, 2, 3, 4, 5, 6, 8, 9 };System.out.println(b.binaria(5, arreglo));}}

    Complejidad de la bsqueda binariaEl algoritmo determina en qu mitad est el elemento y descarta la otra mitad. En cada

    divisin, el algoritmo hace una comparacin. El nmero de comparaciones es igual al nmero deveces que el algoritmo divide el array por la mitad. Si se supone que n es aproximadamente iguala 2k entonces k k + 1 es el nmero de veces que n se puede dividir hasta tener un elementoencuadrado en (k = log2 n). Su funcin de complejidad es:

    T (n) =log(n)

    i=1

    1 = log2(n) O(log2(n))

    Por consiguiente el algoritmo es O(log2n) en el peor de los casos. En el caso medioO(log2(n)) en el caso medio y O(1) en el mejor de los casos.

    En general, este mtodo realiza log2(n) comparaciones antes de encontrar el elemento, oantes de descubrir que no est. Este nmero es muy inferior que el necesario para la bsquedalineal para casos grandes.

    Versin recursiva de la bsqueda binariaSu nica novedad es que despus de comparar el elemento de bsqueda con el elemento de

    la mitad de la tabla, se invoca recursivamente a realizar la bsqueda en uno de los dos posiblesintervalos, el inferior o el superior, finalizando en el momento en el que se encuentre el elementoo ya se tenga un nico elemento y no coincida con el buscado.

    public int BinariaRecursiva(int [] A, int X, int fin, int inicio){ int medio;

    if (inicio > fin) return -1;else{

  • 2.5 Algoritmos de Bsqueda y Ordenamiento 49

    medio = (inicio + fin) / 2;if (A[medio] > X)

    return BinariaRecursiva(A, X, medio+1, fin);else

    if (A[medio] > X)return BinariaRecursiva(A, X, inicio, medio -1);

    elsereturn medio;

    }}

    Complejidad de la bsqueda binaria recursivaPara medir la velocidad de clculo del algoritmo de bsqueda binaria, se debern obtener el

    nmero de comparaciones que realiza el algoritmo, es decir, el nmero de vueltas del ciclo oel nmero de recursiones. Aunque en principio puede parecer que ambas versiones invierten elmismo tiempo, la recursiva es ms lenta a medida que se incrementa el nmero de elementos,ya que existirn ms llamadas a la funcin por resolver, con el consiguiente gasto de tiempo deguardar y restaurar parmetros.

    En el mejor caso, la bsqueda binaria podra toparse con el elemento buscado en el primerpunto medio, requirindose slo una comparacin de elementos. Esto equivale al mejor casodurante una bsqueda secuencial, pero en el peor de los casos la bsqueda binaria es mucho msrpida cuando N es grande.

    El algoritmo de bsqueda binaria progresivamente va disminuyendo el nmero de elementossobre el que realizar la bsqueda a la mitad: n, (n/2), (n/4), ... As, tras log2(N) divisiones sehabr localizado el elemento o se tendr la seguridad de que no estaba.

    Mejor Caso: En sus casos ptimos, tanto la bsqueda secuencial como la binaria requierenslo una comparacin; esto significa que sus tiempos de ejecucin ptimos no dependen de lacantidad de datos: son constantes y por tanto proporcionales a 1, es decir, son de O(1).

    Peor Caso: En el peor caso, la bsqueda secuencial y la binaria s dependen de N. La primerarecorre todo el arreglo, requiriendo un tiempo de O(n); la binaria divide el arreglo, requiriendoslo un tiempo O(log n).

    2.5.1.3. Bsqueda HashLa bsqueda binaria proporciona un medio para reducir el tiempo requerido para buscar en

    una lista. Este mtodo, sin embargo, exige que los datos estn ordenados y siempre depende delnmero n de elementos que conforman el conjunto de datos.

    Surge entonces una pregunta,es posible lograr una bsqueda de O(1)?, es decir, unabsqueda que tome el mismo tiempo para buscar cualquier elemento de una lista. La respuesta ess. Para ello se utiliza la tcnica hashing.Este mtodo se conoce como transformacin de claves(clave-direccin) y consiste en convertir el elemento almacenado (numrico o alfanumrico)en una direccin (ndice) dentro de un arreglo, de manera que se puede acceder al elementodirectamente.

    Ejemplo.

    Vamos a partir de un sencillo ejemplo. Supongamos que tenemos una lista de empleados de unapequea empresa. Cada empleado tiene asignado un nmero de identificacin de 0 hasta 99.Entonces se necesitara un vector de tamao fijo de 100 posiciones para almacenar los empleados.Ahora, podramos tener una relacin directa entre el valor clave de cada empleado con el ndicedel arreglo. As:

  • 50 Introduccin al Diseo y Anlisis de Algoritmos

    De esta forma es posible acceder directamente a la informacin de cada empleado conociendoel nmero de identificacin de cada empleado. Por ejemplo, si se quiere acceder al empleadocon identificacin 3, simplemente se utilizara la instruccin: arreglo[3].

    Sin embargo, hacer esta correspondencia en la prctica no es posible, ya que generalmentelos nmeros de identificacin son nmeros largos como es el caso de los nmeros de cdula.Entonces, no sera posible crear un arreglo tan grande para contener tal cantidad de elementos.

    Qu alternativa entonces existe?Una alternativa sencilla para no crear arreglos enormes, sera usar los dos ltimos campos

    del campo clave. Por ejemplo, en el caso de la cdula utilizar los dos ltimos campos. As pues,si la cdula es 98393274, esta cdula se almacenara en el arreglo en la posicin 74.

    Para ello, se necesita tener una funcin hash, que determine, a partir del campo clave, en quposicin del arreglo estar cada objeto. La funcin hash, determinar el mtodo de acceso alarreglo.

    En este caso, la funcin hash aplicar la operacin: CLAVE MOD 100. As por ejemplo, si laclave es 98393204, la funcin hash devolver que se debe acceder a la posicin 4 (98393204MOD 100 = 4).

    De la siguiente manera:

    A continuacin se da el cdigo fuente en java de cmo sera la funcin hash:public int funcionHash(int clave){

    return clave%100;}

    El problema de esta tcnica son las colisiones, lo cual se explica a continuacin.

  • 2.5 Algoritmos de Bsqueda y Ordenamiento 51

    ColisionesEl esquema explicado anteriormente de la funcin hash, no garantiza direcciones nicas

    (colisiones). Por ejemplo, para las claves 98393204 y 76236304, la funcin hash arrojara lamisma posicin: 4.

    Las colisiones son imposibles de evitar, lo que se debe tener en cuenta es que una buenafuncin hash, debe minimizar las colisiones extendiendo los registros uniformemente a travs dela tabla.

    Existen varias alternativas para manejar las colisiones las cuales se explican a continuacin.

    Mtodo 1: Hashing y bsqueda

    Esta tcnica es sencilla, consiste en almacenar cada elemento colisionado en el siguienteespacio disponible. Por ejemplo, si queremos almacenar nuevo registro con la clave 366702003,al aplicar la funcin hash dara la posicin 3. Suponiendo que esta ya est ocupada, el algoritmopropone buscar el siguiente espacio disponible (donde haya null) para poder almacenar el dato. Sila bsqueda llega al final y estn todas las posiciones ocupadas, se debe buscar desde el principio.La Figura 3, ilustra este ejemplo, donde se puede apreciar que la posicin 3 devuelta por lafuncin hash ya est ocupada, por lo tanto,