TY - BOOK AU - Weiss,Mark Allen TI - Estructuras de datos en java TM compatible con java TM2 SN - 8478290354 PY - 2000/// CY - Madrid PB - Pearson KW - PROGRAMACION DE COMPUTADORAS KW - LENGUAJE DE PROGRAMACION KW - JAVA N1 - CONTENIDO PRIMERA PARTE. Un recorrido por Java 1. Java básico 3 1.1. El entorno general 4 1.2. El primer programa 5 1.2.1. Comentarios 5 1.2.2. main 5 1.2.3. Salida por pantalla 6 1.3. Tipos primitivos 6 1.3.1. Los tipos primitivos 6 1.3.2. Las constantes 7 1.3.3. Declaración e inicialización de tipos primitivos 7 1.3.4. Entrada y salida por Terminal 8 1.4. Operadores básicos 8 1.4.1. Operadores de asignación 8 1.4.2. Operadores aritméticos binarios 9 1.4.3. Operadores unarios 10 1.4.4. Conversiones de tipo 10 1.5. Instrucciones condicionales 11 1.5.1. Operadores relacionales y de igualdad 11 1.5.2. Operadores lógicos 11 1.5.3. La instrucción if 12 1.5.4. La instrucción while 13 1.5.5. La instrucción for 14 1.5.6. La instrucción do 15 1.5.7. break y continue 15 1.5.8. La instrucción switch 16 1.5.9. El operador condicional 17 1.6. Métodos 18 1.6.1. Sobrecarga de los nombres de los métodos 18 1.6.2. Clases de almacenamiento 19 2. Referencias 25 2.1. ¿Qué es una referencia? 25 2.2. Nociones básicas sobre objetos y referencias 27 2.2.1. El operador punto (.) 28 2.2.2. Declaración de objetos 28 2.2.3. Recogida de basura 29 2.2.4. El significado de 29 2.2.5. Paso de parámetros 30 2.2.6. El significado de 31 2.2.7. Sobrecarga de operadores para objetos 31 2.3. Cadenas de caracteres 31 2.3.1. Conceptos básicos de la manipulación de Strings 32 2.3.2. Concatenación de cadenas 32 2.3.3. Comparando cadenas 33 2.3.4. Otros métodos del tipo String 33 2.3.5. Conversión entre cadenas y tipos primitivos 33 2.4. Vectores 34 2.4.1. Declaración, asignación y métodos 34 2.4.2. Expansión dinámica de vectores 36 2.4.3. Vectores multidimensionales 37 2.4.4. Argumentos de la línea de comandos 39 2.5. Manejo de excepciones 39 2.5.1. Procesamiento de excepciones 39 2.5.2. La cláusula finally 40 2.5.3. Excepciones más comunes 41 2.5.4. Las cláusulas throw y throws 42 2.6. Entrada y salida 42 2.6.1. Operaciones básicas de E/S 43 2.6.2. El objeto StringTokenizer 44 2.6.3. Ficheros de acceso secuencial 45 3. Objetos y clases 51 3.1. ¿Qué es la programación orientada a objetos? 51 3.2. Un ejemplo sencillo 53 3.3. Javadoc 54 3.4. Métodos básicos 57 3.4.1. Constructores 57 3.4.2. Métodos modificadores y de acceso 57 3.4.3. Salida y toString 58 3.4.4. equals 58 3.4.5. Métodos static 59 3.4.6. main 60 3.5. Paquetes 60 3.5.1. La directiva import 60 3.5.2. La instrucción package 61 3.5.3. La variable de entorno CLASSPATH 62 3.5.4. Reglas de visibilidad amistosa dentro de un paquete 63 3.5.5. Compilación separada 64 3.6. Construcciones adicionales 64 3.6.1. La referencia this 64 3.6.2. La abreviatura this para constructores 65 3.6.3. El operador instanceof 65 3.6.4. Atributos estáticos 65 3.6.5. Inicializadores estáticos 66 4. Herencia 73 4.1. ¿Qué es la herencia? 73 4.2. Sintaxis básica de Java 76 4.2.1. Reglas de visibilidad 76 4.2.2. El constructor y super 77 4.2.3. Métodos y clases finales 78 4.2.4. Sobreescribiendo un método 79 4.2.5. Métodos y clases abstractos 79 4.3. Ejemplo: extensión de la clase Figura 82 4.3.1. Disgresión: una introducción a la ordenación 84 4.4. Herencia múltiple 87 4.5. El interfaz 88 4.5.1. Especificación de una interfaz 88 4.5.2. Implementación de una interfaz 89 4.5.3. Varias interfaces 91 4.6. Implementación de componentes genéricas 91 SEGUNDA PARTE. Algoritmos y fundamentos de programación 5. Análisis de algoritmos 103 5.1. ¿Qué es el análisis de algoritmos? 104 5.2. Ejemplos de tiempo de ejecución de algoritmos 107 5.3. El problema de la subsecuencia de suma máxima 108 5.3.1. El algoritmo O(N3) obvio 109 5.3.2. Un algoritmo mejorado O(N2) 112 5.3.3. Un algoritmo lineal 113 5.4. Reglas generales para la notación O 114 5.5. Logaritmos 119 5.6. Problema de la búsqueda estática 121 5.6.1. Búsqueda secuencial 121 5.6.2. Búsqueda binaria 122 5.6.3. Búsqueda interpolada 124 5.7. Comprobar el análisis de un algoritmo 125 5.8. Limitaciones del análisis O 127 6. Estructuras de datos 137 6.1. ¿Por qué necesitamos estructuras de datos? 137 6.2. Las pilas 139 6.2.1. Las pilas y los lenguajes de programación 141 6.3. Las colas 142 6.4. Listas enlazadas 144 6.5. Arboles generales 147 6.6. Arboles binarios de búsqueda 149 6.7. Tablas hash 153 6.8. Colas de prioridad 155 7. Recursión 165 7.1. ¿Qué es la recursión? 165 7.2. Fundamentos: demostraciones por inducción matemática 166 7.3. Recursión básica 170 7.3.1. Impresión de números en cualquier base 170 7.3.2. ¿Por qué funciona? 172 7.3.3. Cómo funciona 174 7.3.4. Demasiada recursión puede ser peligrosa 175 7.3.5. Ejemplos adicionales 176 7.4. Aplicaciones numéricas 180 7.4.1. Aritmética modular 181 7.4.2. Exponenciación modular 181 7.4.3. Máximo común divisor e inversos multiplicativos 183 7.4.4. El sistema de criptografía RSA 185 7.5. Algoritmos divide y vencerás 188 7.5.1. El problema de la subsecuencia de suma máxima 188 7.5.2. Análisis de un algoritmo divide y vencerás sencillo 190 7.5.3. Una cota superior general para los tiempos de ejecución de los algoritmos divide y vencerás 195 7.6. Programación dinámica 197 7.7. Algoritmos de vuelta atrás 201 8. Algoritmos de ordenación 213 8.1. ¿Por qué es importante la ordenación? 213 8.2. Preliminares 215 8.3. Análisis de la ordenación por inserción y otras ordenaciones simples 215 8.4. Shellsort 217 8.4.1. Rendimiento de Shellsort 219 8.5. Mergesort 221 8.5.1. Mezcla lineal de vectores ordenados 221 8.5.2. El algoritmo mergesort 224 8.6. Quicksort 225 8.6.1. El algoritmo quicksort 225 8.6.2. Análisis de quicksort 227 8.6.3. Seleccionando el pivote 230 8.6.4. Estrategia de partición 232 8.6.5. Elementos iguales al pivote 234 8.6.6. Partición con la mediana de tres 234 8.6.7. Vectores pequeños 235 8.6.8. Rutina de quicksort en Java 236 8.7. Selección rápida 238 8.8. Una cola inferior para la ordenación 240 9. Números aleatorios 249 9.1. ¿Por qué son necesarios los números aleatorios? 249 9.2. Generadores de números aleatorios 250 9.3. Números aleatorios no uniformes 256 9.4. Generación de una permutación aleatoria 258 9.5. Algoritmos aleatorios 259 9.6. Test aleatorio de primalidad 261 TERCERA PARTE. Aplicaciones 10. Juegos y diversión 273 10.1. Sopas de letras 273 10.1.1 Teoría 274 10.1.2. Implementación en Java 276 10.2. El juego de las tres en raya 281 10.2.1. Poda alfa-beta 281 10.2.2. Tablas de transposición 282 10.3. El ajedrez 285 11. Las pilas y los compiladores 291 11.1. Analizador de símbolos equilibrados 291 11.1.1. El algoritmo básico 291 11.1.2. Implementación 293 11.2. Una calculadora sencilla 301 11.2.1. Máquinas postfijas 302 11.2.2. Conversión de notación infija a postfija 302 11.2.3. Implementación 305 11.2.4. Arboles sintácticos de expresiones 312 12. Utilidades 317 12.1. Compresión de ficheros 317 12.1.1. Códigos sin prefijos 318 12.1.2. Algoritmo de Huffman 320 12.1.3. La fase de codificación 322 12.1.4. La fase de decodificación 323 12.1.5. Consideraciones prácticas 324 12.2. Generador de referencias cruzadas 324 12.2.1. Ideas básicas 324 12.2.2. Implementación en Java 325 13. Simulación 335 13.1. El problema Josephus 335 13.1.1. La solución simple 336 13.1.2. Un algoritmo más eficiente 338 13.2. Simulación dirigida por eventos 340 13.2.1. Ideas básicas 340 13.2.2. Ejemplo: simulación de un banco de módems 341 14. Grafos y caminos 353 14.1. Definiciones 353 14.1.1. Representación 355 14.2. Problema del camino mínimo sin pesos 366 14.2.1. Teoría 366 14.2.2. Implementación en Java 370 14.3. Problema de los caminos mínimos con pesos positivos 371 14.3.1. Teoría: algoritmo de Dijkstra 371 14.3.2. Implementación en Java 375 14.4. Problema del camino mínimo con costes negativos 376 14.4.1. Teoría 376 14.4.2. Implementación en Java 377 14.5. Problemas de caminos en grafos acíclicos 379 14.5.1. Ordenación topológica 379 14.5.2. Teoría del algoritmo de caminos mínimos con un grafo acíclico 381 14.5.3. Implementación en Java 382 14.5.4. Una aplicación: análisis de caminos críticos 382 CUARTA PARTE. Implementaciones 15. Pilas y colas 395 15.1. Implementación dinámica de vectores 395 15.1.1. Pilas 395 15.1.2. Colas 399 15.2. Implementaciones con listas enlazadas 404 15.2.1. Pilas 404 15.2.2. Colas 408 15.3. Comparación de los dos métodos 409 15.4. Colas dobles 411 16. Listas enlazadas 415 16.1. Ideas básicas 415 16.1.1. Nodos cabecera 417 16.1.2. Clases iteradoras 418 16.2. Implementación en Java 419 16.3. Listas doblemente enlazadas y listas enlazadas circulares 426 16.4. Listas enlazadas ordenadas 428 17. Arboles 435 17.1. Arboles generales 435 17.1.1. Definiciones 435 17.1.2. Implementación 437 17.1.3. Una aplicación: sistemas de ficheros 437 17.2. Arboles binarios 441 17.3. Arboles y recursión 448 17.4. Recorrido de árboles: clases iteradoras 450 17.4.1. Recorrido en postorden 453 17.4.2. Recorrido en orden simétrico 457 17.4.3. Recorrido en preorden 458 17.4.4. Recorrido por niveles 459 18. Arboles binarios de búsqueda 467 18.1. Ideas básicas 467 18.1.1. Las operaciones 468 18.1.2. Implementación en Java 470 18.2. Búsqueda por posición en el orden 477 18.2.1. Implementación en Java 477 18.3. Análisis de las operaciones de los árboles binarios de búsqueda 481 18.4. Arboles AVL 484 18.4.1. Propiedades 485 18.4.2. Rotación simple 487 18.4.3. Rotación doble 490 18.4.4. Resumen de la inserción en un árbol AVL 492 18.5. Arboles rojinegros 492 18.5.1. Inserción ascendente 493 18.5.2. Arboles rojinegros descendentes 495 18.5.3. Implementación en Java 497 18.5.4. Eliminación descendente 503 18.6. AA-Arboles 505 18.6.1. Inserción 506 18.6.2. Eliminación 509 18.6.3. Implementación en Java 509 18.7. B-Arboles 512 19. Tablas hash 527 19.1. Ideas básicas 527 19.2. Función de localización 529 19.3. Exploración lineal 531 19.3.1. Análisis de la exploración lineal 532 19.3.2. Lo que sucede realmente: la agrupación primaria 533 19.3.3. Análisis de la operación buscar 534 19.4. Exploración cuadrática 536 19.4.1. Implementación en Java 541 19.4.2. Análisis de la exploración cuadrática 544 19.5. Hashing enlazado 545 20. Una cola de prioridad: el montículo binario 553 20.1. Ideas básicas 553 20.1.1. Propiedad estructural 554 20.1.2. Propiedad de ordenación de los montículos 555 20.1.3. Operaciones permitidas 556 20.2. Implementación de las operaciones básicas 559 20.2.1. insertar 559 20.2.2. eliminarMin 562 20.3. arreglarMontículo: construcción en tiempo lineal del montículo 564 20.4. Operaciones avanzadas: reducirClave y mezclar 568 20.5. Ordenación interna: método del montículo 568 20.6. Ordenación externa 571 20.6.1. Por qué necesitamos nuevos algoritmos 572 20.6.2. Modelo de ordenación externa 572 20.6.3. El algoritmo sencillo 572 20.6.4. Mezcla multiaria 574 20.6.5. Mezcla multifase 575 20.6.6. Selección del reemplazo 576 QUINTA PARTE. Estructuras de datos avanzadas 21. Arboles de ensanchamiento 587 21.1. Auto-ajustamiento y análisis amortizado 587 21.1.1. Cotas de tiempo amortizadas 588 21.1.2. Una estrategia simple de auto-ajustamiento (que no funciona) 589 21.2. Arboles básicos de ensanchamiento ascendente 591 21.3. Operaciones básicas de los árboles de ensanchamiento 593 21.4. Análisis del ensanchamiento ascendente 594 21.4.1. Demostración de la cota de ensanchamiento 597 21.5. Arboles de ensanchamiento descendente 600 21.6. Implementación de los árboles con ensanchamiento descendente 602 21.7. Comparaciones de los árboles de ensanchamiento con otros árboles de búsqueda 608 22. Colas de prioridad con mezcla 613 22.1. Los montículos sesgados 613 22.1.1. La mezcla es importante 613 22.1.2. Mezcla simple de árboles con ordenación de montículos 614 22.1.3. El montículo sesgado: una modificación sencilla 615 22.1.4. Análisis del montículo sesgado 616 22.2. Los montículos de emparejamientos 618 22.2.1. Operaciones del montículo de emparejamientos y teoría 618 22.2.2. Implementación del montículo de emparejamientos 620 22.2.3. Aplicación: el algoritmo de Dijkstra para la obtención de caminos mínimos 626 23. Estructura de partición 633 23.1. Relaciones de equivalencia 633 23.2. Equivalencia dinámicas y dos aplicaciones 634 23.2.1. Aplicación #1: árboles de recubrimiento mínimo 635 23.2.2. Aplicación #2: el problema del antecesor común mas próximo 637 23.3. El algoritmo de búsqueda rápida 641 23.4. El algoritmo de unión rápida 642 23.4.1. Algoritmos de unión inteligentes 643 23.4.2. Compresión de caminos 645 23.5. Implementación en Java 647 23.6. Caso peor de la unión por rango y la compresión de caminos 648 23.6.1. Análisis del algoritmo unir/buscar 649 APENDICES A. Plataformas para Java B. Operadores C. Algunas rutinas de librerías D. Interfaces gráficas de usuario Indice analítico ER -