Este documento describe plantillas de clases y funciones en C++. Cubre temas como declaración y definición de plantillas de clase, instanciación de plantillas de clase, métodos de plantillas de clase, plantillas de funciones, sobrecarga de plantillas, amistad en plantillas de clase, y tipos anidados en plantillas de clase.
Una cola de prioridad es una estructura de datos que permite insertar elementos y eliminar el elemento mínimo de forma eficiente. Se implementa comúnmente mediante un montículo binario, el cual es un árbol binario completo donde cada nodo es menor que sus descendientes. Las operaciones de inserción y eliminación mínimo en un montículo binario pueden requerir intercambios recursivos de nodos para mantener esta propiedad.
La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real que otros tipos de programación.
La programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos en sus interacciones, para diseñar aplicaciones y programas informáticos.
Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de programación.
Está basada en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento. Su uso se popularizó a principios de la década de 1990. En la actualidad, existe una gran variedad de lenguajes de programación que soportan la orientación a objetos.
El documento habla sobre las funciones en C++. Define una función como un grupo de sentencias o declaraciones con un nombre asignado que puede ser llamado desde cualquier parte del programa. Explica la sintaxis de las funciones, cómo pasar argumentos por valor y referencia, el uso de void, valores por defecto, recursividad y otras consideraciones de eficiencia.
Conceptos básicos de programación orientada a objetos (poo)Maria Garcia
CONCEPTOS BÁSICOS DE PROGRAMACIÓN ORIENTADA A OBJETOS (POO)
Dentro del perfil de egresado en licenciatura en informática se encuentra que éste debe propiciar proyectos investigativos que contribuyan a la solución de problemas de la comunidad educativa, es ahí donde este módulo proporcionará a los estudiantes tener una visión más amplia en cuanto al tema tecnológico y le permitirán crear proyectos más enriquecedores
Desarrollar un paquete que permita darle mantenimiento a la tabla dept (crear un procedimiento para cada acción de actualización). Crear un disparador que permita auditar las acciones realizadas en la tabla Dep. (Tabla auditoria). Ejecutar los procedimientos a través de un bloque PL/SQL en SQL*PLUS.
Este documento describe los arreglos unidimensionales y bidimensionales (matrices) en Java. Explica cómo declarar, crear e inicializar arreglos y matrices, así como cómo acceder a sus elementos utilizando índices. También incluye ejemplos de código para declarar y manipular arreglos y matrices, como llenarlos con datos y mostrar su contenido.
El polimorfismo permite que objetos de diferentes tipos respondan al mismo método de forma diferente. Se da cuando una clase hereda de otra y redefine algunos de sus métodos, o cuando métodos con el mismo nombre operan de forma distinta dependiendo del tipo de datos de entrada. Existen tres tipos principales de polimorfismo: sobrecarga, paramétrico y de subtipado.
Este documento discute la animación de actores en Greenfoot. Explica que los constructores en World se agregan de forma predeterminada, mientras que los constructores en los actores no se agregan. También describe cómo usar múltiples imágenes para crear una animación suave y cómo las imágenes transparentes permiten efectos más realistas.
Una cola de prioridad es una estructura de datos que permite insertar elementos y eliminar el elemento mínimo de forma eficiente. Se implementa comúnmente mediante un montículo binario, el cual es un árbol binario completo donde cada nodo es menor que sus descendientes. Las operaciones de inserción y eliminación mínimo en un montículo binario pueden requerir intercambios recursivos de nodos para mantener esta propiedad.
La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real que otros tipos de programación.
La programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos en sus interacciones, para diseñar aplicaciones y programas informáticos.
Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de programación.
Está basada en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento. Su uso se popularizó a principios de la década de 1990. En la actualidad, existe una gran variedad de lenguajes de programación que soportan la orientación a objetos.
El documento habla sobre las funciones en C++. Define una función como un grupo de sentencias o declaraciones con un nombre asignado que puede ser llamado desde cualquier parte del programa. Explica la sintaxis de las funciones, cómo pasar argumentos por valor y referencia, el uso de void, valores por defecto, recursividad y otras consideraciones de eficiencia.
Conceptos básicos de programación orientada a objetos (poo)Maria Garcia
CONCEPTOS BÁSICOS DE PROGRAMACIÓN ORIENTADA A OBJETOS (POO)
Dentro del perfil de egresado en licenciatura en informática se encuentra que éste debe propiciar proyectos investigativos que contribuyan a la solución de problemas de la comunidad educativa, es ahí donde este módulo proporcionará a los estudiantes tener una visión más amplia en cuanto al tema tecnológico y le permitirán crear proyectos más enriquecedores
Desarrollar un paquete que permita darle mantenimiento a la tabla dept (crear un procedimiento para cada acción de actualización). Crear un disparador que permita auditar las acciones realizadas en la tabla Dep. (Tabla auditoria). Ejecutar los procedimientos a través de un bloque PL/SQL en SQL*PLUS.
Este documento describe los arreglos unidimensionales y bidimensionales (matrices) en Java. Explica cómo declarar, crear e inicializar arreglos y matrices, así como cómo acceder a sus elementos utilizando índices. También incluye ejemplos de código para declarar y manipular arreglos y matrices, como llenarlos con datos y mostrar su contenido.
El polimorfismo permite que objetos de diferentes tipos respondan al mismo método de forma diferente. Se da cuando una clase hereda de otra y redefine algunos de sus métodos, o cuando métodos con el mismo nombre operan de forma distinta dependiendo del tipo de datos de entrada. Existen tres tipos principales de polimorfismo: sobrecarga, paramétrico y de subtipado.
Este documento discute la animación de actores en Greenfoot. Explica que los constructores en World se agregan de forma predeterminada, mientras que los constructores en los actores no se agregan. También describe cómo usar múltiples imágenes para crear una animación suave y cómo las imágenes transparentes permiten efectos más realistas.
El documento describe el polimorfismo en C++. Explica que el polimorfismo permite que diferentes implementaciones de una función puedan ser accedidas a través del mismo nombre. Proporciona ejemplos de cómo implementar polimorfismo en C++ usando herencia, funciones virtuales y punteros/referencias a clases base. También discute la diferencia entre polimorfismo y sobrecarga.
Este documento presenta información sobre abstracción en programación orientada a objetos. Define una clase abstracta como aquella sobre la cual no se pueden crear objetos concretos. Explica que las clases abstractas permiten definir métodos y propiedades comunes a todas las subclases, aunque algunos métodos pueden quedar sin implementar y marcarse como abstractos hasta que se definan en las clases hijas. Las clases abstractas soportan polimorfismo al permitir que objetos de clases derivadas respondan a métodos declarados en la clase padre abstracta.
Este documento describe los tipos de datos abstractos (TDA), que son tipos de datos definidos por el programador que pueden manipularse mediante operaciones primitivas. Explica que un TDA está formado por un conjunto de elementos válidos y operaciones que se pueden realizar sobre ellos. Además, detalla que un TDA debe tener una interfaz de utilización que defina las operaciones y ocultar la representación interna de los datos.
Este documento describe los conceptos fundamentales del código fuente y la documentación en Java. Explica los componentes del código fuente como la descripción de la clase, los métodos, los comentarios y la documentación. También cubre temas como cómo invocar métodos, usar sentencias if, y mostrar la orientación de objetos mediante métodos.
El documento describe la estructura básica de un método en programación orientada a objetos. Explica que un método permite crear, cambiar el estado u obtener valores de atributos de un objeto. Luego detalla que un método contiene especificadores de tipo de retorno, nombre, lista de parámetros entre paréntesis y bloque de instrucciones, pudiendo incluir también lista de excepciones y sentencia return. Finalmente hace 4 preguntas sobre aspectos específicos de los métodos.
The document discusses abstract classes and interfaces in object-oriented programming. It defines abstract classes as classes that can contain both abstract and non-abstract methods but cannot be instantiated. Interfaces are blueprints of classes that can only contain abstract methods and achieve abstraction and multiple inheritance in Java. The key differences are that abstract classes can contain method implementations while interfaces only contain abstract methods.
Este documento describe conceptos fundamentales de Java como métodos, variables, parámetros, herencia y depuración. Explica que los métodos son operaciones que pueden realizar objetos, y que los parámetros proporcionan datos adicionales a los métodos. También describe que las variables permiten almacenar información en objetos y que la herencia significa que las subclases heredan métodos de sus superclases.
TECNOLÓGICO NACIONAL DE MÉXICOInstituto Tecnológico Superior de Guasave
Ingeniería en Sistemas Computacionales
Fundamentos de Programación
Unidad V: Modularidad
Retícula ISIC-2010-224: Programa: AED-1285
Este documento describe cadenas y funciones de cadena en C++. Explica que las cadenas se almacenan como arrays de caracteres terminados en nulo y presenta conceptos como inicialización, declaración y asignación de cadenas. También resume funciones importantes para manipular cadenas en la biblioteca string.h como strcpy(), strcmp() y getline() y cómo pasar arrays y cadenas como parámetros en funciones.
En el presente se muestra la solución de un ejercicio de multilistas del libro: Estructura de Datos Orientada a Objetos, Algoritmos con C++ de Silvia Guardatti, en el capitulo de Listas.
Este documento describe el polimorfismo en Java, incluyendo su definición como "una interfaz, múltiples métodos". Explica conceptos como sobrescritura, sobrecarga, clases y métodos abstractos, e interfaces. También incluye ejemplos de polimorfismo utilizando una jerarquía de clases de instrumentos musicales y figuras geométricas.
Este documento proporciona instrucciones sobre cómo usar estructuras de control como sentencias if, bucles while y anidamiento en el programa Alice 3. Explica cómo agregar comentarios para explicar el propósito de cada bloque de código anidado y recomienda diseñar la animación de antemano para facilitar la codificación. También advierte sobre los peligros de los bucles infinitos no intencionales.
The document provides an overview of C++ vs C# by Shubhra Chauhan. It discusses the key object-oriented programming concepts like classes, objects, inheritance, polymorphism, and how they are implemented in C++ and C#. It includes code examples to demonstrate class usage and inheritance in both languages. The document also compares some similarities and differences between C++ and C# like support for pointers, preprocessors, structures, and goto statements.
Este documento describe los conceptos de generalización, especialización y herencia. La generalización permite compartir información entre clases mediante el establecimiento de una clase base común. La especialización crea clases derivadas más específicas a partir de la clase base. La herencia permite que las clases derivadas hereden atributos y métodos de la clase base y agreguen características propias. Se proveen ejemplos de cómo estas técnicas pueden utilizarse para evitar la redundancia de código y promover la reutilización.
- El documento presenta el tema 4 del curso ISO 13606 sobre el modelo de arquetipos.
- Explica las características básicas de los arquetipos, como que representan estructuras de información clínica basadas en el modelo de referencia y pueden ser procesados automáticamente.
- Describe cómo se definen los arquetipos mediante restricciones sobre objetos, atributos y valores del modelo de referencia, usando la herramienta LinkEHR para ilustrar el proceso de edición.
Son estructuras de datos que agrupan muchos datos del mismo tipo, en donde cada elemento se puede trabajar individualmente y se puede referenciar con un mismo nombre. Se usan para representar datos que pueden verse como una tabla con filas y columnas.
Este documento explica las pilas y colas como tipos abstractos de datos. Detalla que las pilas siguen el orden LIFO (último en entrar, primero en salir), mientras que las colas siguen FIFO (primero en entrar, primero en salir). Describe las operaciones básicas de cada una como apilar/desapilar y encolar/desencolar. También incluye ejemplos de código Java para implementar pilas y colas.
El documento describe los elementos clave de un diagrama de clases UML, incluyendo clases, relaciones y interfaces. Las clases representan conceptos u objetos, las relaciones muestran las dependencias entre clases como asociación, agregación, composición o herencia, e interfaces definen contratos de comportamiento.
Una pila es una estructura de datos que sigue el principio LIFO (último en entrar, primero en salir), donde los elementos se agregan y eliminan de la parte superior de la pila. Existen dos formas de implementar una pila en C++: mediante un vector estático, que limita el tamaño máximo, o mediante nodos dinámicos enlazados, que permite un tamaño variable. Las operaciones básicas de una pila son crear, apilar, desapilar y consultar la cima.
Este documento describe diferentes estructuras de datos como listas, pilas y colas. Presenta sus definiciones, objetos del mundo real que pueden modelarse con ellas, y operaciones básicas. También propone TADs para representar estas estructuras y describe cómo los lenguajes de programación permiten implementarlas utilizando vectores, punteros y otras técnicas.
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellJosé A. Alonso
Se especifica el tipo abstracto de datos de las colas de prioridad, se presenta su implementación en Haskell mediante listas y se comprueban sus propiedades características con QuickCheck.
Este es el tema 16 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
El documento describe el polimorfismo en C++. Explica que el polimorfismo permite que diferentes implementaciones de una función puedan ser accedidas a través del mismo nombre. Proporciona ejemplos de cómo implementar polimorfismo en C++ usando herencia, funciones virtuales y punteros/referencias a clases base. También discute la diferencia entre polimorfismo y sobrecarga.
Este documento presenta información sobre abstracción en programación orientada a objetos. Define una clase abstracta como aquella sobre la cual no se pueden crear objetos concretos. Explica que las clases abstractas permiten definir métodos y propiedades comunes a todas las subclases, aunque algunos métodos pueden quedar sin implementar y marcarse como abstractos hasta que se definan en las clases hijas. Las clases abstractas soportan polimorfismo al permitir que objetos de clases derivadas respondan a métodos declarados en la clase padre abstracta.
Este documento describe los tipos de datos abstractos (TDA), que son tipos de datos definidos por el programador que pueden manipularse mediante operaciones primitivas. Explica que un TDA está formado por un conjunto de elementos válidos y operaciones que se pueden realizar sobre ellos. Además, detalla que un TDA debe tener una interfaz de utilización que defina las operaciones y ocultar la representación interna de los datos.
Este documento describe los conceptos fundamentales del código fuente y la documentación en Java. Explica los componentes del código fuente como la descripción de la clase, los métodos, los comentarios y la documentación. También cubre temas como cómo invocar métodos, usar sentencias if, y mostrar la orientación de objetos mediante métodos.
El documento describe la estructura básica de un método en programación orientada a objetos. Explica que un método permite crear, cambiar el estado u obtener valores de atributos de un objeto. Luego detalla que un método contiene especificadores de tipo de retorno, nombre, lista de parámetros entre paréntesis y bloque de instrucciones, pudiendo incluir también lista de excepciones y sentencia return. Finalmente hace 4 preguntas sobre aspectos específicos de los métodos.
The document discusses abstract classes and interfaces in object-oriented programming. It defines abstract classes as classes that can contain both abstract and non-abstract methods but cannot be instantiated. Interfaces are blueprints of classes that can only contain abstract methods and achieve abstraction and multiple inheritance in Java. The key differences are that abstract classes can contain method implementations while interfaces only contain abstract methods.
Este documento describe conceptos fundamentales de Java como métodos, variables, parámetros, herencia y depuración. Explica que los métodos son operaciones que pueden realizar objetos, y que los parámetros proporcionan datos adicionales a los métodos. También describe que las variables permiten almacenar información en objetos y que la herencia significa que las subclases heredan métodos de sus superclases.
TECNOLÓGICO NACIONAL DE MÉXICOInstituto Tecnológico Superior de Guasave
Ingeniería en Sistemas Computacionales
Fundamentos de Programación
Unidad V: Modularidad
Retícula ISIC-2010-224: Programa: AED-1285
Este documento describe cadenas y funciones de cadena en C++. Explica que las cadenas se almacenan como arrays de caracteres terminados en nulo y presenta conceptos como inicialización, declaración y asignación de cadenas. También resume funciones importantes para manipular cadenas en la biblioteca string.h como strcpy(), strcmp() y getline() y cómo pasar arrays y cadenas como parámetros en funciones.
En el presente se muestra la solución de un ejercicio de multilistas del libro: Estructura de Datos Orientada a Objetos, Algoritmos con C++ de Silvia Guardatti, en el capitulo de Listas.
Este documento describe el polimorfismo en Java, incluyendo su definición como "una interfaz, múltiples métodos". Explica conceptos como sobrescritura, sobrecarga, clases y métodos abstractos, e interfaces. También incluye ejemplos de polimorfismo utilizando una jerarquía de clases de instrumentos musicales y figuras geométricas.
Este documento proporciona instrucciones sobre cómo usar estructuras de control como sentencias if, bucles while y anidamiento en el programa Alice 3. Explica cómo agregar comentarios para explicar el propósito de cada bloque de código anidado y recomienda diseñar la animación de antemano para facilitar la codificación. También advierte sobre los peligros de los bucles infinitos no intencionales.
The document provides an overview of C++ vs C# by Shubhra Chauhan. It discusses the key object-oriented programming concepts like classes, objects, inheritance, polymorphism, and how they are implemented in C++ and C#. It includes code examples to demonstrate class usage and inheritance in both languages. The document also compares some similarities and differences between C++ and C# like support for pointers, preprocessors, structures, and goto statements.
Este documento describe los conceptos de generalización, especialización y herencia. La generalización permite compartir información entre clases mediante el establecimiento de una clase base común. La especialización crea clases derivadas más específicas a partir de la clase base. La herencia permite que las clases derivadas hereden atributos y métodos de la clase base y agreguen características propias. Se proveen ejemplos de cómo estas técnicas pueden utilizarse para evitar la redundancia de código y promover la reutilización.
- El documento presenta el tema 4 del curso ISO 13606 sobre el modelo de arquetipos.
- Explica las características básicas de los arquetipos, como que representan estructuras de información clínica basadas en el modelo de referencia y pueden ser procesados automáticamente.
- Describe cómo se definen los arquetipos mediante restricciones sobre objetos, atributos y valores del modelo de referencia, usando la herramienta LinkEHR para ilustrar el proceso de edición.
Son estructuras de datos que agrupan muchos datos del mismo tipo, en donde cada elemento se puede trabajar individualmente y se puede referenciar con un mismo nombre. Se usan para representar datos que pueden verse como una tabla con filas y columnas.
Este documento explica las pilas y colas como tipos abstractos de datos. Detalla que las pilas siguen el orden LIFO (último en entrar, primero en salir), mientras que las colas siguen FIFO (primero en entrar, primero en salir). Describe las operaciones básicas de cada una como apilar/desapilar y encolar/desencolar. También incluye ejemplos de código Java para implementar pilas y colas.
El documento describe los elementos clave de un diagrama de clases UML, incluyendo clases, relaciones y interfaces. Las clases representan conceptos u objetos, las relaciones muestran las dependencias entre clases como asociación, agregación, composición o herencia, e interfaces definen contratos de comportamiento.
Una pila es una estructura de datos que sigue el principio LIFO (último en entrar, primero en salir), donde los elementos se agregan y eliminan de la parte superior de la pila. Existen dos formas de implementar una pila en C++: mediante un vector estático, que limita el tamaño máximo, o mediante nodos dinámicos enlazados, que permite un tamaño variable. Las operaciones básicas de una pila son crear, apilar, desapilar y consultar la cima.
Este documento describe diferentes estructuras de datos como listas, pilas y colas. Presenta sus definiciones, objetos del mundo real que pueden modelarse con ellas, y operaciones básicas. También propone TADs para representar estas estructuras y describe cómo los lenguajes de programación permiten implementarlas utilizando vectores, punteros y otras técnicas.
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellJosé A. Alonso
Se especifica el tipo abstracto de datos de las colas de prioridad, se presenta su implementación en Haskell mediante listas y se comprueban sus propiedades características con QuickCheck.
Este es el tema 16 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
La memoria dinámica permite solicitar memoria en tiempo de ejecución usando funciones como malloc() y free(). malloc() devuelve un puntero a la memoria solicitada, mientras que free() devuelve la memoria alocada. Es necesario hacer un casting del puntero devuelto por malloc() al tipo de datos adecuado.
El documento describe el lenguaje de programación C++. C++ es una extensión del lenguaje C que permite la manipulación de objetos. Incluye varios compiladores libres como G++. Describe palabras reservadas, tipos de datos, operadores, funciones y bibliotecas estándar de C++.
Este documento describe las plantillas en C++. Las plantillas proporcionan configuraciones preestablecidas de código que agilizan el desarrollo. Las plantillas generalizan el código permitiendo pasar cualquier tipo de valor como parámetro. Esto simplifica el mantenimiento del código. Algunos usos comunes de plantillas son contenedores genéricos y algoritmos genéricos. La biblioteca estándar de C++ incluye plantillas como vectores, conjuntos y listas.
Administración de memoria continuación -matrices estáticas y dinámicasUVM
Continuación del uso de memoria dinámica, ocupando mayor cantidad de ésta, mediante ejemplos de matrices (arreglos bidimensionales) estáticos y dinámicos, en C++.
Este documento explica los conceptos básicos de arrays multidimensionales en programación. Explica que los arrays pueden tener dos o más dimensiones, y proporciona ejemplos detallados de cómo declarar y manipular arrays bidimensionales (matrices) y tridimensionales. También cubre temas como la inserción y lectura de datos, operaciones aritméticas entre matrices, y el intercambio de filas y columnas.
El documento explica los apuntadores en C, los cuales son variables que almacenan direcciones de memoria y permiten acceder indirectamente a los valores almacenados en esas direcciones. Los apuntadores son importantes en C porque a veces son la única forma de expresar ciertos cálculos, permiten generar código más compacto y eficiente, y son una herramienta poderosa pero que requiere cuidado al usar. El documento describe la declaración, inicialización y operadores de los apuntadores, así como su uso con arreglos y funciones.
El documento describe diferentes temas relacionados con punteros en C, incluyendo cómo declarar y utilizar punteros, punteros a arrays, punteros a funciones y punteros a estructuras. También incluye ejemplos de código y ejercicios propuestos para practicar el uso de punteros.
El documento describe los conceptos de arreglos y apuntadores en C. Explica que los arreglos son conjuntos de variables del mismo tipo indexadas, y que los apuntadores son variables que almacenan direcciones de memoria. También cubre temas como declaración e inicialización de arreglos y apuntadores, aritmética de direcciones, arreglos multidimensionales, y la equivalencia entre arreglos y apuntadores.
Este documento proporciona información sobre operaciones básicas de entrada y salida en C utilizando archivos. Explica conceptos como flujos, punteros FILE, apertura y cierre de archivos, lectura y escritura de caracteres y cadenas, archivos binarios, funciones para acceso aleatorio y ejercicios de práctica.
El documento describe diferentes prácticas con punteros, vectores y cadenas en C++. Explica cómo declarar y asignar cadenas, reservar memoria dinámica para concatenar cadenas, acceder a caracteres mediante punteros, incrementar valores apuntados por punteros, intercambiar valores mediante punteros, y sumar elementos de un vector usando diferentes notaciones.
Este documento describe las plantillas de clases y funciones en C++. Explica cómo se declaran y definen plantillas de clases y funciones, cómo se instancian plantillas de clases para tipos específicos, y cómo se definen métodos de plantillas de clases. También cubre temas como tipos anidados en plantillas de clases y la compilación de plantillas de clase.
El documento describe los conceptos de memoria estática y dinámica en C++. La memoria estática asigna un espacio de memoria fijo durante la compilación, mientras que la memoria dinámica permite cambiar el tamaño de la memoria asignada durante la ejecución usando los operadores new y delete. Se proveen ejemplos de cómo declarar y usar arreglos estáticos y dinámicos para ilustrar estas dos formas de administración de memoria.
Este documento describe cómo utilizar funciones en C para realizar operaciones con vectores y matrices. Explica conceptos básicos como vectores, matrices y funciones en C. Luego presenta dos ejemplos prácticos de código: 1) un programa que toma dos matrices de entrada y calcula su producto algebraico utilizando funciones, y 2) un programa que permite ingresar elementos en una matriz cuadrática utilizando funciones. El objetivo es demostrar cómo las funciones pueden utilizarse para modularizar el código y hacerlo más organizado y reutilizable.
Administración de memoria - arreglos estáticos y dinámicosUVM
El documento explica los conceptos de memoria estática y dinámica en C++. La memoria estática se reserva de forma fija en tiempo de compilación, mientras que la memoria dinámica permite cambiar el tamaño de los arreglos en tiempo de ejecución usando los operadores new y delete. Se describen ejemplos de cómo crear y usar arreglos estáticos y dinámicos, así como posibles errores de memoria como fugas y acceso a memoria no asignada.
Este documento presenta un tutorial sobre C++. Introduce los tipos de datos fundamentales como enteros, caracteres, booleanos y void. Explica conceptos como variables, funciones, jerarquía de operaciones, funciones miembro, plantillas, herencia, espacios de nombres y sobrecarga de operadores.
Este documento proporciona una introducción a C++, cubriendo temas como tipos de datos fundamentales, funciones, la palabra reservada void, el uso de null, principios básicos de programación como la función main, variables, jerarquía de operaciones, funciones miembro, plantillas, clases abstractas, espacios de nombres, herencia y sobrecarga de operadores.
Este documento describe las plantillas en C++. Las plantillas proporcionan configuraciones preestablecidas de código que agilizan el desarrollo. Las plantillas permiten definir funciones y clases genéricas que pueden aceptar distintos tipos de datos como parámetros. Algunas ventajas son la generalización y simplicidad del código. Se recomienda probar primero con clases normales antes de convertirlas en genéricas.
Este documento presenta una introducción al lenguaje de programación C# y a la plataforma .NET de Microsoft. Explica brevemente qué es C# y .NET, las características principales de C# como lenguaje orientado a objetos y de alto nivel, y conceptos básicos como variables, arrays, clases, interfaces, herencia, excepciones y delegados.
El documento describe los tipos de objetos en .NET, incluyendo tipos por valor y referencia, así como estructuras, enumeraciones, cadenas y StringBuilder. Los tipos incluyen datos integrados como enteros y cadenas, así como tipos definidos por el usuario como clases y estructuras. Los tipos por valor se almacenan en la pila mientras que los tipos por referencia almacenan direcciones de memoria en la pila y los datos en el montón.
Este documento describe conceptos básicos de programación orientada a objetos en Java como clases, objetos, atributos, métodos, constructores y visibilidad. Explica que una clase define una plantilla para crear objetos con características comunes, mientras que un objeto es una instancia concreta de una clase. También describe cómo los atributos y métodos definen el estado y comportamiento de una clase.
Este documento presenta una sesión sobre programación estructurada en C. Cubre temas como arrays unidimensionales y multidimensionales, inicialización de arrays, operaciones con punteros y arrays, cadenas de caracteres (strings), y estructuras. Explica cómo declarar y utilizar estos tipos de datos, así como cómo pasar arrays y estructuras como parámetros a funciones.
Este documento presenta información sobre arreglos y cadenas en Java. Explica que los arreglos son colecciones de elementos del mismo tipo almacenados de forma consecutiva en memoria, y que pueden ser unidimensionales o multidimensionales. También describe propiedades y operaciones comunes de las cadenas como métodos para comparar, buscar subcadenas e indexar caracteres.
Este documento describe los diferentes tipos de datos en C++. Incluye tipos fundamentales como int y double, tipos definidos por el usuario como clases y estructuras, y tipos de cadenas como std::string. También cubre punteros, tipos de Windows específicos y más. El sistema de tipos de C++ es estricto y cada variable y expresión debe tener un tipo especificado o inferido.
Este documento describe los diferentes tipos de datos en C++. Incluye tipos fundamentales como int y double, tipos definidos por el usuario como clases y estructuras, y tipos de cadenas como std::string. También cubre punteros, tipos de Windows específicos y más. El sistema de tipos de C++ es estricto y cada variable y expresión debe tener un tipo asignado.
El documento presenta una introducción a la programación en Java, incluyendo conceptos clave como clases y objetos, tipos de datos, variables, expresiones, operadores, comentarios, sentencias de control de flujo y más. Se explican los diferentes componentes del lenguaje Java como bloques, métodos, paquetes y cómo trabajar con clases, objetos, colecciones y más.
El documento presenta una introducción a la programación en Java, incluyendo conceptos clave como clases y objetos, tipos de datos, variables, expresiones, operadores, comentarios, sentencias de control de flujo y más. Se explican los componentes básicos del lenguaje de programación Java y se proveen ejemplos para ilustrar cada concepto.
El documento describe los conceptos básicos del lenguaje de programación C#, incluyendo su estructura, tipos de datos, variables, constantes, arrays, cadenas, operadores y expresiones. C# es un lenguaje orientado a objetos diseñado para el desarrollo de aplicaciones .NET y es el lenguaje ideal para el desarrollo en esta plataforma.
Este documento lista las palabras reservadas de Java y proporciona breves directrices sobre la nomenclatura de identificadores, constantes, clases, métodos y variables en Java. Identifica 42 palabras reservadas de Java y describe los requisitos de nomenclatura como usar mayúsculas y minúsculas, separar palabras con guiones bajos y usar la notación camello.
El documento resume la sintaxis del lenguaje de programación C#, incluyendo expresiones, operadores, sentencias, tipos de datos, variables, literales, cadenas y formateo de cadenas. Explica las diferencias entre tipos de valor y referencia y cómo se almacenan en la pila y el montículo.
El documento describe las estructuras en C++. Explica que una estructura permite almacenar valores de diferentes tipos de datos bajo un nombre. Luego presenta un ejemplo de estructura para registrar información de circuitos integrados que incluye el número de parte, familia, tipo de función, voltaje y unidades en existencia. Finalmente, muestra cómo declarar e inicializar variables de estructuras en C++.
Este documento proporciona una introducción básica al lenguaje de programación Java, incluyendo conceptos como comentarios, identificadores, palabras clave, literales, operadores, tipos de datos primitivos, clases, objetos, variables, métodos, control de flujo, paquetes, entrada/salida, compilación y ejecución de programas, arrays, cadenas de texto y gestión de ficheros. Explica los elementos fundamentales de Java necesarios para comenzar a programar en este lenguaje.
Este documento proporciona una introducción al lenguaje de programación Java. Explica conceptos básicos como comentarios, identificadores, palabras clave, literales y operadores. También describe tipos de datos primitivos, clases, variables miembro, métodos, estructuras de control de flujo, paquetes, importaciones, entrada/salida estándar, compilación y ejecución. Además, cubre temas como arrays, cadenas de texto, vectores dinámicos y gestión de archivos.
Este documento proporciona una introducción a los conceptos básicos del lenguaje de programación Java, incluyendo comentarios, identificadores, palabras clave, literales, operadores, separadores, tipos de datos primitivos, objetos, clases, variables, métodos, estructuras de control de flujo, paquetes, entrada y salida estándar, compilación y ejecución, arrays y la clase String.
Este documento describe los mecanismos de plantillas en C++ para facilitar la reutilización y abstracción del código. Explica plantillas de funciones, que permiten aplicar la lógica de una función a múltiples tipos de datos, y plantillas de clases, que permiten crear clases independientes de tipos de datos específicos. Incluye ejemplos de sintaxis de plantillas de funciones y clases.
El documento habla sobre los árboles como una estructura de datos jerárquica donde los nodos contienen datos y están organizados de forma que uno es la raíz y otros son hojas o nodos extremos, con ejemplos de cómo se pueden invertir y aplicar en computadoras. También menciona los algoritmos de recorridos de los árboles.
This document provides information about C++ stream input/output (I/O) manipulation over 17 pages. It discusses the standard header files for stream I/O, the class hierarchy for stream I/O in C++, stream manipulators for formatting output, stream format states for controlling formatting, and various member functions for manipulating streams and performing formatted I/O. It also provides an example program demonstrating the use of manipulators and member functions for stream I/O.
The document discusses heaps and priority queues. It provides an overview of using a complete binary tree and array-based representation to implement a heap-based priority queue. Key points include: storing nodes in an array allows easy access to parent and child nodes, a heap is a complete binary tree where each parent has a higher priority value than its children, and priority queues can be implemented efficiently using heaps.
El documento describe la programación genérica en C++, incluyendo funciones y clases genéricas. Explica cómo definir funciones genéricas utilizando plantillas de tipos y cómo el compilador crea versiones especializadas de estas funciones. También cubre las restricciones en el uso de funciones genéricas y cómo implementar clases genéricas. Finalmente, introduce el uso de contenedores y algoritmos genéricos de la biblioteca estándar de C++.
El documento define un árbol como una estructura de datos no orientada y acíclica que consiste en nodos conectados de forma jerárquica. Un árbol tiene una raíz y cada nodo puede tener cero o más nodos hijos, con los nodos sin hijos llamados hojas. Un árbol binario restringe cada nodo a tener como máximo dos hijos (izquierdo y derecho).
El documento describe los conceptos básicos de los árboles binarios de búsqueda, incluyendo su representación, tipos, operaciones como recorridos, inserción y eliminación de nodos. Explica que un árbol binario de búsqueda es una estructura jerárquica donde los nodos contienen datos ordenados y cada nodo tiene como máximo dos hijos.
Este documento presenta una introducción a los sistemas distribuidos. Explica que Internet originalmente se creó para compartir recursos entre ordenadores dispersos, pero luego evolucionó hacia arquitecturas centralizadas como la web. Más recientemente han surgido sistemas peer-to-peer que son descentralizados y permiten compartir archivos directamente entre usuarios, como Napster. También introduce los conceptos de grids, que aprovechan recursos de diferentes instituciones, y sistemas distribuidos a gran escala en Internet. El objetivo del documento es presentar diferentes arquitecturas
Este documento presenta una introducción a los modelos arquitectónicos y fundamentales en sistemas distribuidos. Explica conceptos clave como capas de software, arquitecturas cliente-servidor, middleware, interfaces y objetos. También cubre requisitos de diseño como rendimiento, calidad de servicio, fiabilidad y seguridad.
The document contains figures and text from an instructor's guide about distributed systems. Figure 1.1 shows a portion of the Internet including a desktop computer, server, backbone, satellite link and intranet. Figure 1.2 depicts a typical intranet. Figure 1.3 illustrates portable and handheld devices in a distributed system. Figure 1.4 shows web servers and browsers connected via protocols. Figure 1.5 depicts the growth of computers and web servers connected to the Internet from 1979 to 2003. Figure 1.6 compares the growth of total computers versus web servers from 1993 to 2001. The text then discusses various types of transparency in distributed systems like access, location, concurrency, replication, failure, mobility, performance and scaling transparency
1. Tema 7
Colas de prioridad
7.1. Plantillas de clases y funciones en C++
7.2. El TAD Cola de Prioridad
7.3. El mont´
ıculo binario (heap)
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 1
2. Plantillas de clases y funciones en C++
Hasta ahora hemos dotado de cierto grado de genericidad a una clase mediante una
definici´n de tipo:
o
typedef int TBL;
que obliga a modificar la definici´n de la clase y recompilarla para adaptar la clase al
o
tipo espec´
ıfico que necesitamos.
£ C++ proporciona un mecanismo expl´
ıcito para definir clases y funciones gen´ricas.
e
Una plantilla de clase o de funci´n es un modelo para crear clases o funciones en
o
el que se parametrizan uno o m´s tipos o valores.
a
template <class TBL>
template <class TBABB> class Lista {
class ArbolBB; public:
...
template <class T> private:
int SeparaIntervalo ...
(T* vec, int n, T inf, T sup); };
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 2
3. Plantillas de clases y funciones en C++
Declaraci´n y definici´n de plantillas de clase
o o
£ Una declaraci´n o definici´n de plantilla empieza con template.
o o
£ A continuaci´n se da una lista de par´metros de plantilla, separados por comas
o a
y delimitados por < y >. No puede estar vac´
ıa.
£ Un par´metro de plantilla puede ser de tipo o de expresi´n constante.
a o
Par´metro de tipo. Se compone de class o typename y un identificador.
a
class y typename son equivalentes en esta lista de par´metros.
a
Cualquier tipo predefinido de C++ (int, float, char*, etc.) o definido por
el usuario podr´ ser un argumento v´lido como par´metro de tipo.
a a a
Un par´metro de tipo es un especificador de tipo en toda la definici´n de la
a o
plantilla. Puede usarse en los mismos contextos que un tipo en una clase.
Par´metro de expresi´n constante. Es una declaraci´n normal de un par´metro.
a o o a
El nombre del par´metro representa un valor constante.
a
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 3
4. Plantillas de clases y funciones en C++
Transformaci´n de la clase Vector (de enteros) en una plantilla de clase.
o
class Vector {
public:
typedef int TBV;
explicit Vector(int cap_inicial=0)
{ capacidad=cap_inicial; elementos=new TBV[cap_inicial]; }
...
};
template <class TBV>
class Vector {
public:
explicit Vector(int cap_inicial=0)
{ capacidad=cap_inicial; elementos=new TBV[cap_inicial]; }
...
}; // El resto de la definici´n de la plantilla es igual que la de la clase Vector
o
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 4
5. Plantillas de clases y funciones en C++
Tras la lista de par´metros de plantilla, se da la declaraci´n o definici´n de la plantilla
a o o
de clase, exactamente igual que una declaraci´n o definici´n normal de clase.
o o
Dentro de la definici´n de la plantilla de clase, su nombre puede utilizarse como
o
especificador de tipo, igual que se hacia hasta ahora con el nombre de una clase.
£ Cada ocurrencia de Vector dentro de su definici´n es un abreviatura de
o
Vector<TBV>.
£ Esta abreviatura s´lo puede utilizarse aqu´ y dentro de la definici´n de sus miembros.
o ı o
Cuando se utiliza fuera de su definici´n, se debe especificar la lista de par´metros
o a
completa: Vector<TBV>.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 5
6. Plantillas de clases y funciones en C++
Instanciaci´n de plantillas de clase
o
Una definici´n de plantilla de clase sirve como modelo para la generaci´n autom´tica
o o a
de instancias de tipo espec´
ıfico de la clase.
Cuando despu´s se escribe:
e
Vector<double> vd;
se crea autom´ticamente una clase Vector cuyos componentes son de tipo double.
a
£ El resultado es equivalente a reescribir el texto de la definici´n de la plantilla de
o
clase sustituyendo TBV por double y quitando template <class TBV>.
La creaci´n de una clase concreta a partir de una plantilla gen´rica de clase se llama
o e
instanciaci´n de la plantilla.
o
Vector<int> vi; ⇐ vector de enteros
Vector<char*> vpc; ⇐ vector de punteros a caracteres
Vector<bool> *pvb; ⇐ puntero a vector de booleanos
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 6
7. Plantillas de clases y funciones en C++
Cada instanciaci´n de una plantilla de clase es una clase independiente
o
£ Los objetos de la clase Vector<int> no tienen permiso de acceso a los miembros
no p´blicos de Vector<char*>.
u
La lista de argumentos de plantilla se separa por comas y se delimita por < y >,
asoci´ndose los tipos y valores espec´
a ıficos dados en la instanciaci´n a los par´metros
o a
de plantilla por su posici´n.
o
£ Vector<int> es un nombre de clase, e <int> es su lista de argumentos.
Una instancia de una plantilla de clase puede utilizarse en un programa donde pueda
utilizarse cualquier clase, y sus objetos se declaran y usan como los de cualquier clase.
void Ordena(Vector<long> & vl) { ... }
Vector<float> *pvf = new Vector<float>[100];
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 7
8. Plantillas de clases y funciones en C++
M´todos de las plantillas de clase
e
Se pueden definir dentro de la definici´n de la plantilla de clase (inline), o fuera.
o
Si un m´todo se define fuera, debe hacerse con una sintaxis especial:
e
template <class TBV>
inline
Vector<TBV>::Vector(int cap_inicial) {
capacidad = cap_inicial;
elementos = new TBV[cap_inicial];
}
Se debe escribir template con la misma lista de par´metros que la plantilla de
a
clase, para que el m´todo sea una plantilla de funci´n con los mismos par´metros.
e o a
Se debe cualificar el nombre del m´todo (constructor, en este caso) con el nombre de
e
la plantilla de clase acompa˜ada de la lista de par´metros de plantilla.
n a
En el cuerpo del m´todo, los par´metros de plantilla se pueden usar sin cualificar.
e a
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 8
9. Plantillas de clases y funciones en C++
template <class TBV>
void Vector<TBV>::Inicia(int pri, int fin, TBV val) {
...
}
template <class TBV>
Vector<TBV> & Vector<TBV>::operator=(const Vector & der) {
...
}
template <class TBV>
void Vector<TBV>::ModificaCapacidad(int nueva_cap) {
...
}
template <class TBV>
void Vector<TBV>::Mostrar(ostream & fsal) const {
...
} // El c´digo de cada uno de estos m´todos de la plantilla es el mismo
o e
// que hab´ en su correspondiente m´todo de la clase Vector
ıa e
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 9
10. Plantillas de clases y funciones en C++
Plantillas de funci´n
o
Se declaran y definen igual que las plantillas de clase:
£ template m´s la lista de par´metros.
a a
£ Despu´s se declara o define la plantilla como una funci´n normal, incluyendo el uso
e o
de los par´metros de plantilla.
a
La instanciaci´n de plantillas de funci´n es distinta de las de clase.
o o
£ En principio, no es necesario dar la lista de argumentos de plantilla, porque puede
deducirse de los tipos de los argumentos de funci´n.
o
£ Cuando sea necesario puede darse una lista expl´
ıcita de argumentos de plantilla.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 10
11. Plantillas de clases y funciones en C++
template <class T>
int SeparaIntervalo(T* vec, int n, const T & inf, const T & sup) {
int ult = -1; T tmp;
for (int i=0 ; i < n ; i++)
if (inf <= vec[i] && vec[i] <= sup)
{ ult++; tmp = vec[ult]; vec[ult] = vec[i]; vec[i] = tmp; }
return(ult);
}
...
char vc[500];
double * vd = new double[3000];
...
int u1 = SeparaIntervalo(vc,500,’g’,’m’);
int u2 = SeparaIntervalo(vd,3000,34.0945,7772.8097021);
int u3 = SeparaIntervalo<double>(vd,3000,34.0945,7772.8097021);
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 11
12. Plantillas de clases y funciones en C++
Las plantillas se pueden sobrecargar, conjuntamente con las funciones normales.
£ El compilador elegir´ la m´s apropiada para una llamada entre las funciones y las
a a
instancias factibles de las plantillas, seg´n los argumentos y sus tipos.
u
template <class T>
int SeparaIntervalo(Vector<T> & vec, const T & inf, const T & sup) {
int ult = -1; T tmp;
for (int i=0 ; i < vec.Capacidad() ; i++)
if (inf <= vec[i] && vec[i] <= sup)
{ ult++; tmp = vec[ult]; vec[ult] = vec[i]; vec[i] = tmp; }
return(ult);
}
...
long * vl1 = new long[1000];
Vector<long> vl2(2500);
...
int u4 = SeparaIntervalo(vl1,1000,999999,4999999);
int u5 = SeparaIntervalo(vl2,999999,4999999);
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 12
13. Plantillas de clases y funciones en C++
Amistad en las plantillas de clase
Conoceremos s´lo la declaraci´n de amistad de una plantilla de funci´n en una de
o o o
clase en la que ambas utilizan la misma lista de par´metros de plantilla.
a
template <class TBV> class Vector {
friend ostream & operator<< <TBV>(ostream &, const Vector<TBV> &);
...
};
template <class Tipo>
ostream & operator<<(ostream & fsal, const Vector<Tipo> & v) {
fsal << "[";
if (v.capacidad > 0) {
for (int i=0 ; i < v.capacidad-1 ; i++)
fsal << v.elementos[i] << ", ";
fsal << v.elementos[v.capacidad-1];
}
fsal << "]"; Una instancia de tipo espec´ıfico de la plantilla de clase s´lo
o
} da acceso a instancias del mismo tipo de la plantilla de funci´n.
o
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 13
14. Plantillas de clases y funciones en C++
Cuando se instancie Vector con un determinado tipo, como por ejemplo:
struct Punto3D { double x, y, z; };
Vector<short> vec1;
Vector<Punto3D> vec2;
es responsabilidad del programador asegurarse de que ese tipo est´ provisto del
e
operador de salida <<, ya que es necesario en:
fsal << v.elementos[i] << ", ";
As´ no se obtendr´ error de compilaci´n al escribir:
ı, a o
cout << vec1; ⇐ Correcto
cout << vec2; ⇐ Error: Punto3D no tiene definido <<
Si el tipo no dispone del operador de salida <<, puede instanciarse Vector, y no
habr´ ninguna pega mientras no se utilice el operador de salida de Vector.
a
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 14
15. Plantillas de clases y funciones en C++
Tipos anidados en plantillas de clases
Se puede anidar la definici´n de una plantilla de clase dentro de la definici´n de otra.
o o
template <class TBP> template <class TBP>
class Pila { class Pila {
public: public:
... ...
private: private:
struct Nodo { template <class TBP> struct Nodo {
TBP elem; Nodo * sig; TBP elem; Nodo * sig;
Nodo(const TBP& e, Nodo* s) Nodo(const TBP& e, Nodo* s)
{ elem = e; sig = s; } { elem = e; sig = s; }
}; };
typedef Nodo * Enlace; typedef Nodo<TBP> * Enlace;
Enlace top; Enlace top;
int talla; int talla;
... La clase anidada se ... ... y debe entenderse como
}; define de esta manera }; si se realizase esta asociaci´n
o
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 15
16. Plantillas de clases y funciones en C++
£ Aunque la definici´n de la plantilla anidada no va precedida de template <class
o
TBP>, es una plantilla de manera autom´tica y el par´metro TBP se puede
a a
utilizar dentro de su definici´n.
o
£ Se asocia cada instanciaci´n de la clase contenedora para un tipo espec´
o ıfico con la
instanciaci´n de la clase anidada para el mismo tipo espec´
o ıfico.
Tambi´n se pueden anidar definiciones de tipos (typedef) y enumeraciones (enum)
e
en una plantilla de clase.
£ Un tipo p´blico anidado puede referenciarse fuera de la plantilla, pero debe ser
u
referenciado como miembro de una instancia, y no de la plantilla.
Por ejemplo, si Enlace fuese p´blico deber´ referenciarse como:
u ıa
Pila<int>::Enlace ptraux;
y no como:
Pila::Enlace ptraux;
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 16
17. Plantillas de clases y funciones en C++
Compilaci´n de plantillas de clase
o
Cuando el compilador procesa la definici´n de una plantilla de clase se guarda una
o
representaci´n interna, pero no genera c´digo correspondiente a la misma.
o o
Cuando se instancia una plantilla de clase para un tipo espec´ ıfico, entonces s´ se
ı
genera c´digo correspondiente a esta instancia, utilizando la representaci´n interna
o o
guardada previamente.
Para ello siempre es necesario que la definici´n de la plantilla haya sido procesada
o
antes de que la plantilla tenga que instanciarse.
Para asegurar que esto se realiza en todo fichero que requiera una instanciaci´n de la
o
plantilla, conviene:
£ colocar la definici´n de plantillas de clase en ficheros de cabecera .h, e
o
£ incluirlos en los ficheros necesarios (como se hace con la definici´n de clases).
o
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 17
18. Plantillas de clases y funciones en C++
Respecto a los m´todos, miembros de clase y tipos anidados de una plantilla de clase,
e
el est´ndar C++ ofrece dos posibilidades:
a
£ A˜adir su definici´n a la definici´n de la plantilla de clase en el fichero de cabecera.
n o o
£ Dar su definici´n en un fichero de c´digo separado .c++ (igual que se hace con la
o o
definici´n de los m´todos, miembros de clase y tipos anidados de una clase).
o e
Esta segunda posibilidad a´n no es factible utilizarla. No est´ soportada por muchos
u a
compiladores, y por algunos s´lo parcialmente.
o
Usaremos la primera forma de definici´n de miembros de la plantilla de clase.
o
£ Aunque ello tiene la desventaja de no encapsular los detalles de la implementaci´n,
o
tendremos la ventaja de poder compilar directamente y de la misma forma en
cualquier compilador.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 18
19. Plantillas de clases y funciones en C++
Cuando se define una plantilla de clase o sus miembros, se debe tener en cuenta
qu´ identificadores utilizados dependen de alg´n par´metro de la plantilla y cu´les no.
e u a a
£ Los nombres que no dependen de par´metros de la plantilla se resuelven al procesar
a
la definici´n de la plantilla.
o
£ Los que s´ dependen de alg´n par´metro de la plantilla se resuelven al instanciar la
ı u a
plantilla para alg´n tipo espec´
u ıfico.
En ambos casos, los identificadores utilizados deber´n estar declarados o definidos
a
antes de que se necesiten.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 19
20. Plantillas de clases y funciones en C++
vector, de la STL de C++, ofrece las operaciones de Vector y muchas m´s.
a
#include <vector>
£ Constructor: vector<double> v(64), u, x(28,-13.987);
Se puede iniciar el vector con el valor dado como segundo argumento. Si no, lo
inicia al valor por defecto del tipo.
£ Destructor
£ Constructor copia: vector<double> w(v);
£ Asignaci´n: u = v;
o
£ Indexaci´n (para lectura y escritura de elementos): v[i] = w[j] + u[k];
o
£ Consulta de su talla: v.size()
£ Modificaci´n de su talla:
o w.resize(17); x.resize(1024,-0.001);
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 20
21. El TAD Cola de Prioridad
Una cola de prioridad es una generalizaci´n de los conceptos de pila y cola en la
o
que, tras entrar en la cola, la salida de los elementos no se basa necesariamente en
el orden de llegada sino que se basa en un orden definido entre ellos.
La extracci´n de elementos de una cola de prioridad puede buscar minimizar o
o
maximizar el valor del elemento saliente.
£ La interpretaremos en el sentido de minimizar. Para maximizar tan s´lo hay que
o
cambiar el sentido de las comparaciones.
En el modelo b´sico de una cola de prioridad la operaciones que consideramos son:
a
£ insertar en la cola,
£ obtener el elemento m´
ınimo, y
£ eliminar el elemento m´
ınimo.
La realizaci´n de estas operaciones no requiere mantener ordenada (ni total ni
o
parcialmente) la colecci´n de elementos en la cola.
o
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 21
22. El TAD Cola de Prioridad
Algunas aplicaciones importantes de las colas de prioridad:
£ Gesti´n de procesos en un sistema operativo. Los procesos no se ejecutan uno
o
tras otro en base a su orden de llegada. Algunos procesos deben tener prioridad
(por su mayor importancia, por su menor duraci´n, etc.) sobre otros.
o
£ Implementaci´n de algoritmos voraces, los cuales proporcionan soluciones globales
o
a problemas bas´ndose en decisiones tomadas s´lo con informaci´n local. La
a o o
determinaci´n de la mejor opci´n local suele basarse en una cola de prioridad.
o o
Algunos algoritmos sobre grafos, como la obtenci´n de caminos o ´rboles de
o a
expansi´n de m´
o ınimo coste, son ejemplos representativos de algoritmos voraces
basados en colas de prioridad.
£ Implementaciones eficientes de algoritmos de simulaci´n de sucesos discretos. En
o
´stas, el avance del tiempo no se gestiona incrementando un reloj unidad a unidad,
e
sino incrementado sucesivamente el reloj al instante del siguiente suceso.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 22
23. El TAD Cola de Prioridad
TAD Cola de Prioridad
Elementos: En el conjunto de elementos X hay definido un orden lineal <:
∀x, y ∈ X , x = y ⇒ (x < y ∧ y < x) ∨ (y < x ∧ x < y).
CP es el conjunto de multiconjuntos finitos de elementos de X .
(En un multiconjunto los elementos pueden repetirse. P.e.: {7, 4, 7, 2, 7, 4}.)
Operaciones: Dados CP ∈ CP y x ∈ X :
Crear() : Devuelve ∅.
Destruir(CP ) : Elimina CP .
ıa(CP ) : Devuelve cierto si CP = ∅, y falso si CP = ∅.
Est´Vac´
a
Longitud(CP ) : Devuelve |CP | (cardinalidad del multiconjunto).
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 23
24. El TAD Cola de Prioridad
Operaciones (cont.):
ınimo(CP ) : Si CP = ∅, entonces devuelve y ∈ CP tal que ∀z ∈ CP , y ≤ z;
M´
en otro caso, error.
Insertar(CP ,x) : Devuelve CP = CP ∪ {x}.
(En la uni´n de multiconjuntos A ∪ B, las ocurrencias de los elementos de A se
o
a˜aden a las de B. P.e.: {7, 4, 7, 2, 7, 4}∪{4, 5, 1, 4} = {7, 4, 7, 2, 7, 4, 4, 5, 1, 4}.)
n
EliminarM´ ın(CP ) : Si CP = ∅, entonces devuelve CP = CP − {M´
ınimo(CP )};
en otro caso, error.
(En la diferencia de multiconjuntos A−B, para cada elemento de A se descuentan
tantas ocurrencias como haya en B de ese elemento. Si en B hay las mismas
o m´s ocurrencias de un elemento que en A, ´ste no est´ en A − B. P.e.:
a e a
{7, 4, 7, 2, 7, 4} − {4, 2, 7, 2, 4} = {7, 7}.)
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 24
26. El TAD Cola de Prioridad
Eficiencia de diferentes implementaciones b´sicas
a
Costes en el peor caso: Insertar M´
ınimo EliminarM´
ın
Lista O(1) O(n) O(n)
Lista con acceso al m´
ınimo O(1) O(1) O(n)
Lista ordenada O(n) O(1) O(1)
´
Arbol Binario de B´squeda
u O(n) O(n) O(n)
• en el caso promedio: O(log n) O(log n) O(log n)
´
Arbol AVL (equilibrado) O(log n) O(log n) O(log n)
Mont´
ıculo binario (heap) O(log n) O(1) O(log n)
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 26
27. El TAD Cola de Prioridad
Implementaciones eficientes de colas de prioridad
Operaciones adicionales requeridas habitualmente:
£ Formar una cola de prioridad a partir de n elementos dados inicialmente.
£ Cambiar la prioridad de un elemento dado de la cola.
£ Eliminar un elemento dado de la cola (no el m´
ınimo).
£ Combinar dos colas para formar una unica cola con los elementos de ambas.
´
Costes en el peor caso: Insertar M´
ınimo EliminarM´ Combinar Formar
ın
ıculo binario (heap) O(log n)
Mont´ O(1) O(log n) O(n) O(n)
Mont´
ıculo a la izquierda O(log n) O(1) O(log n) O(log n) O(n)
Cola binomial O(log n) O(1) O(log n) O(log n) O(n)
Otras implementaciones ofrecen costes asint´ticos amortizados iguales o m´s eficientes
o a
(unitarios para algunas operaciones): mont´
ıculos oblicuos y mont´ıculos de Fibonacci.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 27
28. El mont´
ıculo binario (heap)
El mont´ ıculo binario es la implementaci´n espec´
o ıfica m´s b´sica y habitual de una
a a
cola de prioridad.
Tambi´n es frecuente referirse a ´l por su nombre en ingl´s: “(binary) heap”.
e e e
Un heap es un ´rbol binario con dos propiedades adicionales: estructural y de orden.
a
Estructura de heap. Un heap es un ´rbol binario casi completo con n nodos.
a
£ Un ´rbol binario casi completo con n nodos se puede almacenar en un vector con
a
n o m´s componentes.
a
£ Numerando los nodos del ´rbol binario casi completo por niveles, de arriba a abajo
a
y de izquierda a derecha, cada nodo i del heap se almacena en la posici´n i del
o
vector.
£ No se necesitan punteros para acceder a los hijos o al padre de un nodo.
£ Principal problema: se debe estimar a priori el tama˜o m´ximo del heap.
n a
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 28
29. El mont´
ıculo binario (heap)
A
1
B
2 3
C
4 5 6 7
D
8 9 10 11 12 13 14 15
E
16 17 18 19 20 21 22
¡ ¡
¡
¡
A B C D E
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Dado un nodo cualquiera i, 1 ≤ i ≤ n:
£ Su hijo izquierdo est´ en 2i (si tiene; es decir, si 2i ≤ n).
a
£ Su hijo derecho est´ en 2i + 1 (si tiene; es decir, si 2i + 1 ≤ n).
a
£ Su padre est´ en i/2 (si tiene; es decir, si i > 1).
a
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 29
30. El mont´
ıculo binario (heap)
Orden de heap. En un heap, el elemento situado en cada nodo es menor o igual que
el elemento situado en cualquiera de sus hijos (si el nodo tiene alg´n hijo).
u
£ El elemento m´
ınimo siempre est´ en la ra´
a ız.
£ En cada sub´rbol se verifica el orden de heap.
a
£ El elemento m´ximo est´ en una hoja.
a a
7 7
23 15 23 18
74 55 18 20 55 74 15 20
93 87 61 99 36 51 93 87 61 99 36 51
heap no es heap
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 30
32. El mont´
ıculo binario (heap)
20 private:
21 TBH *elems;
22 int talla, maxheap;
23 void Hundir(int hueco);
24 };
25 template <class TBH>
26 Heap<TBH> &
27 Heap<TBH>::operator=(const Heap & der) {
28 if (this != &der) {
29 delete [] elems;
30 maxheap = der.maxheap;
31 elems = new TBH[maxheap+1];
32 talla = der.talla;
33 for (int i=1 ; i <= talla ; i++)
34 elems[i] = der.elems[i];
35 }
36 return(*this);
37 }
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 32
33. El mont´
ıculo binario (heap)
Minimo.
38 template <class TBH>
39 const TBH & Tama˜o del problema
n
40 Heap<TBH>::Minimo() const { n: n´mero de elementos en el heap
u
41 if (talla == 0) Error("Minimo");
42 return(elems[1]);
43 } t Minimo(n) = Θ(1)
Insertar.
En un heap de n elementos, al insertar uno nuevo se deber´ utilizar la posici´n n + 1
a o
del vector para mantener la estructura de heap.
Si se preserva el orden de heap al situarlo en el hueco (nodo n + 1), fin de la inserci´n.
o
Si no, el nuevo elemento ser´ menor que el elemento que est´ en el padre del hueco.
a a
⇒ Se baja el elemento del nodo padre al hueco y ahora el hueco queda en el padre.
Este proceso se repite hasta colocar el nuevo elemento en un hueco. En el peor caso,
el hueco ascender´ hasta la ra´
a ız.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 33
34. El mont´
ıculo binario (heap)
9
17 9
18 34 26 31
66 47 58 34 48 33 75 99
71 92 58 61 87 12
9
17 9
18 34 26 31
66 47 12 34 48 33 75 99
71 92 58 61 87 58
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 34
35. El mont´
ıculo binario (heap)
9
17 9
18 12 26 31
66 47 34 34 48 33 75 99
71 92 58 61 87 58
9
12 9
18 17 26 31
66 47 34 34 48 33 75 99
71 92 58 61 87 58
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 35
36. El mont´
ıculo binario (heap)
Partiendo desde el nodo n + 1 al insertar, la violaci´n del orden de heap s´lo puede
o o
aparecer en el camino desde este nodo a la ra´ e ir´ traslad´ndose a lo largo de ´l.
ız, a a e
Si el elemento de i es menor que el de i/2 , al intercambiarlos queda el menor como
padre de dos mayores. El del hermano (i − 1 ´ i + 1) ya era mayor que el del padre.
o
Si el elemento de i debe seguir subiendo a i/2 /2 , el que baje a i/2 ser´ menor
a
que los que hab´ en i/2 e i − 1 ´ i + 1. Al inicio, el orden de heap se cumpl´
ıa o ıa.
44 template <class TBH>
45 void
46 Heap<TBH>::Insertar(const TBH & item) { En promedio, el
47 if (talla == maxheap) Error("Insertar"); coste de insertar
48 talla++; es constante.
49 int hueco;
50 for (hueco=talla ; hueco > 1 && item < elems[hueco/2] ; hueco /= 2)
51 elems[hueco] = elems[hueco/2];
52 elems[hueco] = item;
53 } t Insertar(n) = Ω(1), O(log n)
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 36
37. El mont´
ıculo binario (heap)
EliminarMin.
En un heap de n elementos, al eliminar uno se deber´ inutilizar la posici´n n del
a o
vector, dej´ndolo con n − 1 elementos, para mantener la estructura de heap.
a
Como el elemento que se elimina es el m´ ınimo y ´ste est´ en la ra´ inicialmente
e a ız,
tenemos un hueco en la ra´ y el elemento que estaba en la posici´n n por recolocar.
ız o
Si se preserva el orden de heap al situar el elemento en el hueco, fin de la eliminaci´n.
o
Si no (lo m´s probable), el elemento por recolocar ser´ mayor que alguno de los
a a
elementos que est´n en los hijos del hueco.
a
⇒ Se sube el menor de los elementos de los hijos al hueco y ahora el hueco queda en
el nodo hijo en el que estaba este menor elemento.
Este proceso se repite hasta recolocar el elemento pendiente en un hueco. En el peor
caso, el hueco descender´ hasta las hojas.
a
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 37
38. El mont´
ıculo binario (heap)
9 58
12 9
18 17 26 31
66 47 34 34 48 33 75 99
71 92 58 61 87
9
12 58
18 17 26 31
66 47 34 34 48 33 75 99
71 92 58 61 87
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 38
39. El mont´
ıculo binario (heap)
9
12 26
18 17 58 31
66 47 34 34 48 33 75 99
71 92 58 61 87
9
12 26
18 17 33 31
66 47 34 34 48 58 75 99
71 92 58 61 87
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 39
40. El mont´
ıculo binario (heap)
Al eliminar, la violaci´n del orden de heap s´lo puede aparecer en el camino desde la
o o
ra´ a las hojas, e ir´ traslad´ndose a lo largo de ´l.
ız a a e
Si el elemento de i es mayor que el de 2i y/o el de 2i + 1, al intercambiarlo con el
menor de ellos queda el menor como padre de dos mayores.
Si el elemento de i debe seguir bajando a 2(2i), 2(2i) + 1, 2(2i + 1) ´ 2(2i + 1) + 1,
o
el que suba a 2i ´ 2i + 1 ser´ mayor que el que ahora est´ en i (antes en 2i ´ 2i + 1).
o a a o
Al inicio, el orden de heap se cumpl´
ıa.
54 template <class TBH>
55 void
56 Heap<TBH>::EliminarMin() {
57 if (talla == 0) Error("EliminarMin");
58 elems[1] = elems[talla];
59 talla--;
60 Hundir(1);
61 } t EliminarMin(n) = Ω(1), O(log n)
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 40
41. El mont´
ıculo binario (heap)
El m´todo privado Hundir permite unificar la implementaci´n de EliminarMin y
e o
FormarHeap. Ambas operaciones del heap se basan en el mismo proceso.
62 template <class TBH>
63 void
64 Heap<TBH>::Hundir(int hueco) {
65 TBH tmp = elems[hueco];
66 int hijo;
67 while (true) {
68 hijo = hueco*2;
69 if (hijo < talla && elems[hijo+1] < elems[hijo]) hijo++;
70 if (hijo > talla || !(elems[hijo] < tmp)) break;
71 elems[hueco] = elems[hijo];
72 hueco = hijo;
73 }
74 elems[hueco] = tmp;
75 } t Hundir(n) = Ω(1), O(log n)
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 41
42. El mont´
ıculo binario (heap)
FormarHeap.
Disponiendo de n elementos inicialmente, se puede formar un heap con ellos mediante
n inserciones sucesivas partiendo de un heap vac´
ıo.
£ Coste en el peor caso: O(n log n)
£ Coste en el caso promedio: O(n)
Aproximaci´n alternativa:
o
£ Situar los elementos arbitrariamente en las n primeras posiciones del vector elems
⇒ se crea un ´rbol binario con estructura de heap, aunque no con orden de heap.
a
£ Considerando los nodos hoja como heaps de 1 nodo, comenzando desde el nodo
n/2 y procediendo nodo a nodo decrecientemente hasta la ra´ establecer el
ız,
orden de heap en el sub´rbol con ra´ en el nodo considerado.
a ız
Para ello, se debe hundir el elemento del nodo considerado en su sub´rbol hasta
a
que alcance su nivel adecuado.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 42
43. El mont´
ıculo binario (heap)
99
92 87
75 71 66 61
58 58 47 48 34 34 33 31
26 18 17 12 9
99
92 87
75 71 66 61
58 58 9 48 34 34 33 31
26 18 17 12 47
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 43
44. El mont´
ıculo binario (heap)
99
92 87
75 71 66 61
58 12 9 48 34 34 33 31
26 18 17 58 47
99
92 87
75 71 66 61
18 12 9 48 34 34 33 31
26 58 17 58 47
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 44
45. El mont´
ıculo binario (heap)
99
92 87
75 71 66 31
18 12 9 48 34 34 33 61
26 58 17 58 47
99
92 87
75 71 34 31
18 12 9 48 66 34 33 61
26 58 17 58 47
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 45
46. El mont´
ıculo binario (heap)
99
92 87
75 9 34 31
18 12 47 48 66 34 33 61
26 58 17 58 71
99
92 87
12 9 34 31
18 17 47 48 66 34 33 61
26 58 75 58 71
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 46
47. El mont´
ıculo binario (heap)
99
92 31
12 9 34 33
18 17 47 48 66 34 87 61
26 58 75 58 71
99
9 31
12 47 34 33
18 17 71 48 66 34 87 61
26 58 75 58 92
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 47
48. El mont´
ıculo binario (heap)
9
12 31
17 47 34 33
18 58 71 48 66 34 87 61
26 58 75 99 92
76 template <class TBH>
77 void
78 Heap<TBH>::FormarHeap(const vector<TBH> & items) {
79 if (maxheap < items.size()) Error("FormarHeap");
80 for (talla=0 ; talla < items.size() ; talla++)
81 elems[talla+1] = items[talla];
82 for (int i=talla/2 ; i > 0 ; i--)
83 Hundir(i);
84 } t FormarHeap(n) = Θ(n)
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 48
49. El mont´
ıculo binario (heap)
Breve an´lisis del coste de FormarHeap.
a
Mejor caso. Desde n/2 hasta 1, el elemento de cada nodo considerado es el menor
de su sub´rbol ⇒ el n´mero de asignaciones (desplazamientos de elementos)
a u
realizadas por Hundir es 2 · n/2 . Por tanto, es Ω(n).
Peor caso. Desde n/2 hasta 1, el elemento de cada nodo considerado debe hundirse
hasta una de las hojas m´s profundas de su sub´rbol.
a a
El n´mero de asignaciones (desplazamientos de elementos) realizadas por Hundir
u
es 2 · n/2 + S, siendo S la suma de las alturas de los nodos y S < n. Por tanto,
es O(n).
Por ejemplo, denominando hi a la altura del nodo i, en el heap anterior:
10
S= hi = 4 + 3 + 2 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 18 < 20 = n
i=1
hi = 0, 11 ≤ i ≤ 20
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 49
50. El mont´
ıculo binario (heap)
Aplicaci´n: C´digos de Huffman
o o
Una secuencia de s´ımbolos se puede codificar en binario estableciendo a priori el
conjunto de s´
ımbolos (alfabeto) y asign´ndoles c´digos binarios de longitud fija.
a o
Por ejemplo, el est´ndar ASCII utiliza 7 bits para codificar 128 d´
a ıgitos decimales,
letras may´sculas y min´sculas, s´
u u ımbolos de puntuaci´n y otros caracteres.
o
La secuencia CD54 se codifica en ASCII como 1000011100010001101010110100.
Si el n´mero de s´
u ımbolos es n, los c´digos deben tener una longitud fija de log2 n
o
bits para disponer de suficientes c´digos.
o
Generalmente, esta codificaci´n produce secuencias de bits (ficheros) de mayor tama˜o
o n
que otras, desaprovechando espacio de almacenamiento o tiempo de transmisi´n.o
Asignando c´digos binarios de longitud variable a los s´
o ımbolos, de manera que los
m´s frecuentes tengan c´digos m´s cortos y los m´s infrecuentes m´s largos, se puede
a o a a a
reducir el tama˜o de las secuencias codificadas en binario (ficheros).
n
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 50
51. El mont´
ıculo binario (heap)
Como ejemplo, consideremos un fichero compuesto s´lo por los siguientes s´
o ımbolos,
que aparecen el n´mero de veces indicado.
u
c´digo 1
o n´mero
u c´digo 2
o n´mero
u
s´
ımbolos frecuencia long. fija de bits long. variable de bits
4 8 000 24 000 24
5 22 001 66 001 66
C 25 010 75 010 75
D 23 011 69 011 69
E 15 100 45 10 30
F 7 101 21 11 14
n´mero total de bits del fichero:
u 300 278
Sin aprovechar la informaci´n de las frecuencias, ya se obtiene ganancia al reducir a
o
dos bits el c´digo de dos s´
o ımbolos.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 51
52. El mont´
ıculo binario (heap)
Un c´digo binario puede representarse mediante un ´rbol binario de codificaci´n.
o a o
£ Los s´
ımbolos se sit´an en los nodos.
u
£ En cada nodo no terminal, la rama al hijo izquierdo representa un 0 y la rama al
hijo derecho un 1.
£ El c´digo de cada s´
o ımbolo se corresponde con el camino desde la ra´ al nodo que
ız
lo contiene.
0 1 0 1
0 1 0 0 1 0 1
E F
0 1 0 1 0 1 0 1 0 1
4 5 C D E F 4 5 C D
c´digo 1
o c´digo 2
o
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 52
53. El mont´
ıculo binario (heap)
Un ´rbol de codificaci´n que tenga nodos sin s´
a o ımbolo y con un s´lo hijo produce
o
secuencias codificadas m´s largas que las que produce otro en el que estos nodos se
a
fusionan con sus unicos hijos. As´ todos los nodos tienen dos hijos o ninguno.
´ ı,
Si todos los s´
ımbolos est´n en las hojas, ning´n c´digo es prefijo de otro.
a u o
£ Una codificaci´n con esta propiedad es un c´digo libre de prefijos (“prefix code”).
o o
As´ una secuencia de bits se descodifica de forma no ambigua e instant´nea.
ı, a
£ La secuencia 101001001100000101011 es no ambigua para los c´digos 1 y 2.
o
Descodificaci´n con c´digo 1:
o o F 5 5 E 4 F D
101001001100000101011
Descodificaci´n con c´digo 2: E E
o o C D 4 5 C F
£ C´digo ambiguo: (4, 000), (5, 001), (C, 010), (D, 011), (E, 00), (F, 01).
o
¿C´mo se descodifica 010000? ¿C4 = 010-000 ´ FEE = 01-00-00?
o o
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 53
54. El mont´
ıculo binario (heap)
Llamando p(a) a la profundidad de la hoja en la que est´ el s´
a ımbolo a del alfabeto A
y f (a) a su frecuencia, el coste de un ´rbol binario de codificaci´n para A es:
a o
p(a) · f (a)
a∈A
Este coste coincide con el n´mero total de bits calculado anteriormente.
u
Est´ claro que podemos definir distintos c´digos binarios de longitud variable, para un
a o
conjunto de s´
ımbolos, que tendr´n distinto coste.
a
Dado un conjunto de s´
ımbolos A y sus frecuencias en un fichero, ¿podemos encontrar
un ´rbol binario de codificaci´n ´ptimo para A, es decir, cuyo coste sea m´
a o o ınimo?
De esta manera, obtendr´ ıamos un c´digo binario ´ptimo que necesitar´ el menor
o o ıa
n´mero total de bits para representar el fichero.
u
Este c´digo es ´ptimo para una codificaci´n del tipo “s´
o o o ımbolo - c´digo de longitud
o
variable (libre de prefijos)”, dados un alfabeto y las frecuencias de sus s´
ımbolos. Otros
tipos de codificaci´n pueden reducir m´s el n´mero de bits empleados.
o a u
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 54
55. El mont´
ıculo binario (heap)
Algoritmo de Huffman
Trabaja con un bosque, que es una colecci´n de ´rboles.
o a
Inicialmente, cada par (s´
ımbolo,frecuencia) forma un ´rbol de un s´lo nodo en el
a o
bosque.
Iterativamente, hasta que el bosque tenga un s´lo ´rbol:
o a
£ Se seleccionan los dos ´rboles con menor coste (da lo mismo c´mo se resuelvan los
a o
empates).
£ Se forma un nuevo ´rbol binario, creando un nuevo nodo ra´ que contendr´:
a ız a
como coste la suma de los costes de los dos ´rboles seleccionados, y
a
como hijos a dichos ´rboles (da lo mismo cu´l sea el izquierdo y cu´l el derecho).
a a a
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 55
56. El mont´
ıculo binario (heap)
Inicio: 4 5 C D E F
8 22 25 23 15 7
15
Iteraci´n 1:
o
F 4 5 C D E
7 8 22 25 23 15
30
Iteraci´n 2:
o E
15 15
F 4 5 C D
7 8 22 25 23
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 56
57. El mont´
ıculo binario (heap)
30
Iteraci´n 3:
o E
15 15 45
F 4 5 D C
7 8 22 23 25
55
C
25 30
Iteraci´n 4:
o
E
15 15 45
F 4 5 D
7 8 22 23
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 57
58. El mont´
ıculo binario (heap)
100
55 45
Iteraci´n 5:
o C 5 D
25 30 22 23
E
15 15
F 4
7 8
Coste del ´rbol de codificaci´n de Huffman obtenido:
a o
2 · 25 + 4 · 7 + 4 · 8 + 3 · 15 + 2 · 22 + 2 · 23 = 245
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 58
59. El mont´
ıculo binario (heap)
El algoritmo de Huffman es un algoritmo voraz que, partiendo de los s´ ımbolos y sus
frecuencias, va creando local y sucesivamente sub´rboles de m´
a ınimo coste, y finaliza
obteniendo el ´rbol binario de codificaci´n de m´
a o ınimo coste (codificaci´n ´ptima de
o o
longitud variable y libre de prefijos).
£ La selecci´n de los ´rboles del bosque con menor coste para formar otro puede
o a
hacerse con un heap.
El ´rbol de codificaci´n de Huffman puede utilizarse para implementar dos programas
a o
de compresi´n y descompresi´n de ficheros.
o o
£ Para ello, el ´rbol de codificaci´n debe incluirse en el fichero comprimido (con una
a o
representaci´n adecuada), ya que sino ser´ imposible descomprimir.
o a
£ Esta manera de comprimir y descomprimir tiene el inconveniente de que la compre-
si´n necesita dos recorridos del fichero original: uno para calcular las frecuencias y
o
otro para codificar.
IS13. Estructuras de datos y de la informaci´n — 2003/2004
o 59