Estructura de Datos - Luis Joyanes Aguilar 1998 (Cap 1 Al 15)

577

Click here to load reader

Transcript of Estructura de Datos - Luis Joyanes Aguilar 1998 (Cap 1 Al 15)

  • ,

    .' \ < < ,

    .

    ,

    ,

    . "

    ,

    ,

    ESTRUCTURA DE DATOS Algoritmos, abstraccin y objetos

    <

    <

  • r

    ,

    CONSULTORES EDITORIALES REA DE INFORMTICA y COMPUTACIN

    Antonio Vaquero Snchez Catedrtico de Lenguajes y Si stemas Informticos Escuela Superior de Informtica Universidad Complutense de Madrid ESPAA

    Gerardo Quiroz Vieyra Ingeniero en Comunicaciones y Electrnica por la ESIME del Instituto Politcnico Nacional Profesor de la Universidad Autnoma Metropolitana Unidad Xochimi1co

    MEXICO

  • orl

    . , OS,8 r8CCIOn O e OS

    Luis Joyanes Aguilar Ignacio Zahonero Martnez

    Departamento de Lenguajes y Sistemas Informticos y de Ingeniera de Software

    Escuela Universitaria de Informtica Universidad Pontificia de Salamanca en Madrid

    MADRID. BUENOS AIRES. CARACAS. GUATEMALA. LISBOA. MXICO NUEVA YORK. PANAM. SAN JUAN. SANTAF DE BOGOT. SANTIAGO. sAo PAULO

    AUCKLAND HAMBURGO LONDRES. MILN. MONTREAL NUEVA DELHI PARs SAN FRANCISCO. SIDNEY SINGAPUR STo LOUIS TOKIO. TORONTO

    j ,

    , ,

  • ,

    ESTRUCTURA DE DATOS. Algoritmos, abstraccin y objetos No est permitida la reproduccin total o parcial de este libro, ni su tratamiento in-formtico, ni la transmisin de ninguna forma o por cualquier medio, ya sea electr-nico, mecnico, por fotocopia , por registro u otros mtodos, sin el permiso previo y por escrito de los titulares del Copyright.

    DERECHOS RESERVADOS 1998, respecto a la primera edicin en espaol, por McGRAW-HILL/INTERAMERICANA DE ESPAA, S. A. U. Edificio Valrealty, 1." planta Basauri, 17 28023 Aravaca (Madrid)

    ISBN: 84-481-2042-6 Depsito legal: M. 16.148-1999

    Editora: Concepcin Fernndez Madrid Diseo de cubierta: Design Ma ster Dima Compuesto en: Puntographic, S. L. Impreso en: Cobra, S. L.

    IMPRESO EN ESPAA - PRINTED IN SPAIN

  • .... . .

    .. .

    .. .

    A los benjamines de nuestras familias, Luis y Paloma

    ,

    ..

    ..

    ,

    ..

    ..

    ..

    .. ...

    ,-' ,

    ..

    ..

    1

    1 ,

    ,

    ..

  • Prlogo .................................................................................................................... .

    PARTE I. ABSTRACCIN Y PROGRAMACiN. INTRODUCCIN A LA INGENIERA DE SOFTWARE

    Captulo 1. Ingeniera de software: introduccin a la metodologa de cons-truccin de grandes programas .................................................. ..

    1.1. IAbstraccin; ...................................................................................... . 1.2. Resolucin de problemas y programacin ..................................... . l.3. Herramientas para la resolucin de problemas .............................. .

    1.3.1. Diseo descendente ........................................................... . 1.3.2. Abstraccin procedimental ............................................... . 1.3.3. i Abstraccin de datos ......................................................... . l.3.4. Ocultacin de la informacin .......................................... .. l.3.5. I Programacin orientada a objetos ................................... ..

    1.4. Factores en la calidad del software ............................................... .. l.5. El ciclo de vida del software ......................................................... ..

    1.5.1. Anlisis .............................................................................. . 1.5.2. Diseo ................................................................................ . 1.5.3. Implementacin (codificacin) ........................................ .. 154 P b 't " . .. me as e In egraclon ........................................................ . 1.5.5. Verificacin ....................................................................... . 1.5.6. Mantenimiento .................................................................. . l.5.7. La obsolescencia: programas obsoletos .......................... . l.5.8. Iteracin y evolucin del software ................................... .

    1.6. Mtodos formales de verificacin de programas ........................... . 1.6.1. Aserciones (asertos) ......................................................... . 1.6.2. Precondiciones y postcondiciones ................................... . l.6.3. Reglas para prueba de programas .................................... . l.6.4. Invariantes de bucles ......................................................... . l.6.5. Etapas a establecer la exactitud (correccin) de un pro-

    grama ................................................................................. . l. 7. Principios de diseo de sistemas de software ................................ .

    1.7.1. Modularidad mediante diseo descendente ..................... . 1.7.2. Abstraccin y encapsulamiento ...................................... .. 1.7.3. Modificabilidad ......................................... .............. ......... ..

    XXI

    3 4 4

    5 6 7 7 7 8 9 lo:"""'"

    11 12 13 13 14 15 15 16 16 17 17 19

    22 23 23 24

    25

    " VII

    ,

  • , ,

    , ,

    .

    ,

    , __ ~~ __ .z ___ .. -, __ ~----__________________ , _____ . _=_. _. ______________________________________ __

    viii Estructura de datos

    1.8.

    1.9.

    1.7.4. Comprensibilidad y fiabilidad ......................................... . 1.7.5. Interfaces de usuario ........................................................ . 1. 7 .6. Programacin segura contra fallos .................................. . 1.7.7. Facilidad de uso ............................................................... . 1.7.8. Eficiencia .......................................................................... . 1.7.9. Estilo de programacin, documentacin y depuracin ...

    Estilo de programacin ............................... o., 1.8.1. 1.8.2. 1.8.3. 1.8.4. 1.8.5. 1.8.6. 1.8.7. 1.8.8. 1.8.9.

    Modularizar un programa en subprogramas ................. .. Evitar variables globales en subprogramas .................... . Usar nombres significativos para identificadores .......... . Definir constantes con nombres ...................................... . Evitar el uso de got o ..................................................... . Uso adecuado de parmetros valor/variable .................. .. U so adecuado de funciones ............................................ .. Tratamiento de errores ..................................................... . Legibilidad ~ ...................................................................... .

    La documentacin ................................................................. ~ .......... . 1.9.1. Manual del usuario ........................................................... . 1.9.2. Manual de mantenimiento (documentacin para progra-

    madores) ........................................................................... . 1.9.3. Documentacin interna .................................................... . 1.9.4. Documentacin externa .................................................. .. 1.9.5. Documentacin del programa ........................................ ..

    l. 10. Depuracin .................................... oo 1.1 0.1. l.l 0.2.

    Localizacin y reparacin de errores .............................. . Los equipos de programacin ........................................ ..

    1.11. . Diseo de algoritmos ....................................................................... . 1.12. Pruebas (testing) .............................................................................. .

    1.12.1. l.l2.2. 1.12.3. 1.12.4.

    Errores de sintaxis (de compilacin) .............................. . Errores en tiempo de ejecucin ...................................... .. Errores lgicos ................................................................. . El depurador ..................................................................... .

    1.13. Eficiencia ......................................................................................... . l.l3.1. Eficiencia versus legibilidad (claridad) .......................... .

    1.14. Transportabilidad ............................................................................. . Resumen ........................................................................................................ . E .. ]erCIClos ...................................................................................................... . Problemas ...................................................................................................... .

    Captulo 2. Construccin de grandes programas: mdulos versus uni-

    26 26 26 27 27 28 28 29 29 30 31 31 31 32 32 33 35 35

    36 37 37 37 38 39 41 42 42 44 45 45 46 46 49 49 49 50 51

    dades .................. ......... .................. ........................ ..... ....................... 53

    2. l. Concepto de unidad.... ............. ................... ...................................... 54 2.2. Estructura de una unidad.................................................................. 54

  • Contenido ix

    2.3.

    2.4.

    2.2.1. 2.2.2. 2.2.3. 2.2.4. 2.2.5.

    .

    Cabecera de la unidad ....................................................... . Seccin de interfaz ............................................................ . Seccin de implementacin .............................................. . Seccin de iniciacin (inicializacin) ............................. . Ventajas de las unidades ................................................... .

    Creacin de unidades ...................................................................... . 2.3.1. Construccin de grandes programas ................................ . 2.3.2. Uso de unidades ................................................................ . 2.3.3. Declaraciones/infonnacin pblica y privada ................. . 2.3.4. Clusula uses en la seccin de implementacin .......... . Utilizacin de unidad estndar ....................................................... . 2.4.1. Unidad System ............................................................... . 2.4.2. Unidad Crt ....................................................................... . 2.4.3. Unidad DOS ....................................................................... . 2.4.4. Unidad Printer ............................................................. . 2.4.5. Unidad Graph .................................................................. .

    2.5. Situacin de las unidades en sus discos: dnde busca Turbo Bor-

    55 55 56 57 57 57 61 61 62 63 65 66 66 67 68 68

    land Pascal las unidades? ................................................................. 69 2.6. Identificadores idnticos en diferentes unidades ............................ 71 2.7. Sntesis de unidades ......................................................................... 71

    2.7.1. Estructura de una unidad ............................ ............ ........... 72 2.7.2. Excepciones en la escritura de unidades .......................... 73 2.7.3. Compilacin de unidades .................................................. 74

    2.8. Otros mtodos de estructurar programas: inclusin, solapamientos y encadenamiento ............................................................................ . 2.8.1. 2.8.2. 2.8.3. 2.8.4.

    Los archivos de inclusin o incluidos (include) ............. . Los solapamientos (overlays) ................................ : .......... . La unidad OverIay (generacin de solapamientos) ......... . Encadenamiento de archivos compilados ........................ .

    Resumen ............................................................. , ......................................... .

    E .. 1 erClClOS .................................................................................................... . Referencias bibliogrficas ......................................................................... .

    r

    74 74 75 76 79 79 79 82

    Captul I 3. Abstraccin de datos: tipos abstractos de datos y objetos ....... 83 ,

    3.1. El papel (el rol) de la abstraccin .................................................. . 3.1.1. La abstraccin como un proceso mental naturaL ........... . 3.1.2. Historia de la abstraccin del software ............................ . 3. 1.3. Procedimientos .................................................................. . 3.1.4. Mdulos ............................................................................. . 3.1.5. Tipos abstractos de datos .................................................. . 3.1.6. Objetos ............................................................................... .

    3.2. Un nuevo paradigma de programacin .......................................... .

    ,

  • .

    ! ,

    i

    X Estructura de datos

    3.3. ,. . . 'NI . odularldad ..................................................................................... . 3.3.1. La estructura de un mdulo ............................................. . 3.3.2. Reglas de modularizacin ............................................... .

    3.4. Diseo de mdulos .......................................................................... . 3.4.1. Acoplamiento de mdulos .............................................. .. 3.4.2. Cohesin de mdulos ..................................................... ..

    3.5. Tipos de datos ........................................ o 3.6. Abstraccin en lenguajes de programacin ................................... .

    3.6.1. Abstracciones de control ................................................. . 3.6.2. Abstracciones de datos ................................................... ..

    3.7. Tipos abstractos de datos (TAD) .................................................... . 3.7.1. Ventajas de los tipos abstractos de datos ........................ . 3.7.2. Implementacin de los TAD .......................................... ..

    3.8. Tipos abstractos de datos en Turbo Borland Pascal ...................... . 3.8.1. Aplicacin del tipo abstracto de dato pila ..................... .

    3 9 O . , b' .. rlentaclon a o ~etos ...................................................................... . 3.9.1. Abstraccin ............................................................. ......... .

    . 3.9.2. Encapsulacin .................................................................. . 3.9.3. Modularidad ..................................................................... . 3.9.4. Jerarqua .................................................. ......................... . 3.9.5. Polimorfismo .................................................................... . 3.9.6. Otras propiedades ............................................................ .

    3.10. Reutilizacin de software ............................................................... .. 3.11. Lenguajes de programacin orientados a objetos .......................... .

    3.11.1. Clasificacin de los lenguajes orientados a objetos ...... . 3.12. Desarrollo tradicional frente a desarrollo orientado a objetos .... .. 3.13. Beneficios de las tecnologas de objetos ....................................... .. Resumen ........................................................................................................ . E .. jerCIClOS ...................................................................................................... .

    PARTE 11. FUNDAMENTOS BSICOS DE ESTRUCTURAS DE DATOS Y TIPOS ABSTRACTOS DE DATOS

    89 90 91 94 94 95 96 97 97 98 99

    101 101 102 104 105 107 107 107 108 108 109 110 111 112 116 118 120 120

    Captulo 4. Estructuras de datos dinmicas: punteros ................................. 125

    4.1. ' Estructuras de datos dinmicas ............ .............. .................... .......... 125 4.2. f Punteros (apuntadores) .................................................................... 127

    4.2.1. Declaracin de punteros .................................................... 127 4.3. Operaciones con variables puntero: procedimientos New y Dis-

    pose ....................................... A 4.3.1. 4.3.2. 4.3.3.

    Procedimiento New ........................................................... . Variables de puntero con registros ................................... . Iniciacin y asignacin de punteros ................................. .

    130 130 134 135

  • I

    1

    t

    Contenido xi

    4.3.4. Procedimiento Di s po s e ............. 4.3.5. Constante ni 1 ........................... . 4.3.6. Naturaleza dinmica de los punteros ............................... . 4.3.7. Comparacin de punteros ................................................. . 4.3.8. Paso de punteros como parmetros .................................. .

    4.4. El tipo genrico puntero (Pointer) .................................................. . 4.5. La asignacin de memoria en Turbo Borland Pascal .................... .

    4.5.1. El montculo (heap) y los punteros .................................. .

    4.5.2. Mtodos de asignacin y liberacin de memoria ............ . 4.5.3. New y Dispose .............................................................. . 4.5.4. Mark y Release ........................................................... . 4.5.5. GetMem y FreeMem ...................................................... . 4.5.6. MemAvail y MaxAvail ............................................... .

    Resumen .................................................................................................. ' ... . E .. JerCICIOS ................................................................................ Problemas ................................................................................................... .

    l37 l38 138 l39 141 142 142 143 145 145 146 146 147 148 149 152

    Captulo 5. IListas -enlazadas: el TAD lista enlazada ...................................... 153 5.1. Especificacin formal del tipo abstracto de datos lista ................. . 5.2. Implementacin del TAD lista con estructuras estticas .............. . 5.3. Implementacin del TAD lista mediante variables dinmicas ...... . 5.4. Iniciar una lista enlazada ................................................................ . 5.5. Bsqueda en listas enlazadas .......................................................... . 5.6. Operaciones de direccin: siguiente, anterior, ltimo ................... . 5.7. Insercin de un elemento en una lista ............................................ . 5.8. Supresin de un elemento de una lista ........................................... . 5.9. Recorrido de una lista ..................................................................... .

    5.10. Lista ordenada ................................................................................. . 5.10.1. Implementacin de una lista ordenada ............................ . 5.10.2. Bsqueda en lista ordenada .............................................. .

    Resumen ........................................................................................................ . E .. Jerclclos ...................................................................................................... . Problemas ...................................................................................................... .

    153 156 159 162 162 163 164 166 168 168 168 170 175 176 177

    Captulo 6. \ Listas doblemente enlazadas ......................................................... 179

    6.1. Especificacin de lista doblemente enlazada .................................. 179 6.2. Implementacin de una lista doblemente enlazada mediante va-

    . bl d' . rla es lnamlcas ............................................................................. . 6.2.1. Creacin de nodos en la lista ........................................... . 6.2.2. Eliminacin de nodo ......................................................... .

    6.3. Una aplicacin resuelta con listas doblemente enlaZadas ............. . 6.4. Implementacin de una lista circular mediante variables dinmicas ... .

    180 181 184 186 195

    ,

    j

  • ! i j.

    I

    xii Estructura de datos

    6.5. Implementacin de una lista circular mediante variables dinmicas ... . 6.6. Implementacin de listas circulares con doble enlace .................. . Resumen .............................................................. o E .. Jerclclos .................................................................................................... . Problemas ................................................................................................... .

    Captulo 7. 7.1. 7.2. 7.3. 7.4.

    7.5.

    IPilas: el TAD pi 1 a ........................................................................ . Especificacin formal del tipo abstracto de datos pila ................. . Implementacin del TAD pila con arrays .................................. . Implementacin del TAD pi 1 a mediante variables dinmicas ... . Evaluacin de expresiones aritmticas mediante pilas ................. . 7.4.1. Notaciones Prefija (Polaca) y Postfija (Polaca inversa) .. 7.4.2. Algoritmo para evaluaciones de una expresin aritmtica .... Aplicacin prctica de la evaluacin de una expresin aritmtica 7.5.1. Unidad Pilaop ................................................................ . 7.5.2. Unidad ExpPost (transformacin a postfija) ............... . 7.5.3. Evaluacin de la expresin en postfi j a ............................ .

    Resumen ...................... a E .. Jerclclos .................................................................................................... . Problemas ................................................................................................... .

    196 200 203 204 204

    207 207 208 211 215 215 216 218 218 220 222 224 225 225

    Captulo 8. fColas y colas de prioridades: el TAD cola .................................. 227

    8.1. Especificacin formal del tipo abstracto de datos cola ................. . 8.2. Implementacin del TAD cola con arrays lineales ........................ . 8.3. Implementacin del TAD cola con arrays circulares .................... . 8.4. Implementacin del TAD cola con listas enlazadas ...................... . 8.5. Implementacin del TAD cola con listas circulares ...................... . 8.6. Bicolas .............................................................................................. . 8.7. Colas de prioridades ........................................................................ . 8.8. Implementacin de colas de prioridades ....................................... ..

    8.8.1. Implementacin mediante una nica lista ....................... . 8.8.2. Implementacin mediante una lista de n colas ................ .

    8.9. Implementacin de un problema con colas de prioridades ........... . Resumen ..................................................................................................... . E .. Jerclclos .................................................................................................... . Pro b 1 emas ................................................................................................... .

    PARTE UI. ESTRUCTURAS DE DATOS AVANZADAS

    Captul 9 9.1. 9.2.

    Recursividad: algoritmos recursivos .......................................... . Recursividad .................................................................................... . Cundo no utilizar la recursividad ................................................. . 9.2.1. Eliminacin de la recursividad ......................................... .

    228 229 231 235 237 239 244 245 245 246 247 256 257 258

    263 263 264 266

    ..

    , ..

    .. ,

    !

    1 , ! .~ ..

    j ..

    . J 1 , 1 , ..

  • ,

    j

    Contenido XIII

    9.3. Algoritmos divide y vencers ...................................................... 267 9.3.1. Torres de Hanoi .................................................................. 267 9.3.2. Traza de un segmento ........................................................ 269

    9.4. Implementacin de procedimientos recursivos mediante pilas...... 270 9.4.1. El problema de las Torres de Hanoi resuelto sin recur-

    sividad................................................................................. 271 9.5. Algoritmos de vuelta atrs (backtracking) ...................................... 277

    9.5.1. Solucin del problema Salto del caballo con esquema IteratIVO ................................... o.,

    9.5.2. Problema de las ocho reinas ............................................ .. 9.5.3. Solucin no recursiva al problema de las ocho reinas .... . 9.5.4. Problema de la mochila .................................................... . 9.5.5. Problema del laberinto ..................................................... .. 9.5.6. Generacin de permutaciones de n elementos ................ .

    9.6. Problema de la seleccin ptima .................................................... . 9.6.1. El viajante de comercio ................................................... ..

    9.7. Problema de los matrimonios estables .......................................... .. Resumen ...................................................................................................... . E .. ~erclclos .................................................................................................... . Problemas .................................................................................................... .

    Captulo 10.

    10.1. 10.2.

    10.3. 10.4. 10.5.

    10.6.

    ,

    I Arboles binarios ....... ................................................................... .

    Concepto de rbol ......................................................................... . ,

    Arboles binarios ............................................................................ . 10.2.1. 10.2.2. 10.2.3. 10.2.4. ,

    Terminologa .................... ~ ............................................. . Nivel de un nodo y altura de un rbol .......................... . ,

    Arboles binario, lleno y completo ................................ . Recorrido de un rbol binario ....................................... .

    Arboles de expresin .................................................................... . Construccin de un rbol binario ................................................ .. Recorrido de un rbol ................................................................... . 10.5.1. Recorrido en orden ..................................................... . 10.5.2. Recorrido preorden ................................................. .. 10.5.3. Recorrido postorden ............................................. ... . 10.5.4. Implementacin de los algoritmos de recorrido .......... . Aplicacin de rboles binarios: evaluacin de expresiones ....... . 10.6.1. Notacin postfija: notacin polaca .............................. ..

    ,

    10.6.2. Arbol de expresin ........................................................ . 10.6.3. Transformacin de expresin infija a postfija ............. . 10.6.4. Creacin de un rbol a partir de la expresin en post-

    10.6.5. 10.6.6.

    fija ................................................................................... . Evaluacin de la expresin en postfija ......................... . Codificacin del programa de evaluacin .................... .

    281 286 288 290 293 296 297 298 298 306 306 308

    311

    312 314 315 316 318 320 320 322 324 325 326 326 328 329 329 330 331

    331 332 334

    " -,

  • ,

    xiv Estructura de datos

    ,

    10.7. Arbol binario de bsqueda .......................................................... .. 10.7.1 Creacin de un rbol binario ........................................ .

    10.8. Operaciones en rboles binarios de bsqueda ............................. . 10.8.1. Bsqueda ........................................................................ . 10.8.2. Insercin ......................................................................... . 1 O 8 3 El . , . " lffilnaClon .................................................................... . 10.8.4. Recorrido de un rbol ................................................... . 10.8.5. Determinacin de la altura de un rbol ...... .................. .

    Resumen ..................................................................................................... . E .. ~erclclos .................................................................................................... . Problemas .................................................................................................... . Referencias bibliogrficas ......................................................................... .

    ,

    334 336 340 341 341 342 344 345 346 347 349 350

    Captulo 11. Arboles equilibrados ........................................ ..................... ....... 353

    11.1. Eficiencia de la bsqueda en un rbol binario ............................ . 11.2. rbol binario equilibrado (AVL) ................................................. . 11.3. Creacin de un rbol equilibrado de N claves ............................. . 11.4. Insercin en rboles equilibrados: rotaciones ............................. .

    11.4.1. Insercin de un nuevo nodo ............... .......................... .. 11.4.2. Proceso a seguir: rotaciones ......................................... . 11.4.3. Formacin de un rbol equilibrado ............................. .. 11. 4.4. Procedimiento de insercin con balanceo .................... .

    11.5. Eliminacin de un nodo en un rbol equilibrado ........................ . 11.6. Manipulacin de un rbol equilibrado ........................................ .. Resumen ..................................................................................................... . E .. Jerclclos .................................................................................................... . Problemas ................................................................................................... .

    ,

    353 354 355 356 357 357 360 363 366 372 376 377 377

    Captulo 12. Arboles B ....................................................................................... 379

    12.1. 12.2. 12.3. 12.4. 12.5. 12.6. 12.7. 12.8. 12.9.

    Definicn de un rbol B .............................................................. . .

    Representacin de un rbol B de orden m ................................... . Proceso de creacin en un rbol B ............................................... .

    Bsqueda de una clave en un rbol B .......................................... . Algoritmo de insercin en un rbol B de orden m ................... ... . Recorrido en un rbol B de orden m ... ................ ........................ .. Eliminacin de una clave en un rbol B de orden m .................. . TAO rbol B de orden m .......... .................................................... . Realizacin de un rbol B en memoria externa .......................... .

    Resumen ........................... , ......................................................................... . EJerCICIos .................................................................................................... .

    Problemas ................................................................................................... .

    379 380 381 384 385 389 390 397 400 414 415 415

  • Contenido

    Captulo 13. Grafos. Representacin y operaciones ..................................... . 13.1. Grafos y aplicaciones .................................................................... . 13.2. Conceptos y definiciones .............................................................. .

    13.2.1. Grado de entrada, grado de salida ................................ . 13.2.2. Camino ........................................................................... .

    13.3. Representacin de los grafos ........................................................ . 13.3.1. Matriz de adyacencia .................................................... . 13.3.2. Listas de adyacencia ...................................................... .

    13.4. TAO grafo ...................................................................................... . 13.4.1. 13.4.2.

    Realizacin con matriz de adyacencia ........................ .. Realizacin con listas de adyacencia .......................... ..

    13.5. Recorrido de un grafo ................................................................... . 13.5.1. Recorrido en anchura .................................................... . 13.5.2. Realizacin del recorrido en anchura .......................... .. 13.5.3. Recorrido en profundidad ............................................ .. 13.5.4. Recorrido en profundidad de un grafo ........................ .. 13.5.5. Realizacin del recorrido en profundidad .................... .

    13.6. Componentes conexas de un grafo .............................................. . 13.7. Componentes fuertemente conexas de un grafo dirigido .......... .. 13.8. Matriz de caminos. Cierre transitivo ............................................ . 13.9. Puntos de articulacin de un grafo .............................................. . Resumen ..................................................................................................... . E .. jerCIClos .................................................................................................... . Problemas ........................... ~ .......................... ............................................. .

    Captulo 4) ..

    ......

    14.1. 14.2. 14.3.

    14.4.

    14.5.

    Algoritmos fundamentales con grafos ...................................... .

    Ordenacin topolgica .................................................................. . Matriz de caminos: algoritmo de Warshall .................................. . Problema de los caminos ms cortos con un solo origen: algorit-mo de Dijkstra ............................................................................... . 14.3.1. Algoritmo de la longitud del camino ms corto .......... . Problema de los caminos ms cortos entre todos los pares de vr-tices: algoritmo de Floyd .............................................................. . 14.4.1. Recuperacin de caminos ............................................ .. Concepto del flujo ......................................................................... . 14.5.1. 14.5.2. 14.5.3.

    14.5.4. 14.5.5. 14.5.6. 14.5.7.

    Planteamiento del problema ........................................ .. F l , ,. ormu aClon matematlca ............................................... . Algoritmo del aumento del flujo: algoritmo de Ford y Fulkerson ....................................................................... . Ejemplo de mejora de flujo .......................................... . Esquema del algoritmo de aumento de flujo .............. .. Tipos de datos y pseudocdigo .................................... . Codificacin del algoritmo de flujo mximo: Ford-Fu1kerson .

    xv

    417 417 418 419 420 421 421 424 426 426 428 431 431 433 434 435 435 437 439 442 446 450 451 453

    455

    456 459

    461 462

    467 469 470 471 472

    472 474 476 478 479

  • XVI Estructura de datos

    14.6.

    14.7. 14.8.

    Problema del rbol de expansin de coste mnimo ..................... . 14.6.1. Definiciones ................................................................... .

    ,

    14.6.2. Arboles de expansin de coste mnimo ...................... .. Algoritmo de Prim y Kruskal ...................................................... ..

    ,

    Codificacin. Arbol de expansin de coste mnimo .................. .. Resumen ..................................................................................................... . E .. jerCIClos .................................................................................................... . Problemas ...... o

    PARTE IV. ARCHIVOS Y ORDENACiN

    483 483 483 484 488 493 493 496

    Captulo 15. Ordenacin, bsqueda y mezcla ................................................ 501

    15.1. 15.2. 15.3.

    15.4. 15.5.

    15.6. 15.7.

    15.8. 15.9.

    15.10. 15.11. 15.12.

    15.13.

    15.14.

    Introduccin .......................................... ........................................ . Ordenacin .................................................................................... . Ordenacin por burbuja ................................................................ .

    15.3.1. 15.3.2. 15.3.3. 15.3.4. 15.3.5.

    A 'l' . na lSIS ....................................................................

    Procedimientos de ordenacin .................................. .. Algoritmo de burbuja mejorado (refinamiento) ........ . Programacin completa de ordenacin por burbuja .. Anlisis de la ordenacin por burbuja ...................... ..

    O d , 1" r enaClon por se eCC10n ............................................................. . O d , . ., r enaClon por InserClon ............................................................. .

    15.5.1. 15.5.2.

    Algoritmo de insercin binaria .................................. . Comparacin de ordenaciones cuadrticas ................ .

    Ordenacin Shell ........................................................................... . Ordenacin rpida (quicksort) ...................................................... .

    15.7.1. Anlisis de la ordenacin rpida ................................ . Ordenacin por mezcla (mergesort) ............................................ . Mtodo de ordenacin por montculos (heapsort) ...................... . 15.9.1. Montculo ....................................................................... . 15.9.2. Procedimiento empuja .................................................. .. 15.9.3. Montculo inicial .0 Mtodo de ordenacin binsort .................................................... .. Mtodo de ordenacin radix-sort.. ............ .................................. .. Bsqueda lineal ............................................................................. . 15.12.1. Anlisis ........................................................................ . 15.12.2. Eficiencia de la bsqueda lineal ................................ .. Bsqueda binaria ........................................................................... . 15.13.1. Eficiencia de la bsqueda binaria .............................. . B ' d b" . usque a lnarla recursIva ........................................................... . 15.14.1. Funcin bsqueda ...................................................... .. 15.14.2. Procedimiento BusquedaBin ................................ ..

    502 502 503 503 507 507 508 509 510

    512 514 514 514 517 522 522 525 525 528 529 529 533 . 536 536 539 540 542 544 544 545

    ' , ,

    ! .~

  • . . .. " ... "

    Contenido

    15.15. Mezcla ............................................................................................ . Resumen ........................................................................................................ . E .. Jerclclos ...................................................................................................... . Pro b 1 emas ................................................................ " .................................... .

    . '"

    xvii

    546 548 548 549

    Captulo 16. Anlisis de algoritmos ................................................................. 553

    16.1. Medida de la eficiencia de algoritmos ........................................ .. 16.1.1. Anlisis del orden de magnitud .................................... . 16.1.2. Consideraciones de eficiencia ...................................... . 16.1.3. Anlisis de rendimiento ................................................ . 16 1 4 T d' . , . .. lempo e eJeCUClon ..................................................... .

    16.2. Notacin O-grande ....................................................................... . 16.2.1. Descripcin de tiempos de ejecucin ............................ . 16.2.2. Definicin conceptual ................................................... .. 16.2.3. Funciones tipo monomio .............................................. ..

    ,

    16.2.4. Ordenes de funciones polinmicas ............................... . ,

    16.2.5. Ordenes exponenciales y logartmicas .......................... . 16.2.6. Bases de logaritmos distintas ....................................... .. 16.2.7. Inconvenientes de la notacin O-grande .. .................... .

    16.3; La eficiencia de los algoritmos de bsqueda .............................. .. 16.3.1. Bsqueda secuencial .................................................... .. 16.3.2. Bsqueda binaria ........................................................... .

    16.4. Anlisis de algoritmos de ordenacin ......................................... .. 16.4.1. Anlisis de la ordenacin por seleccin ....................... . 16.4.2. Anlisis de la ordenacin por burbuja ........................ .. 16.4.3. Anlisis de la ordenacin por insercin ....................... . 16.4.4. Ordenacin por mezcla ................................................. . 16.4.5. Ordenacin rpida ......................................................... . 16.4.6. Anlisis del mtodo Radix Sort ................................... ..

    16.5. Tablas comparativas de tiempos .................................................. .. Resumen ..................................................................................................... . E .. JerCICIOS .................................................................................................... . Problemas ................................................................................................... . Referencias bibliogrficas ......................................................................... .

    Captulo 17. Archivos (ficheros). Fundamentos tericos ............................. . 17.1. Nocin de archivo. Estructura jerrquica .................................... .

    17.1.1. Campos .......................................................................... . 17.] .2. Registros ........................................................................ .

    17.2. Conceptos, definiciones y terminologa ...................................... . 17.3. Organizacin de archivos ............................................................ ..

    17.3.1. Organizacin secuencial ............................................... . 17.3.2. Organizacin directa .................................................... ..

    553 554 555 555 555 556 557 557 558 559 559 560 562 563 563 564 565 565 566 567 568 569 570 571 572 573 577 579

    581

    581 582 583 584 587 588 589

    1

  • ,

    XVIII Estructura de datos

    17.4. Operaciones sobre archivos ......................................................... .. 17.4.1. Creacin de un archivo ................................................. . 17.4.2. Consulta de un archivo .................................................. . 17.4.3. Actualizacin de un archivo ......................................... . 17.4.4. Clasificacin de un archivo ........................................... . 17.4.5. Reorganizacin de un archivo ..................................... .. 17.4.6. Destruccin de un archivo ............................................ . 17 4 7 R . , ti ., d h . .. eumon, USlOn e un arc IVO ..................................... .. 17.4.8. Rotura/estallido de un archivo ...................................... .

    17.5. Gestin de archivos ....................................................................... . 17.6. Mantenimiento de archivos .......................................................... .

    17.6.1. Altas ............................................................................... . 17.6.2. Bajas ....................... ~ .............................. ......................... . 17.6.3. Modificaciones .............................................................. . 17.6.4. Consulta ......................................................................... . 17.6.5. Operaciones sobre registros .......................................... .

    17.7. Procesamiento de archivos. Problemas resueltos ........................ . Resumen ..................................................................................................... . E .. J erClClOS .................................................................................................... . Problemas ................................................................................................... .

    Captulo 18. 18.1. 18.2.

    18.3.

    Tratamiento de archivos de datos ............................................ .. Archivos de texto .......................................................................... . Cmo aumentar la velocidad de acceso a archivos ..................... . 18.2.1. Archivos con funcin de direccionamiento hash ........ . 18.2.2. Funciones hash .............................................................. . 18.2.3. Resolucin de colisiones ............................................... . 18.2.4. Realizacin con encadenamiento ................................. . Archivos indexados ....................................................................... . 18.3.1. Archivo indexado de una fonoteca ............................... . 18.3.2. Programa de manipulacin de archivos indexados ..... .

    Resumen ..................................................................................................... . E .. Jerclclos .................................................................................................... . Pro b lemas ................................................................................................... .

    Captulo 19. 19.1. 19.2.

    19.3.

    Ordenacin externa .................................................................... . Ordenacin externa. Mtodos de ordenacin .............................. . Mtodo de mezcla directa (mezcla simple) ................................. . 19.2.1. Codificacin ................................................................... . Mtodo de mezcla equilibrada mltiple ...................................... . 19.3.1. Tipos de datos .......................................... ...................... . 19.3.2. Cambio de finalidad de archivo .................................... . 19.3.3. Control del nmero de tramos ...................................... . 19.3.4. Codificacin ................................................................... .

    589 590 590 591 592 592 592 592 593 593 594 595 595 596 596 596 596 613 614 615

    617 617 622 622 623 625 636 645 645 650 652 653 653

    655 655 656 657 661 661 662 662 663

  • __ o

    ., ,._------- - ----- ----- -----_ ..... . ,,'

    Contenido

    19.4. Mtodo polifsico de ordenacin externa.. .................................. . 19.4.1. Ejemplo con tres archivos ............................................ .. 19.4.2. Ejemplo con cuatro archivos ........................................ . 19.4.3. Distribucin inicial de tramos ...................................... . 19.4.4. Mezcla polifsica versus mezcla mltiple ................... . 19.4.5. Algoritmo de mezcla ..................................................... . 19.4.6. Codificacin ................................................................... .

    Resumen ........................................................................................... 0 E .. Jerclclos .................................................................................................... . Problemas ................................................................................................... . Referencias bibliogrficas ......................................................................... .

    PARTE V. PROGRAMACIN ORIENTADA A OBJETOS Captulo 20. Objetos: Conceptos fundamentales y programacin orien-

    tada a objetos ............................................................................... . 20.1. La estructura de los objetos: sintaxis ........................................... .

    20.1.1. Encapsulamiento ............................................................ . 20.2. Secciones pblica y privada ........................................................ ..

    20.2.1. Declaracin de una base ............................................... . 20.2.2. Declaracin de un objeto .............................................. . 20.2.3. Implementacin de los mtodos .................................. ..

    20.3. Definicin de objetos mediante unidades .................................... . 20.3.l. Uso de un tipo objeto .................................................... .

    20.4. La herencia .................................................................................... . 20.4.l. La herencia con inher i t ed ..................................... .

    20.5. Los mtodos ........................... o 20.6. Objetos dinmicos ......................................................................... .

    20.6.l. 20.6.2. 20.6.3.

    Asignacin de objetos dinmicos ................................. . Liberacin de memoria y destructores ......................... . La clusula S e 1 f .......................................................... .

    20.7. Polimorfismo ................................................................................. .

    20.8. 20.9.

    20.10.

    20.7.l. 20.7.2.

    Constructores y destructores en objetos dinmicos .... . Anulacin de mtodos heredados ................................. .

    Constructores y destructores ........................................................ . Los procedimientos New y Dispose en POO .............................. . Mejoras en programacin orientada a objetos ............................ . 20.10.1. La ocultacin mediante public y private ................... .

    Resumen ........ ................................................................................................ . E ,. d " rrores tlplCOS e programaclon .................................................................. . E, " JerCICIOS ....................................................................................................... . Problemas ...................................................................................................... . Referencias bibliogrficas ............................................................................ .

    xix

    667 667 669 670 671 671 672

    , 678 678 679 679

    683 684 691 691 692 693 693 694 695 696 702 705 705 705 707 709 714 717 718 721 724 725 726 727 729 730 730 730

    .,.

  • ,

    ,

    XX Estructura de datos

    Apndices

    Apndice A. Vademcum de Matemticas para la resolucin de algoritmos , .

    numerlCOS . o', oo Apendice B. Unidades estndar de Turbo Borland Pascal 7 ............................ .

    Apndice C. Apndice D. Apndice E. Apndice F.

    Apndice G. Apndice H. ,

    B.I. Las unidades estndar ........................................................ . B.2. La unidad Systern ............................................................ . B.3. La unidad Printer ........................................................ .. 8.4. La unidad DOS ................................................................... . B.5. Procedimientos y funciones de la unidad DOS ................ . B.6. La unidad Crt ................................................................... . B.7. La unidad Str i ngs: funciones ...................................... .. Resumen oo oo El editor de Turbo Pascal 7.0 ...................................................... .. El entorno integrado de desarrollo de Turbo Pascal 7.0 ............ .. Depuracin de sus programas en Turbo Pascal .......................... .. Mensajes y cdigos de error ........................................................ .. Gua de referencia Turbo Borland Pascal .................................... . Gua del usuario ISO/ANSI Pascal Estndar .............................. .

    Indice ..................................................................................................................... o oo.

    733 739 740 740 741 742 744 753 760 764 765 769 783 797 805 829 849

  • Estructura de datos como disciplina informtica y de computacin

    Una de las disciplinas clsicas en todas las carreras relacionadas con la Informtica o las Ciencias de la Computacin es Estructura de datos. El estudio de las estructuras de datos es casi tan antiguo como el nacimiento de la programacin, y se ha convertido en materia de estudio obligatoria en todos los curriculum desde finales de los aos sesenta y sobre todo en la dcada de los setenta cuando apareci el lenguaje Pascal de la mano del profesor Niklaus Wirtz, y posteriormente en la dcada de los ochenta con la apari-cin de su obra ya clsica Algorihtms and Data Structures en 1986.

    Ha sido en la dcada de los ochenta cuando surgieron los conceptos clsicos de es-tructuras de datos, y aparecieron otros nuevos que se han ido consolidando en la segun-da mitad de esa dcada, para llegar a implantar la caracterstica distintiva de la dcada de los noventa, la orientacin a objetos. Una razn para que esta caracterstica se haya convertido en ncleo fundamental de la programacin que se realiza en los noventa, y que se seguir realizando en el tercer milenio, ha sido que un objeto encapsula el diseo o implementacin de un tipo abstracto de datos (TAD). Adems de encapsulacin de datos, los objetos tambin encapsulan herencia; por ejemplo, una cola es un tipo de lista con restricciones especficas, de modo que el diseo del tipo de dato Cola puede heredar algunos de los diseos de mtodos ( operaciones) del tipo de dato Lis t a.

    As pues, Estructura de datos. Algoritmos, abstraccin y objetos trata sobre el estu-dio de las estructuras de datos dentro del marco de trabajo de los tipos abstractos de datos (TAD) y bajo la ptica del anlisis y diseo de los algoritmos que manipulan esos tipos abstractos de datos u objetos.

    Objetivos y caractersticas La filosofia con la que se ha construido el libro reside en el desarrollo modular de pro-gramas que, hoy da, conduce de modo inequvoco a los principios de ingeniera de soft-ware que facilitan la construccin de grandes programas: abstraccin, legibilidad, com-prensibilidad y reutilizacin o reusabilidad del software. Estos principios se consiguen mediante especificacin del software, que supone, a su vez, la separacin entre la espe-

    XXI

    -

    ..

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

  • ,

    ,

    xxii Estructura de datos

    cificacin y la implementacin (unidades en Pascal, paquetes en Ada 95, clases en C++, etctera) y conduce a la construccin de bibliotecas de componentes (clases y objetos) que facilitan la construccin de software mediante la reutilizacin de software ya exis-tente en bibliotecas de funciones y/o componentes,

    El lenguaje utilizado en el libro es Pascal y, en particular, la versin Turbo Borland que soporta el concepto de unidad (mdulo de compilacin separada) y de clases y obje-tos, y en consecuencia facilita la construccin de tipos abstractos de datos y la progra-macin orientada a objetos.

    Para conseguir esos principios que rigen la construccin de programas siguiendo las modernas teoras de la ingeniera de software, es preciso fijarse una serie de objetivos parciales, cuya consecucin lleva al objetivo final: Enseanza. aprendizaje y dominio de los conceptos de estructuras de datos y sus algoritmos de manipulacin.

    En consecuencia, los diferentes objetivos generales que busca el libro son:

    Introducir y describir en profundidad las estructuras de datos clsicas (pilas. co-las. listas. rboles. grafos y archivos) que se encuentran en casi todos los progra-mas de computadora.

    Ensear a los estudiantes y lectores autodidactas, el uso de tcnicas de anlisis y diseo con las que se pueden evaluar y validar algoritmos.

    Proporcionar ejemplos de principios de ingeniera de software y tcnicas de pro-gramacin que incluyen abstraccin de datos y programacin orientada a objetos.

    Introduccin al uso adecuado de las caractersticas especficas de Turbo Borland Pascal, especialmente aquellas que permiten la compilacin separada: unidades, tanto predefinidas incorporadas en el compilador como definidas por el usuario.

    El lenguaje elegido para implementar los diferentes algoritmos incluidos en el libro ha sido, como ya se ha comentado, Pascal. La razn esencial ha sido pragmtica: Pascal sigue siendo, y estamos seguros que as seguir, el lenguaje idneo para ensear a los estudiantes de Computacin, Informtica y restantes Ingenieras, las tcnicas de progra-macin estructurada. Cientos de miles, han sido los estudiantes que han aprendido Pas-cal y ese ha sido su primer lenguaje de programacin, aunque hoy en el campo profesio-nal haya sido desplazado por otros lenguajes tales como C, C++, Java o Visual Basic.

    En cualquier forma, siempre hemos tenido la idea de que los lenguajes de computa-dora no son slo un mecanismo de descripcin de algoritmos o de programas de compu-tadoras, sino tambin un vehculo de concepcin, reflexin y anlisis, en la resolucin de problemas con computadora. Por ello, pensamos que Pascal, como cualquier otro lenguaje estructurado o incluso un pseudolenguaje, como puede ser un pseudocdigo, servir para conseguir el rigor y el formalismo que el profesor quiera conseguir con sus alumnos, o el propio estudiante se marque siguiendo las directrices de sus maestros o profesores.

    Desde un punto de vista cientfico, el libro se ha escrito apoyndose en las obras de las autoridades ms reconocidas en el campo de algoritmos y estructuras de datos, fun-damentalmente D. E. Knuth y N. Wirth, y las inestimables obras de A. V. Aho, J. Hop-croft, 1. D. Ullman, E. Horowitz, D. Sahni, B. Liskov, entre otros, y que el lector encon-

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

  • Prlogo

    trar en las referencias bibliogrficas que acompaan a algunos captulos o en la biblio-grafia final del libro.

    El libro como texto de referencia universitaria y profesional

    Estructura de datos es una disciplina acadmica que se incorpora a todos los planes de estudios de carreras universitarias de Ingeniera Informtica, Ingeniera en Sistemas Computacionales y Licenciatura en Informtica, as como suele ser tambin frecuente la incorporacin en planes de estudios de informtica en Formacin Profesional o Institu-tos Politcnicos. Suele considerarse tambin Estructuras de datos como una extensin de las asignaturas de Programacin, en cualquiera de sus niveles. Por estas circunstan-cias han nacido numerosas iniciativas de incorporacin de esta disciplina a los diferen-tes planes de estudios. .

    Este es el caso de Espaa. Los planes de estudios de Ingeniera en Illfonntica, Inge-niera Tcnica en Informtica de Sistemas e Ingeniera Tcnica en Informtica de Ges-tin incluyen, todos ellos, una materia troncal llamada Estructura de datos, que luego se convierte en asignaturas anuales o semestrales. El Consejo de Universidades no slo obliga a las universidades a incluir esta asignatura como materia troncal, y en conse-cuencia asignatura obligatoria, sino que adems recomienda descriptores para la mis-ma. As estos descriptores son: tipos abstractos de datos, estructuras de datos y algoritmos de manipulacin, ficheros (archivos)>>. En esta edicin se ha dejado fuera del contenido del libro el descriptor bases de datos, por entender que suele constituir parte de una asignatura especfica que an formando parte de Estructura de datos suele tener entidad propia o complementaria. De igual fOl ma la organizacin internacional ACM recomien-da un curriculum para la carrera de Computer Science, equivalente a las carreras univer-sitarias espaolas ya citadas. Asimismo, todos los pases de Iberoamrica han incluido tambin la asignatura Estructura de datos en sus currculos. As nos consta por nuestras numerosas visitas profesionales a universidades e institutos tecnolgicos de Mxico, Cuba, Venezuela, Guatemala, etc., donde hemos podido examinar sus planes de estudios e inter-cambiar experiencias, tanto con profesores (maestros) como con estudiantes.

    Estructuras de datos: Algoritmos, abstraccin y objetos. Siguen las recomendacio-nes dadas por el Consejo de Universidades de Espaa para las carreras de Ingeniera Informtica, tanto la superior como la tcnica, y se ha adaptado en la medida de lo posi-ble al curriculum recomendado por la ACM, en particular el curso C2 (Curriculum '78, CACM 3/79 y CACM 8/85). Asimismo se adapta a cursos tpicos sobre conocimiento de algoritmos y estructura de datos, as como de los lenguajes de programacin, segn se describe en el informe Computing Curricula 1991 del ACM/IEEE-CS (CommunACM 34, 6 junio 1991) Joint Curriculum Task Force. El libro trata de ajustarse a las directrices dadas para Estructura de datos y Anlisis de algoritmos propuestos en ese informe y se puede usar como materia fundamental y/o complementaria de un curso normal de cien-cias de la computacin para graduados y no graduados.

    El texto se ha diseado para un curso de dos cuatrimestres (semestres), de algoritmos y estructuras de datos. Su divisin seleccin del captulo y adscripcin a uno u otro

    .

    I

  • xxiv Estructura de datos

    cuatrimestre, creemos deben ser decididos por el profesor (maestro) en funcin de su experiencia y de los objetivos marcados. Podra servir para un cuatrimestre siempre que hubiese una seleccin adecuada del profesor y se tuviera en cuenta la formacin previa del estudiante.

    Requisitos

    El nico requisito previo para los estudiantes que emplean este texto es un curso de uno o dos semestres, de programacin con diseo de algoritmos mediante pseudocdigos, o lenguajes estructurados, tales como FORTRAN, Pascal, C, C++ o Java. Los estudiantes que han estudiado sus cursos de programacin sin utilizar el lenguaje Pascal, pueden seguir este libro junto con alguno de los libros de texto que se listan en la bibliografia final del libro o en las referencias bibliogrficas de los captulos 1 y 2. No obstante, se han incluido varios apndices sobre Pascal y Turbo Pascal que pensamos ser suficiente, al menos, a nivel de sintaxis para refrescar o adquirir aquellos conocimientos bsicos necesarios para seguir la calificacin de los diferentes algoritmos del libro.

    Depuracin

    Todos los programas y algoritmos del texto se han probado y depurado. Adems de nuestra tarea de puesta a punto de programas, diferentes profesores nos han ayudado en esta tarea. Este es el caso de Matilde Femndez, Lucas Snchez, Jess Prez, Isabel Torralvo y M.a del Mar Garca, todos ellos profesores de la Facultad de Informtica y Escuela Universitaria de Informtica de la Universidad Pontificia de Salamanca en el campus de Madrid. Su entusiasmo y el cario puesto en esta actividad ha sido desbordante y siem-pre aportaron sugerencias valiosas. Por supuesto, que cualquier error que todava pudie-ra existir, es absoluta responsabilidad de los autores.

    Los ejercicios y problemas de los diferentes captulos varan en tipo y dificultad. Algunos son reiterativos para confirmar la comprensin de los textos. Otros implican modificaciones a programas o algoritmos presentados. Se han incluido gran cantidad de problemas de programacin con diferentes niveles de complejidad que confiamos sean complementos eficientes a la formacin conseguida por el lector.

    Contenido

    Este libro se ha dividido en cinco partes y ocho apndices.

    Parte 1: Abstraccin y Programacin: Introduccin a la ingeniera de software. Esta parte contiene los captulos 1, 2 y 3 y describe una introduccin a la metodologa de construccin de grandes programas, una comparacin entre los conceptos de mdulos y unidades, as como el importante concepto de abstraccin de datos.

  • Prlogo XXV

    Parte 11: Fundamentos bsicos de estructuras de datos y tipos abstractos de datos. Esta parte contiene la descripcin del importante tipo de dato llamado puntero, junto con la descripcin de las estructuras de datos ms tpicas: listas enlazadas, listas doble-mente enlazadas, pilas y colas.

    Parte 111: Estructuras de datos avanzadas. Las estructuras rboles binarios, equili-brado y B, grafos, junto con el estudio de algoritmos recursivos y de manipulacin de las citadas estructuras de datos, son el tema central de esta parte.

    Parte IV: Archivos y ordenacin. En esta parte se tratan los importantes algoritmos de manipulacin de ordenacin, bsqueda y mezcla, junto con el concepto de archivo y su tratamiento; otro concepto importante que se estudia en esta parte, es el Anlisis de Al-goritmos, como tcnica indispensable para conseguir algoritmos eficientes.

    Parte V: En esta parte se introduce al lector en programacin orientada a objetos, apoyada en el concepto de objeto como extensin de un tipo abstracto de datos.

    Una descripcin detallada de los diferentes captulos se proporciona a continuacin. El captulo 1 es una introduccin a la metodologa de construccin de software, as como las tcnicas de ingeniera de software. Se describen las herramientas usuales para la resolucin de problemas junto con las diferentes etapas del ciclo de vida del software. Asimismo se enumeran los principios de diseo de sistemas de software, junto con nor-mas para un estilo de programacin, documentacin, depuracin y pruebas.

    En el captulo 2 se describe el concepto de mdulo y cmo se puede implementar en Turbo Pascal, mediante unidades. Se describe el concepto de unidad, el modo de crea-cin y de utilizacin de las mismas. El importante concepto de abstraccin de datos y su implementacin mediante tipos abstractos de datos.

    En el captulo 3 se comienza el estudio de la orientacin a objetos as como los dife-rentes lenguajes de programacin orientados a objetos, junto al importante concepto de reutilizacin de software.

    El captulo 4 proporciona una introduccin a las estructuras de datos dinmicas. El captulo describe el tipo de dato puntero en Pascal y muestra cmo utilizar la asignacin dinmica de memoria.

    El tipo abstracto de dato Lista, se estudia en el captulo 5. La implementacin ms usual son las listas enlazadas y por esta razn se analizan sus algoritmos de manipula-cin. Uno de los casos ms frecuentes en el diseo y construccin de estructura de datos es la ordenacin de elementos. El captulo describe el caso particular de las listas enla-zadas.

    Otros tipos de listas muy utilizadas en la manipulacin de estructuras de datos son las listas doblemente enlazadas y las listas circulares. Sus algoritmos de implementa-cin se estudian en el captulo 6.

    Las pilas y las colas son otros tipos de datos muy usuales en cualquier programa de software. Por esta razn se estudian en detalle junto con los procedimientos y funciones necesarios para poder utilizarlas. Estas estructuras de datos son listas, por lo que su

    ,

  • XXVI Estructura de datos

    implementacin se realizar, no slo con arrays, sino fundamentalmente mediante listas enlazadas o circulares. Los tipos abstractos de datos pila y cola se describen en los cap-tulos 7 y 8.

    El captulo 9 se dedica a la descripcin de la recursividad as como al uso de proce-dimientos y funciones recursivas. La recursividad es una propiedad esencial en el diseo de tcnicas algortmicas, por esta circunstancia se hace un estudio exhaustivo y detalla-do de los algoritmos recursivos clsicos y aquellos otros ms complejos. As se analizan los tpicos algoritmos de divide y vencers, como es el popular algoritmo de las Torres de Hanoi, hasta los algoritmos de vuelta atrs (backtraking) ms famosos y eficientes tales como: el problema de las ocho reinas, el problema de la mochila o el proble-ma de los matrimonios estables.

    El captulo 10 introduce al tipo de dato Arbol binario. Los rboles binarios son es-tructuras de datos recursivas y la mayora de sus propiedades se pueden definir recursi-vamente. Los rboles binarios tienen numerosas aplicaciones; entre ellas una de las ms usuales es la evaluacin de expresiones. En el captulo se describen tambin los descen-dientes de los rboles binarios, como es el caso de los rboles binarios de bsqueda. Las operaciones en los rboles binarios de bsqueda son motivo de anlisis a lo largo del captulo.

    Otro tipo de extensiones rboles son los complejos y eficientes rboles B y r-boles AVL o equilibrados. Sus algoritmos de manipulacin se describen en los cap-tulos 11 y 12.

    Los grafos son uno de los tipos de datos ms clsicos y de mayor utilidad en el diseo de problemas complejos. La implementacin y los algoritmos de manipulacin de grafos se estudian en el captulo 13. Sin embargo, un estudio completo de grafos y de la teora de grafos requiere mucho ms que un captulo; por esta circunstancia, se exami-nan aspectos avanzados en el captulo 14. As, se describen algoritmos complejos tales como los algoritmos de Dijkstra, Warshall, Floyd o Kruskal.

    Los mtodos clsicos de ordenacin, bsqueda y mezcla, tanto los ms sencillos has-ta otros complejos, se describen en el captulo 15. As se analizan los mtodos de orde-nacin por burbuja, seleccin, insercin, Shell, quicksort (rpido), mergesort (mezcla) o heapsort (montculo), junto con la ordenacin binaria (binsort) o radix (Radix-sort).

    Las tcnicas de anlisis de algoritmos y la medida de la eficiencia de los mismos se analizarn en el captulo 16. La notacin O grande utilizada en el anlisis de algoritmos se describe en dicho captulo 16.

    La estructura de datos clsica en cuanto a organizacin de los datos son los archivos (ficheros). La organizacin de archivos junto con las operaciones sobre los mismos se describen en el captulo 17. En el captulo 18 se describen los archivos de texto y los archivos indexados, junto con las tcnicas de direccionamiento aleatorio (hash).

    La ordenacin externa de estructuras de datos junto con los mtodos de implementa-. cin correspondiente se estudian en el captulo 19.

    El captulo 20 realiza una descripcin del tipo de dato objeto junto con la implemen-tacin de las propiedades clsicas que soportan tales como herencia y polimorfismo.

    Los apndices complementan el contenido terico del libro. El Apndice A es un vademcum de frmulas matemticas que se requieren normalmente en la construccin

  • Prlogo xxvii

    de algoritmos no slo numricos sino de gestin. El concepto de mdulo o unidad en Turbo Pascal es motivo de estudio en el apndice B, donde se describen las unidades estndar del compilador. El apndice C describe el editor de texto del compilador as como la descripcin de su funcionalidad. El apndice E describe los mtodos de depura-cin de programas en Turbo Borland Pascal y los mensajes y cdigos de error se inclu-yen en el apndice F. El apndice G es una amplia gua de referencia de sintaxis del compilador de Turbo Borland Pascal. El apndice H es una gua de usuario de ISO/ ANSI Pascal pensado en aqueIlos lectores que utilicen un compilador de Pascal estndar distinto del compilador Turbo Borland Pascal.

    AGRADECIMIENTOS

    Este libro no es slo fruto del trabajo de los autores, tal y como sucede con la creacin de la mayora de los libros tcnicos. Muchas personas han colaborado de una u otra manera para que este libro vea la luz.

    Entre estas personas queremos destacar aqueIlas que ms han influido en la versin ltima. Los profesores de Estructuras de datos, Lucas Snchez, Matilde Fernndez y Jess Prez, del Departamento de Lenguajes y Sistemas Informticos e Ingeniera de Software de la Facultad de Informtica y de la Escuela Universitaria de Informtica de la Universidad Pontificia de Salamanca (UPSA), con sus aportaciones y sugerencias fru-to de su larga experiencia como profesores de la asignatura Estructura de datos en el campus de Madrid, han ledo y revisado las primeras pruebas de imprenta de este libro, y nos han dado ideas y sugerencias que han mejorado notablemente el libro. Las profe-soras M.a Mar Garca e Isabel Torralvo y el profesor Joaqun Abeger, todos del mismo departamento que los profesores anteriores, tambin han ledo las galeradas del texto y han detectado erratas y depurado muchos programas del libro.

    Adems de los profesores anteriores, otros profesores de la Facultad y Escuela Uni-versitaria de Informtica de UPSA han ayudado y apoyado a que esta obra sea una rea-

    ,

    lidad: Paloma Centenera, Luis Villar y Angel Hermoso. A todos deseamos agradecer nuestro reconocimiento por su arduo trabajo. No slo

    nos han demostrado que son colegas, sino y sobre todo son amigos. Nuestras gracias ms sinceras a todos eIlos, sin su apoyo y trabajo esta obra no sera la misma.

    Naturalmente, no seramos justos si no reconociramos la inmensa ayuda que ha supuesto y seguir suponiendo las sugerencias, consejos y crticas que nuestros numero-sos alumnos de todos estos aos pasados nos han hecho tanto en Espaa como en Lati-noamrica. Son el mejor aliciente que cualquier profesor puede tener. En nuestro caso ha sido una realidad vivida da a da. Nuestro agradecimiento eterno.

    Una ltima reflexin

    Estructura de datos es una disciplina clave en los curriculum universitarios de inform-tica y computacin. En nuestra obra hemos volcado nuestra experiencia de ms de diez

    ,

    ,

  • I

    XXVIII Estructura de datos

    aos en la enseanza universitaria; nuestra esperanza es que hayamos conseguido trans-mitir dicha experiencia, y que nuestros lectores puedan no slo iniciarse en el aprendiza-je de las estructuras de los datos, sino llegar a dominar su concepto, organizacin, dise-o y manipulacin de los algoritmos correspondientes. El mayor deseo de los autores sera poder conseguir los objetivos del libro, que su aprendizaje sea gradual y que lle-guen a dominar este vital e importante campo informtico de las estructuras de datos.

    Madrid, julio de 1998 Los autores

  • ,

    ''''f>,-.: ',',>.' ,,' ',,:

    ,

    -,

    1

    ,

    ,

    ,

    I

    ,,',,;'.

    PARTE

    ,

    ,

    ,

    I , , , , ,

    ,

  • ,

    CAPITULO

    n

    a

    . ,

    enlerla eso . . ,

    are: Intro ucclon a meto

    ,

    o o la . ,

    e construcclon e es I ro

    .- - _ ., _. -. .. r, '" _ . :-:-, -: -/ ';"':. ','.

    CONTE

    1 .1 . Abstraccin.' 1.2. Resolucin de problemas de programacin. 1.3. Herramientas para la resolucin de problemas. 1.4. Factores en la calidad del software. 1.5. El ciclo de vida del software. 1.6. Mtodos formales de verificacin de programas. 1.7. Principios de diseos de sistemas de software. 1.8. Estilo de programacin. 1.9. La documentacin. 1.10. Depuracin. 1.11. Diseo de algoritmos. 1.12. Pruebas (testing). 1.13. Eficiencia. 1.14. Transportabilidad (portabilidad). RESUMEN. EJERCICIOS. PROBLEMAS.

    La produccin de un programa se puede dividir en diferentes fases: anlisis, diseo, codificacin y depuracin, prueba y mantenimiento. Estas fases se conocen como ciclo de vida del software, y son los prin-cipios bsicos en los que se apoya la ingeniera del software. Deben considerarse siempre todas las fases en el proceso de creacin de pro-gramas, sobre todo cuando stos son grandes proyectos. La ingeniera de o del software trata de la creacin y produccin de programas a gran escala.

    3

    jorgeResaltar

  • 4 Estructura de datos

    ,

    1.1. ABSTRACCION

    Los seres humanos se han convertido en la especie ms influyente de este planeta, debido a su capacidad para abstraer el pensamiento. Los sistemas complejos, sean naturales o artificiales, slo pueden ser comprendidos y gestionados cuando se omiten detalles que son irrelevantes a nuestras necesidades inmediatas. El proceso de excluir detalles no deseados o no significativos, al problema que se trata de resolver, se denomina abstraccin, y es algo que se hace en cualquier momento.

    Cualquier sistema de complejidad suficiente se puede visualizar en diversos niveles de abstraccin dependiendo del propsito del problema. Si nuestra intencin es conseguir una visin general del proceso, las caractersticas del proceso presente en nuestra abstrac-cin constar principalmente de generalizaciones. Sin embargo, si se trata de modificar partes de un sistema, se necesitar examinar esas partes con gran nivel de detalle. Consi-deremos el problema de representar un sistema relativamente complejo tal como un coche. El nivel de abstraccin ser diferente segn sea la persona o entidad que se relaciona con el coche: conductor, propietario, fabricante o mecnica.

    As, desde el punto de vista del conductor sus caractersticas se expresan en trminos de sus funciones (acelerar, frenar, conducir, etc.); desde el punto de vista del propietario sus caractersticas se expresan en funcin de nombre, direccin, edad; la mecnica del coche es una coleccin de partes que cooperan entre s para proveer las funciones citadas, mientras que desde el punto de vista del fabricante interesa precio, produccin anual de la empresa, duracin de construccin, etc. La existencia de diferentes niveles de abstrac-cin conduce a la idea de una jerarqua de abstracciones.

    Las soluciones a problemas no triviales tiene una jerarqua de abstracciones de modo que slo los objetivos generales son evidentes al nivel ms alto. A medida que se des-ciende en nivel los aspectos diferentes de la solucin se hacen evidentes.

    En un intento de controlar la complejidad, los diseadores del sistema explotan las caractersticas bidimensionales de la jerarqua de abstracciones. La primera etapa al tratar con un problema grande es seleccionar un nivel apropiado a las herramientas (hardware y software) que se utilizan para resolverlo. El problema se descompone entonces en subpro-blemas que se pueden resolver independientemente de modo razonable.

    , ,

    1.2. RESOLUCION DE PROBLEMAS DE PROGRAMACION

    El trmino resolucin del problema se refiere al proceso completo de tomar la descrip-cin del problema y desarrollar un programa de computadora que resuelva ese proble-ma. Este proceso requiere pasar a travs de muchas fases: desde una buena comprensin del problema a resolver, hasta el diseo de una solucin conceptual, para implementar la solucin con un programa de computadora.

    Realmente qu es una solucin? Normalmente, una solucin consta de dos compo-nentes: algoritmos y medios para almacenar datos. Un algoritmo es una especificacin concisa de un mtodo para resolver un problema. Una accin que un algoritmo realiza con frecuencia es operar sobre una coleccin de datos. Por ejemplo, un algoritmo puede

    i

    ,

    ,

    I ,

    ~ I

    "

    !

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

  • Ingeniera de software: introduccin a la metodologa de construccin de grandes programas 5

    tener que poner menos datos en una coleccin, quitar datos de una coleccin o realizar preguntas sobre una coleccin de datos. Cuando se construye una solucin, se deben organizar sus colecciones de datos de modo que se pueda operar sobre los datos fcil-mente en la manera que requiera el algoritmo. .

    Sin embargo, no slo se necesita almacenar los datos en estructuras de datos sino tambin operar sobre esos datos. De este modo una entidad fundamental ser el tipo abstracto de datos (TAO) (Abstract Data Type, ADT), que es una coleccin de datos y un conjunto de operaciones que actan sobre esos datos. Por ejemplo, supongamos que se necesita almacenar una coleccin de nombres de futbolistas de modo que permita una bsqueda rpida de un nombre dado. El algoritmo de bsqueda binaria que se estudiar en el captulo 15 pellnitir buscar en una lista (un array) eficientemente, si el array o lista est ordenado. Por consiguiente, una solucin a este problema es almacenar los nombres ordenados en un array y utilizar un algoritmo de bsqueda binaria para buscar en el array un nombre especificado. Un TAD que visualice el array ordenado junto con el algoritmo de bsqueda binaria resolver el problema.

    1.3. HER ENTAS PARA LA RESOLUCiN DE PROBLEMAS Diferentes herramientas ayudan al programador y al ingeniero de software a disear una solucin para un problema dado. Algunas de estas herramientas son diseo descendente, abstraccin procedimental, abstraccin de datos, ocultacin de la informacin, recursin o recursividad y programacin orientada a objetos.

    1.3.1. Diseo descendente Cuando se escriben programas de tamao y complejidad moderada, nos enfrentamos a la dificultad de escribir dichos programas. La solucin para resolver estos problemas y, naturalmente, aquellos de mayor tamao y complejidad, es recurrir a la modularidad mediante el diseo descendente. Qu significa diseo descendente y modularidad? La filosofia del diseo descendente reside en que se descompone una tarea en sucesivos niveles de detalle. Para ello se divide el programa en mdulos independientes proce-dimientos, funciones y otros bloques de cdigo ,como se observa en la Figura 1.1.

    Programa principal

    .. '

    Funcin F, Funcin F2 Procedimiento P,

    Figura 1.1. Un prOgrama dividido en mdulos independientes.

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

  • ,

    ,

    -------------_._ .. - ..

    6 Estructura de datos

    El concepto de solucin modular se aprecia en la aplicacin de la Figura 1.2, que busca encontrar la nota media de un conjunto de notas de una clase de informtica. Existe un mdulo del ms alto nivel que se va refinando en sentido descendente para encontrar mdulos adicionales ms pequeos. El resultado es una jerarqua de mdulos; cada mdulo se refina por los de bajo nivel que resuelve problemas ms pequeos y contiene ms detalles sobre los mismos. El proceso de refinamiento contina hasta que los mdulos de nivel inferior de la jerarqua sean tan simples como para traducirlos direc-tamente a procedimientos, funciones y bloques de cdigo en Pascal o C, que resuelven problemas independientes muy pequeos. De hecho, cada mdulo de nivel ms bajo debe ejecutar una tarea bien definida. Estos mdulos se denominan altamente cohesivos.

    Cada mdulo se puede dividir en subtareas. Por ejemplo, se puede refinar la tarea de leer las notas de una lista, dividindolo en dos subtareas. Por ejemplo, se puede refinar la tarea de leer las notas de la lista en otras dos subtareas: pedir al usuario una nota y situar la nota en la lista.

    1.3.2. Abstraccin procedimental Cada algoritmo que resuelve el diseo de un mdulo equivale a una caja negra que ejecuta una tarea determinada. Cada caja negra especifica lo que hace pero no cmo lo hace, y de igual modo cada caja negra conoce cuantas cajas negras existen y lo que hacen.

    Normalmente, estas cajas negras se implementan como subprogramas. Una abstrac-cin procedimental separa el propsito de un subprograma de su implementacin. Una vez que un subprograma se haya escrito o codificado, se puede usar sin necesidad de conocer su cuerpo y basta con su nombre y una descripcin de sus parmetros.

    La modularidad y abstraccin procedimental son complementarios. La modularidad implica romper una solucin en mdulos; la abstraccin procedimental implica la espe-cificacin de cada mdulo antes de su implementacin en Pascal. El mdulo implica que se puede cambiar su algoritmo concreto sin afectar el resto de la solucin.

    Encontrar la media

    Leer las notas Ordenar Obtener el elemento central de la lista la lista de la lista

    Pedir al usuario Situar la nota una lista en la lista

    Figura 1.2. Diagrama de bloques que muestra la jerarqua de mdulos.

    --- .- ._-------------------------------------

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

  • ... - - --- - - -----------------

    Ingeniera de software: introduccin a la metodologa de construccin de grandes programas 7

    La abstraccin procedimental es esencial en proyectos complejos, de modo que se pue-dan utilizar subprogramas escritos por otras personas, sin necesidad de tener que conocer sus algoritmos.

    1.3.3. Abstraccin de datos La abstraccin procedimental significa centrarse en lo que hace un mdulo en vez de en los detalles de cmo se implementan los detalles de sus algoritmos. De modo similar, la abstraccin de datos se centra en las operaciones que se ejecutan sobre los datos en vez de cmo se implementarn las operaciones.

    Como ya se ha comentado antes, un tipo abstracto de datos (TAD) es una colec-cin de datos y un conjunto de operaciones sobre esos datos. Tales operaciones pueden aadir nuevos datos, o quitar datos de la coleccin, o buscar algn dato. Los otros mdu-los de la solucin conocern qu operaciones puede realizar un TAD. Sin embargo, no conoce cmo se almacenan los datos ni cmo se realizan esas operaciones.

    Cada TAD se puede implementar utilizando estructuras de datos. Una estructura de datos es una construccin que se puede definir dentro de un lenguaje de programacin para almacenar colecciones de datos. En la resolucin de un problema, los tipos abstractos de datos soportan algoritmos y los algoritmos son parte de los que constituye un TAD. Para disear una solucin, se deben desarrollar los algoritmos y los TAD al unsono.

    1.3.4. Ocultacin de la informacin La abstraccin identifica los aspectos esenciales de mdulos y estructura de datos que se pueden tratar como cajas negras. La abstraccin es responsable de sus vistas externas o pblicas, pero tambin ayuda a identificar los detalles que debe ocultar de la vista pblica (vista privada). El principio de ocultacin de la informacin no slo oculta los detalles dentro de la caja negra, sino que asegura que ninguna otra caja negra pueda acceder a estos detalles ocultos. Por consiguiente, se deben ocultar ciertos detalles dentro de sus mdulos y TAD y los hacen inaccesibles a otros mdulos y TAD.

    Un usuario de un mdulo no se preocupa sobre los detalles de su implementacin y, al contrario, un desarrollador de un mdulo o TAD no se preocupa sobre sus usos.

    1.3.5. Programacin orientada a objetos Los conceptos de modularidad, abstraccin procedimental, abstraccin de datos y ocul-tacin de la informacin conducen a la programacin orientada a objetos, basada en el mdulo o tipo de dato objeto.

    Las prioridades fundamentales de un tipo son: encapsulamientos, herencia y polimor-fismo. El encapsulamiento es la combinacin de datos y operaciones que se pueden ejecutar sobre esos datos en un objeto. En Turbo Borland Pascal el encapsulamiento en un objeto se codifica mediante una unidad.

    Herencia es la propiedad que permite a un objeto transmitir sus propiedades a otros objetos denominados descendientes; la herencia permite la reutilizacin de objetos que

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

    jorgeResaltar

  • I

    8 Estructura de datos

    se hayan definido con anterioridad. El polimorfismo es la propiedad que permite deci-dir en tiempo de ejecucin la funcin a ejecutar, al contrario que sucede cuando no exis-te polimorfismo en el que la funcin a ejecutar se decide previamente y sin capacidad de modificacin, en tiempo de ejecucin.

    1.4. FACTORES EN LA CALIDAD DEL SOFTWARE

    La construccin