Abstracción de datos
M. C. Perla Ma. Saldivar Castillo
M. C. Perla Ma. Saldivar Castillo
Introducción a las Estructuras de Datos
Las estructuras de datos permiten organizar y gestionar información de manera eficiente. Se utilizan en aplicaciones de software para optimizar el almacenamiento y acceso a los datos. Son fundamentales en la programación, ya que permiten manejar grandes volúmenes de datos de manera estructurada y eficiente.
Una estructura de datos es un esquema lógico y matemático para organizar y manipular datos. Estas estructuras proporcionan mecanismos para almacenar, recuperar y procesar información de manera eficiente.
Ejemplos de aplicaciones:
Sistemas de bases de datos.
Motores de búsqueda.
Inteligencia artificial y aprendizaje automático.
Simulaciones y videojuegos.
Abstracción de datos
Introducción
La abstracción de datos es un concepto fundamental en la programación y la informática, que permite ocultar los detalles complejos de implementación y presentar solo las características esenciales de un objeto o estructura de datos. Este enfoque facilita la comprensión y la manipulación de los datos al reducir la complejidad.
Definición: La abstracción de datos se refiere al proceso de esconder la complejidad de los detalles de implementación de una estructura de datos, exponiendo solo los aspectos esenciales o relevantes para el usuario o el programador.
Propósito de la Abstracción de Datos
El propósito principal de la abstracción de datos es:
Simplificar el diseño de sistemas complejos.
Aislar la implementación interna de los detalles.
Facilitar el mantenimiento y la modificación del código sin que afecte a otras partes del sistema.
Tipos de Abstracción de Datos
Existen diferentes formas de lograr la abstracción de datos en programación. Las más comunes son:
Abstracción de Datos en Estructuras de Datos: Cuando definimos estructuras como listas, pilas, colas, árboles, y grafos, abstraemos la complejidad de cómo están almacenados internamente los datos, mostrando solo las operaciones y comportamientos que podemos usar.
Abstracción en Programación Orientada a Objetos (OOP): En OOP, la abstracción se logra mediante la definición de clases y objetos. Solo se exponen los métodos necesarios para interactuar con el objeto, mientras que la implementación interna (como los atributos) se oculta.
Abstracción de Datos en Lenguajes de Programación
Muchos lenguajes de programación permiten abstraer detalles internos y ofrecen construcciones que permiten trabajar con datos de una forma más sencilla. Ejemplos:
Lenguajes de Alto Nivel: Ocultan detalles como la gestión de memoria, por ejemplo, en Python, Java, o C#.
Uso de Librerías y API's: Muchas veces los detalles complejos de implementación son manejados por librerías estándar (como colecciones en Java o estructuras de datos en Python).
Ejemplo de Abstracción de Datos
Recordemos que la abstracción permite definir estructuras sin especificar detalles de implementación. En C# con MVC, las estructuras de datos suelen representarse mediante clases y objetos.
La abstracción de datos permite trabajar con tipos abstractos sin conocer la implementación interna, facilitando la reutilización y modularidad del código.
Beneficios de la Abstracción de Datos
Simplicidad: Hace que el sistema sea más fácil de entender, ya que oculta los detalles innecesarios.
Reutilización: Permite reutilizar componentes sin preocuparse de los detalles internos.
Modularidad: Hace que el código sea más modular y fácil de mantener.
Seguridad: Los datos están protegidos y no pueden ser manipulados directamente.
Clasificación de las estructuras de datos
Diferencias entre estructuras estáticas y dinámicas
Relación con la programación orientada a objetos
Medición de la eficiencia de una estructura de datos
Se usa la notación Big-O para medir la complejidad de los algoritmos. La eficiencia de un algoritmo se evalúa en términos de:
Tiempo de ejecución: Cuánto tarda un algoritmo en procesar datos.
Uso de memoria: Cuánta memoria requiere para su ejecución.
Ejemplo de comparación de operaciones en arreglos y listas enlazadas:
El análisis de eficiencia es crucial al seleccionar una estructura de datos adecuada para un problema específico.
Diseño de un ADT(Tipo Abstracto de Datos)
Un Tipo Abstracto de Datos (ADT, Abstract Data Type) es una especificación formal de un conjunto de datos y las operaciones permitidas sobre ellos, sin preocuparse por su implementación concreta. El concepto de ADT se basa en el principio de abstracción, lo que permite separar la definición lógica de la implementación física.
Un ADT define qué hace una estructura de datos, sin especificar cómo lo hace. Esto permite desarrollar software modular y reutilizable, facilitando el mantenimiento y la escalabilidad del código.
Un Tipo Abstracto de Datos tiene las siguientes características:
Encapsulamiento: Se ocultan los detalles internos de la estructura de datos, exponiendo solo las operaciones necesarias.
Independencia de implementación: Se define el comportamiento sin especificar cómo se implementa.
Operaciones bien definidas: Se establecen las funciones o métodos que pueden manipular los datos.
Modularidad: Facilita la reutilización del código en distintos programas.
Un Stack (pila) es un ADT que sigue el principio LIFO (Last In, First Out), donde el último elemento en ingresar es el primero en salir.
Las operaciones básicas de una pila son:
Push (Apilar): Agrega un elemento a la pila.
Pop (Desapilar): Elimina y devuelve el último elemento agregado.
Peek (Cima): Devuelve el elemento en la cima sin eliminarlo.
IsEmpty (Está vacía): Verifica si la pila está vacía.
Vamos a crear un ADT para una Caja donde podemos guardar y sacar objetos.
2 Implementar la Caja con una Lista (Cómo funciona)
Los Tipos Abstractos de Datos permiten:
✔ Reutilización de código: Se pueden utilizar en diferentes aplicaciones sin modificar la lógica.
✔ Facilidad de mantenimiento: La implementación puede cambiar sin afectar a los usuarios del ADT.
✔ Mayor seguridad: Se controla el acceso a los datos a través de operaciones bien definidas.
✔ Mejor organización del código: Se promueve la programación orientada a objetos y la modularidad.