9.1 Complejidad de arreglos, listas, tablas hash.
El análisis de la complejidad de las estructuras de datos se centra en evaluar el tiempo de ejecución y la cantidad de memoria necesaria para realizar diferentes operaciones (por ejemplo, inserción, eliminación, búsqueda). Comprender la complejidad ayuda a los desarrolladores a elegir las estructuras de datos más adecuadas para tareas específicas, garantizando el uso eficiente de los recursos.
1. Arreglos (Arrays):
- Acceso por índice:
O(1) - Búsqueda de elemento:
O(n) - Inserción de elemento:
O(n)(en el peor caso, inserción en medio del array) - Eliminación de elemento:
O(n)(en el peor caso, eliminación de medio del array) - Memoria:
O(n)
Ejemplo de uso: Los arrays son eficientes para escenarios que requieren acceso rápido por índice, como tablas y series temporales.
2. Listas enlazadas (Linked Lists):
- Acceso por índice:
O(n) - Búsqueda de elemento:
O(n) - Inserción de elemento:
O(1)(si se conoce la posición) - Eliminación de elemento:
O(1)(si se conoce la posición) - Memoria:
O(n)
Ejemplo de uso: Las listas enlazadas son útiles cuando es frecuente agregar o eliminar elementos, como en la implementación de colas y pilas.
3. Tablas hash (Hash Tables):
- Búsqueda de elemento:
O(1)(en promedio) - Inserción de elemento:
O(1)(en promedio) - Eliminación de elemento:
O(1)(en promedio) - Memoria:
O(n)
Ejemplo de uso: Las tablas hash son eficientes para implementar diccionarios y bases de datos clave-valor.
9.2 Complejidad de árboles y grafos.
1. Árboles binarios de búsqueda (Binary Search Trees, BST):
- Búsqueda de elemento:
O(log n)(en promedio) - Inserción de elemento:
O(log n)(en promedio) - Eliminación de elemento:
O(log n)(en promedio) - Memoria:
O(n)
Ejemplo de uso: Los árboles de búsqueda se usan en bases de datos y estructuras de datos como conjuntos y mapas (map).
2. Grafos (Graphs):
- Búsqueda en anchura (BFS):
O(V + E) - Búsqueda en profundidad (DFS):
O(V + E) - Camino más corto (Dijkstra):
O(V^2)oO(E + V log V)para lista de adyacencia - Memoria:
O(V + E)
Ejemplo de uso: Los grafos se usan en rutas de redes, redes sociales, análisis de conexiones y bases de datos de grafos.
9.3 Elección de la estructura de datos adecuada
¿Cómo elegir estructuras de datos basándose en el análisis de complejidad?
Características de la tarea:
Determina qué operaciones son más frecuentes y críticas para tu tarea (búsqueda, inserción, eliminación).
Tamaño de los datos:
Considera el tamaño de los datos y los recursos disponibles. Para datos pequeños, puedes usar estructuras simples como arrays y listas enlazadas.
Requerimientos de rendimiento:
Define qué es más importante para tu tarea: el tiempo de ejecución de las operaciones o el consumo de memoria.
Necesidades de memoria:
Si la memoria es limitada, elige estructuras de datos con baja complejidad espacial.
Ejemplos de optimización de tareas reales considerando la complejidad temporal y espacial
Uso de estructuras de datos adecuadas:
Ejemplo: Para operaciones frecuentes de búsqueda usa tablas hash, y para operaciones frecuentes de inserción/eliminación, listas enlazadas.
Reducción del número de operaciones:
Ejemplo: Optimización de bucles y eliminación de cálculos innecesarios, uso de memoización y programación dinámica.
Procesamiento paralelo de datos:
Ejemplo: Uso de multihilos o sistemas distribuidos para procesamiento de grandes volúmenes de datos.
9.4 Ejemplos de tareas listas para el análisis de estructuras de datos.
Tareas prácticas para el análisis y optimización de tareas reales
Tarea 1: Optimización de búsqueda en un array
Tienes un array de 10 millones de números. Optimiza el algoritmo de búsqueda de un elemento.
Solución:
Utiliza búsqueda binaria para un array ordenado.
Tarea 2: Optimización del trabajo con una lista enlazada
Tienes una lista enlazada y necesitas insertar y eliminar elementos con frecuencia.
Solución:
Usa una lista doblemente enlazada para optimizar la inserción y eliminación.
Tarea 3: Procesamiento de datos en una tabla hash
Implementa un diccionario con acceso rápido a los datos.
Solución:
Usa una tabla hash para operaciones de inserción, eliminación y búsqueda con complejidad temporal O(1).
Tarea 4: Recorrido de grafo
Encuentra el camino más corto en un grafo de carreteras urbanas.
Solución:
Usa el algoritmo de Dijkstra con complejidad temporal O(V^2) para matriz de adyacencia o O(E + V log V) para lista de adyacencia.
GO TO FULL VERSION