Un curso no termina cuando se acaban las lecciones, sino cuando sabes seguir aprendiendo sin él. En esta lección tienes una biblioteca seleccionada y comentada: documentación oficial, libros, plataformas de práctica, visualizadores y los temas que continúan de forma natural lo que hemos visto. No es una lista para leerla entera, sino un mapa: de cada recurso te digo qué aporta y cuándo usarlo, para que acudas al adecuado según el momento. Cierra la lección un apartado sobre cómo estudiar con todo esto, que importa más que el material en sí.
Contenido
- Documentación oficial de Python
- Libros: del accesible al de referencia
- Plataformas de práctica (y cómo empezar sin frustrarse)
- Visualizadores
- Temas siguientes naturales
- Seguir practicando con TaskFlow
- Cómo estudiar con estos recursos
Documentación oficial de Python
La documentación de Python es de las mejores del sector y debería ser tu primera parada, no la última.
| Recurso | Qué aporta | Cuándo usarlo |
|---|---|---|
| Tutorial oficial, capítulo "Data Structures" (docs.python.org/es/3/tutorial/datastructures.html) | Repaso conciso de list, dict, set, tuplas y comprensiones, con el sello de "así se hace en Python idiomático" |
Como repaso rápido tras el curso; disponible en español |
Referencia de collections (docs.python.org/3/library/collections.html) |
deque, Counter, defaultdict, OrderedDict, namedtuple con todos sus métodos y costes |
Cada vez que uses el módulo: siempre hay un método que no conocías (p. ej. deque.rotate) |
Referencia de heapq (docs.python.org/3/library/heapq.html) |
API del montículo, nlargest/nsmallest, y unas notas de teoría sorprendentemente buenas, incluido el patrón de entradas obsoletas que usamos en NucleoTaskFlow |
Al implementar cualquier cola de prioridad real |
Referencia de bisect (docs.python.org/3/library/bisect.html) |
Búsqueda binaria e inserción sobre listas ordenadas, con ejemplos de uso | Cuando una lista ordenada + bisect pueda ahorrarte un árbol entero (lo vimos en el autocompletar de 08-01) |
Referencia de array (docs.python.org/3/library/array.html) |
Arrays homogéneos compactos: el "array de verdad" del módulo 1, con tipos C | Cuando manejes millones de números y la memoria importe |
| Wiki TimeComplexity (wiki.python.org/moin/TimeComplexity) | La tabla oficial de costes de las operaciones de list, dict, set y deque en CPython |
Como árbitro: cuando dudes del Big O de una operación concreta, aquí está la respuesta canónica |
Consejo: guarda TimeComplexity en marcadores. Es la versión oficial y siempre actualizada de la tabla de costes que construimos en el módulo 1.
Libros: del accesible al de referencia
No los leas en paralelo; cada uno tiene su momento.
- Grokking Algorithms (Aditya Bhargava; en español, Algoritmos: guía ilustrada para programadores). El más accesible que existe: explica con dibujos búsqueda binaria, hash, BFS, Dijkstra, grafos... Ejemplos en Python. Cuándo: justo ahora, al terminar este curso — te servirá de repaso desde otro ángulo y te introducirá con suavidad la programación dinámica y los problemas NP, que aquí no hemos tocado. Se lee en un par de semanas.
- Problem Solving with Algorithms and Data Structures using Python (Miller y Ranum; gratuito online en runestone.academy). Cubre casi el mismo temario que este curso, con implementaciones completas en Python y ejercicios interactivos ejecutables en el navegador. Cuándo: como segunda pasada del temario; leer otra implementación de una
TablaHasho un AVL distinta de la tuya consolida muchísimo. Es la referencia natural para "ver el curso contado por otra persona". - Introduction to Algorithms (Cormen, Leiserson, Rivest, Stein — "CLRS"). La referencia académica: demostraciones formales, análisis riguroso, pseudocódigo. Más de 1 300 páginas. Cuándo: NO para leerlo de principio a fin ahora. Úsalo como enciclopedia: cuando necesites entender a fondo un algoritmo concreto (por qué Dijkstra falla con pesos negativos, el análisis amortizado del array dinámico), su capítulo será la explicación definitiva. Comprarlo o consultarlo en biblioteca; intimida, pero cada capítulo es autocontenido.
| Libro | Nivel | Idioma | Precio | Papel en tu formación |
|---|---|---|---|---|
| Grokking Algorithms | Introductorio | es/en | De pago (asequible) | Repaso ameno + primeros temas nuevos |
| Problem Solving with A&DS using Python | Introductorio-medio | en | Gratuito online | Segunda implementación de todo el temario |
| CLRS | Avanzado | es/en | De pago | Enciclopedia de consulta puntual |
Plataformas de práctica (y cómo empezar sin frustrarse)
Las estructuras se fijan resolviendo problemas. Pero el error número uno es entrar en una plataforma, abrir un problema "medium" al azar, atascarse y concluir que "esto no es lo mío". Plan concreto:
- LeetCode (leetcode.com). El estándar de facto para preparar entrevistas. Lo importante: los problemas están etiquetados por estructura (
stack,queue,hash-table,heap-priority-queue,binary-search-tree,graph...) y por dificultad. Cómo empezar: filtra por una etiqueta que domines (p. ej.stack) + dificultad Easy, y resuelve 5-10 problemas de esa etiqueta antes de cambiar. Reconocerás viejos amigos: el "Valid Parentheses" es tufiltro_balanceado; "Min Stack" es tuPilaConMinimo; "Course Schedule" es tuhay_ciclo+ orden topológico. - HackerRank (hackerrank.com). Parecido, con rutas guiadas ("Data Structures" track) que van de fácil a difícil de forma más progresiva que LeetCode. Buen punto de entrada si LeetCode te resulta árido.
- Exercism (exercism.org). Gratuito, con mentores humanos que revisan tu código y un track de Python excelente. Menos orientado a algoritmos puros y más a escribir Python limpio. Ideal para pulir estilo mientras practicas.
Reglas para no frustrarse, válidas en cualquier plataforma:
- Fácil primero, y sin vergüenza. Diez problemas fáciles resueltos enseñan más que uno difícil abandonado.
- Tiempo límite de atasco: 30-45 minutos de intento serio; después, mira la solución, entiéndela, ciérrala y reescríbela tú de memoria. Mirar soluciones no es trampa; es trampa mirarlas sin reescribirlas.
- Una etiqueta por semana. La práctica agrupada por estructura crea el reflejo problema→estructura que entrenamos en 08-01.
- Vuelve a los problemas resueltos una o dos semanas después. Si no te sale a la segunda, no estaba aprendido.
Visualizadores
Ver una estructura moverse vale más que releer su descripción:
- VisuAlgo (visualgo.net). Animaciones paso a paso de casi todo el curso: listas enlazadas, pilas, colas, tablas hash (¡con colisiones y rehashing!), ABB, AVL con sus rotaciones, montículos, BFS/DFS, Dijkstra, Prim, Kruskal... Cuándo: al repasar un algoritmo que "más o menos" recuerdas — ver las rotaciones AVL animadas aclara en dos minutos lo que cuesta media hora sobre papel. Tiene modo examen para autoevaluarte.
- Python Tutor (pythontutor.com). Ejecuta tu propio código Python paso a paso dibujando la memoria: referencias, objetos, la pila de llamadas creciendo y encogiéndose en cada llamada recursiva. Cuándo: para depurar tu comprensión, no solo tu código. Pega tu
ListaEnlazadadel módulo 2 y mira los nodos apuntándose; pega un recorrido recursivo y observa la pila de llamadas que estudiamos en el módulo 3 hacerse visible.
Temas siguientes naturales
El curso te deja en la frontera de varios caminos. Ordenados por continuidad con lo que ya sabes:
| Tema | Qué es | Por qué es el siguiente paso | Con qué recurso |
|---|---|---|---|
| Algoritmos de ordenación en detalle | Mergesort, quicksort, heapsort, y por qué sort() de Python (Timsort) es como es |
Usaste sort() todo el curso; heapsort es tu Monticulo aplicado |
CLRS caps. 2, 6-8; VisuAlgo "Sorting" |
| Programación dinámica | Optimización descomponiendo en subproblemas que se solapan | Es tu memoización del módulo 5 elevada a método general | Grokking Algorithms (cap. 9) para la idea; LeetCode etiqueta dynamic-programming |
| Tries (árboles de prefijos) | Árbol donde cada camino deletrea una palabra | La estructura "de verdad" del autocompletar de 08-01; combina árboles + diccionarios | Problem Solving with A&DS; LeetCode trie |
| Grafos avanzados | Componentes fuertemente conexas, flujo máximo, A* | Continuación directa del módulo 7 | CLRS caps. 22-26 |
| Estructuras probabilísticas | Bloom filters, HyperLogLog: responden "¿probablemente está?" con memoria mínima | Giro mental sobre tu tabla hash: aceptar error a cambio de espacio | Búsqueda "bloom filter python tutorial"; implementarlo son ~30 líneas |
| Bases de datos por dentro | Cómo un motor real usa B+, hash y LSM-trees | Viste los árboles B en el módulo 6; SQLite es software libre y legible | Libro online gratuito Use The Index, Luke; documentación de SQLite |
No intentes abordarlos todos: elige uno (para un perfil junior, ordenación o programación dinámica son las apuestas más rentables) y dale un mes.
Seguir practicando con TaskFlow
TaskFlow es tuyo: el mejor campo de prácticas es extenderlo. Ideas ordenadas de menor a mayor esfuerzo, cada una atada a lo que ejercita:
- Persistencia: guardar y cargar las tareas en JSON, midiendo con
timeitcuánto cuesta reconstruir los índices al arrancar (módulos 1 y 5). - Papelera con caducidad: tareas borradas recuperables durante N acciones — un
deque(maxlen=N)de tuplas (tarea, acción en la que se borró) (módulos 3 y 4). - Etiquetas jerárquicas: que
trabajo/backendherede búsquedas detrabajo— árbol general + índice invertido colaborando (módulos 5 y 6). - Recordatorios programados: un montículo por fecha de vencimiento que dispara avisos — tu
BandejaUrgenciascon el tiempo como prioridad (módulos 4 y 6). - Modo multiusuario: grafo de colaboradores (quién ha trabajado con quién) con
sugerir_colaboradoresmejorado (módulo 7). - Caché LRU real para las búsquedas frecuentes: implementa el diseño del ejercicio 3 de 08-01 y compáralo con
functools.lru_cache(módulos 2 y 5).
La lección siguiente convierte tres de estas líneas en proyectos completos con requisitos y criterios de evaluación.
Errores Comunes y Consejos
Adaptamos la sección habitual: aquí los errores son de uso de los recursos.
- Coleccionar en vez de estudiar. Guardar 40 enlaces produce la misma mejora que guardar cero. Regla: máximo un libro, una plataforma y un visualizador activos a la vez.
- El "tutorial infinito". Encadenar cursos y vídeos sin resolver problemas es la forma más cómoda de no avanzar. Proporción sana: por cada hora de lectura/vídeo, al menos una hora de teclado.
- Práctica espaciada, no atracones. Veinte minutos diarios durante un mes fijan más que un sábado de ocho horas. El olvido es el mecanismo: repasar justo cuando empiezas a olvidar (a los 2 días, a la semana, al mes) es lo que consolida.
- Implementar de memoria. El test definitivo de una estructura no es leerla: es cerrarlo todo y escribir tu
TablaHasho tu BFS en un editor vacío. Hazlo con una estructura distinta cada semana. - Explicar a otros. Escribe un pequeño artículo, contesta una duda en un foro o explícale los montículos a un compañero. Si no puedes explicarlo sin mirar, aún no era tuyo (y explicar es repasar).
- Medir la frustración como señal, no como veredicto. Atascarse es el estado normal del aprendizaje de algoritmos. La pregunta no es "¿me atasco?" sino "¿me atasco en cosas más difíciles que hace un mes?".
Ejercicios
Ejercicio 1
Elabora tu plan de estudio para las próximas 4 semanas usando solo recursos de esta lección: elige un libro, una plataforma con una etiqueta concreta de inicio y un tema "siguiente natural", y justifica cada elección en una frase según tu punto débil detectado en el test de 08-02.
Ejercicio 2
Entra en la wiki TimeComplexity y responde con ella (no de memoria): (a) ¿qué coste tiene x in s para un set en el caso medio y en el peor caso? (b) ¿qué operación de deque es O(n) pese a la fama de "todo O(1)" de la estructura? (c) ¿coincide el peor caso de dict.get con lo que aprendiste en el módulo 5 sobre colisiones?
Ejercicio 3
En VisuAlgo, sección de AVL, inserta la secuencia 1, 2, 3, 4, 5, 6, 7 y anota qué rotación dispara cada inserción. Después predice en papel qué pasará con la secuencia 7, 6, 5, 4, 3, 2, 1 y verifícalo en el visualizador.
Soluciones
Ejercicio 1. No hay una única respuesta; un plan tipo para un perfil que falló las preguntas de árboles del test: Problem Solving with A&DS (capítulos de árboles, porque da una segunda implementación completa), LeetCode etiqueta binary-search-tree en dificultad Easy (práctica agrupada del punto débil), y como tema siguiente "ordenación en detalle" (rentabiliza el Monticulo ya construido vía heapsort). Lo esencial es que cada elección se justifique por tu diagnóstico, no por popularidad.
Ejercicio 2. (a) O(1) medio, O(n) peor caso — el peor caso ocurre cuando todas las claves colisionan. (b) El acceso por índice en posiciones centrales, d[i], es O(n) (y también insert/remove en medio): el deque optimiza extremos, no interior. (c) Sí: el O(n) del peor caso de dict.get es exactamente el escenario de colisiones masivas del módulo 5 — todas las claves en el mismo cubo forman una cadena que hay que recorrer; el rehashing y una buena función hash lo hacen improbable, no imposible.
Ejercicio 3. Con 1..7 ascendente, cada desequilibrio es derecha-derecha y se corrige con rotaciones simples a la izquierda (disparan al insertar 3, 5 —reequilibrio local—, 6 y 7, según el estado del árbol). La predicción para 7..1: el caso espejo — desequilibrios izquierda-izquierda, rotaciones simples a la derecha en los puntos simétricos, y un árbol final con la misma forma equilibrada. Si tu anotación difiere en qué inserción exacta dispara cada rotación pero acertaste el tipo de rotación y la simetría, el concepto está aprendido.
Conclusión
Ya tienes la biblioteca: la documentación oficial como referencia diaria, Grokking y el libro de Runestone como siguientes lecturas, CLRS como enciclopedia, LeetCode/HackerRank/Exercism como gimnasio, VisuAlgo y Python Tutor como microscopio, y una lista corta de temas por los que crecer. Recuerda la regla que atraviesa toda la lección: pocos recursos, mucha práctica, espaciada y de memoria. Solo queda una cosa por hacer en este curso, y es la más importante: construir. En la última lección te esperan los tres proyectos finales.
Curso de Estructuras de Datos
Módulo 1: Introducción a las Estructuras de Datos
- ¿Qué son las Estructuras de Datos?
- Importancia de las Estructuras de Datos en la Programación
- Tipos de Estructuras de Datos
- Complejidad Algorítmica y Notación Big O
- Arrays y Memoria: la Base de las Estructuras de Datos
Módulo 2: Listas
- Introducción a las Listas
- Listas Enlazadas
- Listas Doblemente Enlazadas
- Listas Circulares
- Ejercicios con Listas
Módulo 3: Pilas
- Introducción a las Pilas
- Operaciones Básicas con Pilas
- Implementación de Pilas
- Aplicaciones de las Pilas
- Ejercicios con Pilas
Módulo 4: Colas
- Introducción a las Colas
- Operaciones Básicas con Colas
- Colas Circulares
- Colas de Prioridad
- Colas Dobles (Deques)
- Ejercicios con Colas
Módulo 5: Tablas Hash y Diccionarios
- Introducción a las Tablas Hash
- Funciones Hash y Resolución de Colisiones
- Diccionarios y Conjuntos en la Práctica
- Ejercicios con Tablas Hash
Módulo 6: Árboles
- Introducción a los Árboles
- Árboles Binarios
- Recorridos de Árboles
- Árboles Binarios de Búsqueda
- Árboles AVL
- Árboles B
- Montículos (Heaps)
- Ejercicios con Árboles
Módulo 7: Grafos
- Introducción a los Grafos
- Representación de Grafos
- Algoritmos de Búsqueda en Grafos
- Algoritmos de Caminos Mínimos
- Árboles de Expansión Mínima
- Aplicaciones de los Grafos
- Ejercicios con Grafos
