INDICE VIDEOS TEORIA 2025

Clase 1

  • ENLACE Introducción al curso: Presentación de la materia, la cátedra y los docentes.
  • ENLACE Evaluación del curso: Fechas y detalles sobre parciales y trabajos prácticos.
  • ENLACE Contenido del curso: Temas a tratar, incluyendo listas, árboles y conjuntos.
  • ENLACE Videos y recursos: Enlaces a clases y material de apoyo.
  • ENLACE Instrucciones para TPL1: Explicación del primer trabajo práctico.
  • ENLACE Diseño y análisis de algoritmos: Definición y analogías de algoritmos.
  • ENLACE Ejemplos de problemas: "Problema del Agente Viajero" y "caballo de ajedrez".
  • ENLACE Estrategias para resolver problemas: Búsqueda exhaustiva y algoritmos heurísticos.
  • ENLACE Sincronización en cálculo distribuido: Procesamiento con memoria compartida.
  • ENLACE Introducción básica a grafos: Definición y representación de grafos.
  • ENLACE Planteo del problema mediante grafos: Modelado de problemas de sincronización.
  • ENLACE Generación de coloraciones: Explicación de coloraciones en grafos.
  • ENLACE Crecimiento del tiempo de ejecución: Análisis del crecimiento exponencial en algoritmos.
  • ENLACE Algoritmo heurístico ávido: Introducción a una estrategia de solución eficiente.
  • ENLACE Tiempo de ejecución del algoritmo ávido: Comparación de eficiencia con búsqueda exhaustiva.
  • ENLACE Tiempos de ejecución de un programa: Análisis de eficiencia en términos de recursos.
  • ENLACE Notación asintótica: Introducción a la notación "O" para comparar algoritmos.

Clase 2

  • ENLACE Clase de complejidad NP: Introducción al tema principal del video.
  • ENLACE Reducción de problemas: Análisis de cómo se comporta un problema al reducirse a otro.
  • ENLACE Método de la burbuja: Explicación de este algoritmo de ordenamiento simple.
  • ENLACE Llamadas a funciones y bucles: Discusión sobre las estructuras "for" y "while".
  • ENLACE Ventajas del método de la burbuja: A pesar de ser un algoritmo lento, se mencionan casos donde puede ser útil.
  • ENLACE Concepto de "wrapper": Presentación de esta función que adapta argumentos para llamar a otra función.

Clase 3

Parte 1: Implementación de Listas con Arreglos

  • ENLACE - Introducción: Se comienza explicando cómo representar listas utilizando arreglos.
  • ENLACE - Diseño de la Clase `List`: Se presenta la estructura de la clase en C++, incluyendo sus miembros privados (`MAX_SIZE`, `elems`, `size`).
  • ENLACE - Métodos Públicos: Se detallan las funciones principales de la clase, como `insert`, `erase`, `clear`, `begin`, `end` y `next`.
  • ENLACE - Operación `insert`: Se explica cómo funciona la inserción de un elemento y el desplazamiento necesario en el arreglo.
  • ENLACE - Código C++: Se muestra un fragmento de código con la implementación de la clase y sus métodos.
  • ENLACE - Iteradores `begin()` y `end()`: Se explica la función de los iteradores para marcar el inicio y el fin de la lista.
  • ENLACE - Método `insert` (en detalle): Se profundiza en la implementación del método, incluyendo validaciones.
  • ENLACE - Método `erase`: Se describe el proceso de eliminación de un elemento y el reajuste del arreglo.
  • ENLACE - Función `clear`: Se introduce cómo eliminar todos los elementos de la lista.

Parte 2: Desventajas y Alternativas

  • ENLACE - Limitaciones de los Arreglos: Se discuten los problemas de usar un almacenamiento rígido.
  • ENLACE - Complejidad de `insert` y `erase`: Se menciona que estas operaciones tienen un costo promedio de O(n).

Parte 3: Listas por Celdas Enlazadas

  • ENLACE - Introducción a Celdas Enlazadas: Se presenta un nuevo enfoque para implementar listas.
  • ENLACE - Estructura `cell` y Clase `List`: Se define cómo se estructura una celda y la lista con punteros.
  • ENLACE - El Concepto de "Posición": Se explica cómo se manejan las posiciones en este tipo de listas.
  • ENLACE - Inserción en Listas Enlazadas: Se ilustra el proceso de añadir un nuevo elemento.
  • ENLACE - Celda de Encabezamiento: Se introduce un objeto para gestionar los punteros al primer y último elemento.
  • ENLACE - Ejemplos de `retrieve`: Se muestra cómo recuperar elementos en diferentes posiciones.
  • ENLACE - Implementación General: Se presenta el código para listas con celdas enlazadas.
  • ENLACE - Inicialización: Se explica cómo crear una lista enlazada desde cero.
  • ENLACE - Función `clear()`: Se detalla cómo vaciar una lista enlazada.
  • ENLACE - Iterador `prev`: Se muestra la implementación del iterador para retroceder en la lista.
  • ENLACE - Método `insert` (en detalle): Se profundiza en la inserción para listas enlazadas.
  • ENLACE - Método `erase` (en detalle): Se describe el proceso de eliminación en este tipo de listas.
  • ENLACE - `clear()` con `erase`: Una forma alternativa de implementar la función de limpieza.
  • ENLACE - Implementación de `begin()` y `end()`: Cómo funcionan los iteradores en listas enlazadas.

Parte 4: Listas por Cursores

  • ENLACE - Introducción a Listas por Cursores: Se presenta este concepto como una alternativa a los punteros.
  • ENLACE - Asignación de Memoria: Se explica cómo se gestionan las celdas en un área de memoria dinámica.
  • ENLACE - Beneficios de los Cursores: Se analizan las ventajas, como una gestión de memoria más eficiente.

Clase 4

Parte 1: Correspondencias

  • ENLACE - Introducción a las Correspondencias: Se explica que son estructuras similares a una base de datos que almacenan pares de clave-valor.
  • ENLACE - Definición de una Clase: Se muestra cómo definir una clase para una correspondencia, incluyendo su constructor y características.
  • ENLACE - Acceso a Clave y Valor: Se destaca que los métodos para acceder a los datos dependen de si la correspondencia está ordenada o no.
  • ENLACE - Clase `Map`: Se introduce `Map` como un tipo de plantilla con dos argumentos.
  • ENLACE - Rendimiento de Operaciones: Se presenta una tabla comparando la complejidad temporal de operaciones (`find`, `insert`, `erase`, `clear`) para listas y vectores.
  • ENLACE - Vectores Ordenados: Se discuten las ventajas de usar vectores ordenados, especialmente para la búsqueda binaria.
  • ENLACE - Clase `Element_t`: Se define la clase `element_t`, que contiene los campos `first` y `second`.
  • ENLACE - Sobrecarga de Operadores: Se explica cómo sobrecargar el operador `<` para permitir el ordenamiento de clases personalizadas.

Parte 2: Árboles

  • ENLACE - Introducción a los Árboles: Se explica el concepto de árbol y su definición recursiva.
  • ENLACE - Organización Jerárquica: Se muestra cómo se organizan los nodos en una estructura jerárquica.
  • ENLACE - Conceptos Fundamentales: Se definen términos clave como padre, hijo, hojas, nivel y profundidad.
  • ENLACE - Recorridos de Árboles: Se explican diferentes formas de recorrer un árbol:

Parte 3: Aplicaciones Prácticas

  • ENLACE - Calculadora RPN con una Pila: Se detalla la implementación de una calculadora de Notación Polaca Inversa (RPN) utilizando una pila, explicando cómo se manejan los operandos y operadores.

Parte 4: Tipos de Datos (en detalle)

  • ENLACE en adelante: Se realiza una discusión extensa sobre diversos tipos de datos y sus propiedades.

Clase 5

  • ENLACE Notación Lisp para árboles: Se explican las expresiones matemáticas complejas, con ejemplos de notación Lisp y sus ventajas.
  • ENLACE Reconstrucción del árbol: Se plantea si es posible reconstruir un árbol a partir de su listado y se propone el desafío de encontrar el árbol.
  • ENLACE Inserción en árboles: Se detallan las operaciones de inserción con ejemplos.
  • ENLACE Algoritmo para copiar árboles: Se explica el algoritmo de copia, con ejemplos y la variante de copia espejo.
  • ENLACE Supresión en árboles: Se abordan las operaciones de supresión y la poda de nodos impares.
  • ENLACE Operaciones básicas sobre árboles: Se describen las operaciones fundamentales.
  • ENLACE Implementación por punteros: Se profundiza en la clase `iterator_t`, sus campos, la implementación de la clase `Tree` y sus constructores.
  • ENLACE Tiempos de ejecución: Se analizan los tiempos de ejecución de las operaciones básicas.
  • ENLACE Árboles binarios: Se define qué son los árboles binarios y sus diferencias con los árboles generales.

Clase 6

  • ENLACE Árboles Binarios:
  • ENLACE Listado Simétrico en Árboles Ordenados:
  • ENLACE Notación Lisp:
  • ENLACE Operaciones de Árboles Abstractos:
  • ENLACE Interfaz Básica en Programación:
  • ENLACE Programación Funcional en Árboles Binarios:
  • ENLACE Árboles de Huffman:
  • ENLACE Condición de Prefijo en Árboles de Huffman:
  • ENLACE Representación de Árboles de Huffman:
  • ENLACE Códigos Redundantes en Árboles de Huffman:

Clase 7

  • 00:00 Presentación inicial e introducción al tema.
  • 03:15 Explicación detallada del algoritmo de Huffman.
  • 26:22 Discusión sobre la notación y operaciones de conjuntos.
  • 54:49 Implementación de conjuntos mediante vectores de bits.
  • 01:28:13 Explicación sobre las relaciones de orden en los conjuntos.
  • 01:31:01 Definición y ejemplos de una relación de orden en programación.
  • 01:35:10 Discusión sobre el uso de la clase "A" en relaciones de orden.
  • 01:38:59 Interfaz avanzada para la gestión de conjuntos.
  • 01:54:50 Análisis del flujo de datos en un programa de compresión de archivos.
  • 02:08:38 Introducción a los diccionarios en el contexto de algoritmos y estructuras de datos.

Clase 8 2025-10-21. Parte 1

  • Introducción y Conceptos Básicos Contexto del TAD Diccionario y presentación de las Tablas de Dispersión (Hash Tables). [01:51]
  • Cubetas y Función de Dispersión Definición de las Cubetas (Buckets) y la Función de Dispersión ($H(x)$). Uso de la operación módulo. [03:17]
  • Colisiones y Efecto Cumpleaños Definición y riesgo de Colisiones. Explicación del Efecto Cumpleaños (Birthday Effect) y el Birthday Attack (cálculo de probabilidad por raíz cuadrada). [11:36]
  • Tablas Abiertas (Separate Chaining) Implementación con Vector de Listas. Discusión sobre el costo promedio de operaciones: $O(1 + n/B)$. [20:00]
  • Implementación y `next_out` Estructura del iterador y las funciones `insert`, `find`, y la complejidad del iterador (`begin`, `next_out`) cuando la tabla está vacía o llena. [29:05]
  • Funciones Hash de Calidad Importancia de la uniformidad y el Efecto Cascada. Ejemplo de función hash sumando caracteres de un `string`. [51:11]
  • Tablas Cerradas (Open Addressing) Implementación con Vector de Elementos. Uso de valor especial `undef` y la estrategia de Sondeo Lineal (búsqueda circular). [01:01:03]
  • Costo de Inserción Exitosa Análisis del costo de la inserción exitosa en tablas cerradas en función de la Tasa de Ocupación ($\alpha$): $\frac{1}{1-\alpha}$. [01:14:48]
  • Costo de Búsqueda y Supresión Costo de la Búsqueda Exitosa e Inserción No Exitosa (fórmula con logaritmo). Problema de la supresión y el uso del valor `deleted`. [01:22:29]
  • Reinserción Continua y Vicios Concepto de "envenenamiento" de la tabla y la solución de Reinserción Continua para evitar el uso de `deleted`. [01:31:10]
  • Hash Criptográfico y Seguridad Aplicaciones de las funciones hash (SHA-256, MD5) en Firma Digital. Explicación del Ataque por Colisión y cómo se explota el Birthday Attack. [01:46:42]

Clase 9 2025-10-21. Parte 2

  • I. Aplicación Criptográfica de Funciones Hash (Blockchain)
    • Hash en Blockchain Uso del hash para asegurar que todas las copias del Libro Contable (Ledger) de la red sean idénticas. [00:22]
    • Bloques y Encadenamiento Las transacciones se agrupan en Bloques, y cada bloque incluye el hash del bloque anterior, creando una Blockchain. [04:00]
    • Prueba de Trabajo (Proof of Work) Mecanismo para evitar ataques: se requiere encontrar un número (Nonce) tal que el hash del bloque cumpla con una condición (ej. una cantidad de ceros iniciales). [05:35]
    • Minado y Dificultad El proceso de Minado consiste en la búsqueda por fuerza bruta de ese Nonce, regulado por el Grado de Dificultad. [07:06]
    • Explorador de Blockchain Visualización en tiempo real de los bloques, transacciones y hashes. [09:33]

  • II. Conjuntos con Árboles Binarios de Búsqueda (BST)
    • Definición de BST Un nodo separa a elementos menores a la izquierda y mayores a la derecha; la condición se aplica recursivamente. [12:59]
    • Propiedades y Costo La longitud de los caminos es $O(\log N)$ si el árbol está balanceado. El listado en orden simétrico produce los elementos ordenados. [14:55]
    • Operación Find e Insert El costo de buscar o insertar un elemento es proporcional a la longitud del camino recorrido. [21:44]
    • Operación Erase (Borrado) Se distinguen y resuelven los tres casos de borrado: 0 hijos (hoja), 1 hijo (sube el subárbol), y 2 hijos (se reemplaza por el mínimo del subárbol derecho). [24:49]
    • Recorrido (Operador `P++`) Lógica para encontrar el siguiente elemento en orden (sucesor) para el iterador. [29:41]
    • Peor Caso y Balanceo El peor caso ocurre cuando el BST degenera en una lista (ej. al insertar elementos ordenados), llevando el costo a $O(N)$. [48:23]
    • Árboles Autobalanceados Introducción a los algoritmos (ej. AVL) basados en Rotaciones para mantener el árbol balanceado y el costo en $O(\log N)$. [51:38]

  • III. Introducción a Ordenamiento (Sorting)
    • Conceptos Iniciales Enfoque en el Ordenamiento Interno (datos en memoria principal) y la diferencia de algoritmos para vectores vs. listas. [57:28]
    • Costo Algorítmico El piso teórico de complejidad para algoritmos de ordenamiento por comparación es $O(N \log N)$. [01:03:00]
    • Estabilidad Definición y utilidad de un algoritmo estable: los elementos equivalentes mantienen su orden relativo original. [01:08:38]
    • Funciones de Comparación Generalmente, solo se necesita definir la relación de "menor" (predicado binario) para derivar las demás comparaciones. [01:15:57]
    • Operador Nave Espacial Presentación del operador `operator<=>` (spaceship operator) de C++ que retorna $-1$, $0$ o $1$ y simplifica todas las comparaciones. [01:18:15]

Clase 10 2025-10-29

I. Ordenamiento. Introducción y Conceptos Fundamentales

  • [00:03] Introducción al capítulo de Ordenamiento (Sorting).
  • [00:19] Repaso de la Relación de Orden y eficiencia esperada.
  • [01:45] El operador "Nave Espacial" (`operator<=>`) y su uso para comparación.
  • [04:10] Implementación de `operator<=>` para clases compuestas.
  • [09:46] Introducción a los Métodos de Ordenamiento Lentos ($\mathcal{O}(N^2)$).

II. Métodos de Ordenamiento Lentos ($\mathcal{O}(N^2)$)

  • [10:16] Método de la Burbuja (Bubble Sort): Funcionamiento conceptual.
  • [13:39] Implementación de las funciones de ordenamiento: Uso de Rangos (`first`, `last`) y Función de Comparación (`comp`).
  • [16:19] Ejemplos de uso (ej. ordenar por valor absoluto) y sobrecarga con `std::less`.
  • [19:25] Uso de Aritmética de Punteros para Iteradores en la implementación de los algoritmos.
  • [27:54] Método de Inserción (Insertion Sort).
  • [32:05] Método de Selección (Selection Sort).
  • [34:14] Comparación de métodos lentos: Complejidad en el mejor y peor caso (Anomalía de Insertion Sort en caso ordenado: $\mathcal{O}(N)$).
  • [36:21] Cantidad de intercambios (swaps): Ventaja de Selection Sort ($\mathcal{O}(N)$).
  • [38:09] Ordenamiento Indirecto para minimizar el movimiento de objetos grandes.

III. Algoritmos de Ordenamiento Rápido ($\mathcal{O}(N \log N)$)

  • [42:37] Quicksort: Estrategia "Dividir para Vencer" y el concepto de Pivote.
  • [47:34] Análisis de Complejidad de Quicksort (Caso balanceado: $\mathcal{O}(N \log N)$).
  • [56:41] Implementación de la función auxiliar `particiona` (Partition).
  • [01:03:59] Costo del particionamiento: $\mathcal{O}(N)$.
  • [01:04:05] Estrategia para elegir el pivote (Mediana).
  • [01:08:14] Optimización: Switcheo de algoritmos para arreglos pequeños (ej. Quicksort a Bubble Sort).
  • [01:12:49] Peor caso de Quicksort: degeneración a $\mathcal{O}(N^2)$ (ej. arreglo ordenado).
  • [01:20:20] Animación comparativa de Bubble Sort vs Quicksort.

IV. Heapsort y Solución de la STL

  • [01:21:58] Heapsort: Estructura ideal y operaciones deseadas en $\mathcal{O}(\log N)$.
  • [01:25:27] La estructura de Montículo (`Heap`): Parcialmente ordenado y parcialmente completo.
  • [01:28:49] Implementación del montículo en un Vector (cálculo de hijos/padre por aritmética).
  • [01:31:36] Operación `Insert` en un montículo.
  • [01:33:23] Operación `Erase` (extracción del mínimo) y el procedimiento Reheap (`remonticulizar`).
  • [01:41:21] Aplicación: Cola de Prioridad (`std::priority_queue`).
  • [01:44:23] Inicialización del montículo: MakeHeap (de abajo hacia arriba).
  • [01:46:56] Costo de `MakeHeap`: $\mathcal{O}(N)$.
  • [01:52:56] El algoritmo Heapsort (ordenamiento in place).
  • [01:56:34] Comparación Quicksort vs Heapsort (Heapsort garantiza $\mathcal{O}(N \log N)$).
  • [01:58:55] Solución de la STL: Introsort (Quicksort con fallback a Heapsort para evitar el peor caso).
  • [02:02:28] Cierre de la clase.

This topic: Main/AED > IndiceVideos2025
Topic revision: 29 Oct 2025, MarioStorti
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback