- Quien soy
- Formacion en
- Matematica y
- Informatica
- Investigacion en
- Teoria de la Computacion (Analisis de Algoritmos y Estructuras de Datos)
- Pedagogia (http://teachingislearning.cl)
- (un poco) hactivismo (Aaron Swartz day)
- Quienes son
- Mayoridad plan comun
- no todos futuros “computines”
- El curso
- Objetivo: Aprender a formalizar problema, soluciones, medidas para comparar las soluciones (para la computacion, pero tambien para muchos otros temas, desde los procesos industriales hasta las tareas de la vida)
- Componente
- Quienes son
- teorico (clases magistrales, controles, examen) con
- conneccion a la practica (5 tareas en java)
- Modalidades:
- Evaluacion
- 5 tareas (primera [2018-03-16 Fri])
- 2 controles
- 1 examen final
- Clases
- Charla interactivas los Martes y Jueves
- Clases de ejercicios los Viernes
- Online
- publicacion de
- apuntes “vivas” en Material Docente
- plan de cursos (Corto) en Blog
- Uso intenso del foro:
- los alumnos tienen que responder a las preguntas de los (otros) alumnos,
- el rol del equipo docente es de verificar la validad de las respuestas.
- publicacion de
- Que hay en un computador
- CPU
- ALU
- Memoria
- Perifericos
- Que hace un programa
- Secuencia
- Instrucciones
- Input (read)
- Output (write)
- Flow (if, then, else, while, until,…)
- Librarias
- Que hace un algoritmo?
- trabajo preliminario antes de programar
- trabajo en comun entre la programacion en multiples plateformas
- tener un languaje sobre los programas que no pueden existir
- Arquitectura del Computador
- CPU
- Memoria
- Punteros
- Variables de Referencia
- Herramientas: <<<Estructuras de Datos>>> (Concreto)
- Martillo (de metal)
- tornillador (cruciforme)
- Arreglo
- Punteros y Variables de Referencia
- Applicaciones: <<<Tipos de Datos Abstractos>>> (Abstraccion)
- Martillar (concepto)
- tornillar (concepto)
- Conjunto
- [ ] encuentra(clave)
- [ ] tamano()
- [ ] agrega(clave) (para conjunto dinamico)
- [ ] borra(clave) (para conjunto dinamico)
- [ ] encuentraMinimo() (para “cola de prioridad minima”)
- [ ] encuentraMaximo() (para “cola de prioridad maxima”)
- [ ] borraMinimo() (para “cola de prioridad minima”)
- [ ] borraMaximo() (para “cola de prioridad maxima”)
- Diccionario
- [ ] encuentra(clave) -> dato
- [ ] tamano()
- [ ] agrega(clave,dato) (para diccionarios dinamicos)
- [ ] borra(clave) (para diccionarios dinamicos)
- [ ] encuentraProximo(clave) (para diccionarios ordenados)
- [ ] encuentraPrevio(clave) (para diccionarios ordenados)
http://users.dcc.uchile.cl/~bebustos/apuntes/cc3001/Repaso/
- Introduccion
- Que vimos la otra vez?
- Apuntes en linea
- http://users.dcc.uchile.cl/~bebustos/apuntes/cc3001/
- https://www.u-cursos.cl/ingenieria/2016/2/CC3001/2/enlaces/
- Syntaxis Java
- Variables
- Constantes
- Instrucciones
- Salida
- Condicionales
- Loops
- Ejemplos
- Ordenar por insercion
- Ordenar por seleccion
- Ordenar por burbuja
- Calculo de x^n (mas sobre eso en recurrencias)
- Conceptos de Programacion
- iterativo (Assembler, Basic)
- Orientada a Objetos (Java, python)
- Funcionales (ML, Caml, python)
- Syntaxis Java
- Problema de Ordenacion:
- input
- output
- applicaciones
- Algoritmos de Ordenacion
- Ordenar por insercion
- Ordenar por seleccion
- Ordenar por burbuja
- Mas alla (OPCIONAL):
- Analisis por el Peor Caso
- Analisis por el Mejor Caso
- Analisis por el Caso Promedio
- “el” “Mejor” algorimo
- El mejor algoritmo absoluto no exite
- Comparar de manera absoluta dos algoritmos es poco practico
- Peor/Mejor/Promedio Caso (por n fijo)
- Mejor Caso
- Peor Caso
- Caso Promedio
- Complejidades en el peor caso de Algoritmos de Ordenamiento Basicos
- Ordenar por insercion
- Ordenar por seleccion
- Ordenar por burbuja
- Asimptoticas
- Complejidad en el peor caso por (tamano de input) n fijo define una fonccion
- nos interesa el comportamiento por grandes valores de n
- no nos interesa mucho (en primera instancia) los factors constantes
- Recursividad
- x^n
- torre de Hanoi
- x!
- (OPT) Fibonacci
- Backtracking
- Solucion de Laberinto
- minMax algorithm in game programming (Checkers)
- (OPT) SIMPLEX (optimizacion combinatoria)
- (OPT) Problemas de las
$n$ reinas- Recurrencia
- tiempo
- Espacio
- Notaciones
- O
- Omega
- Theta
- o (OPCIONAL)
- w (OPCIONAL)
- Ecuaciones de Recurcion
- (Algunas) Ecuaciones Non Lineales: Teorema Maestro:
$T(n) = p T(n/q) + kn$
- (Algunas) Ecuaciones Non Lineales: Teorema Maestro:
- Desarolla
$T(n) = kn + p T(n/q)$ - T(n) = kn ∑i∈[0..j-1 (p/q)^i + p^i T(1/q^i)
- Caso
$p>q$ - $T(n) ∈ O(nlog_q p)$
- Caso
$p=q$ $T(n) ∈ O(nlg n)$
- Caso
$p<q$ -
$T(n) ∈ O(n)$ - Ecuaciones Lineales con coeficientes constantes: $f_n = A fn-1 + B fn-2 + C fn-3 + …$
-
- Soluciones de la forma f_n = λ ^n
- para encontrar cual:
$f_n = λ ^n$
- Ejemplo: resuelve f_n = fn-1 + fn-2
- Equivale a resolver $λ ^n = λn-1 + λ n-2
- divide por $λn-2
- obtiene el polinomo caracteristico
- le resuelve
- usa los casos
- Ecuaciones de primer orden:
$T(n) = a T(n-1) + b_n$
- Ecuaciones de primer orden:
- Caso a = 1 : T(n) = T(n-1) + b_n
- Telescopica:
$T(1) = T(0) + ∑_{i∈[1..n] b_i$
- Caso a general
- T(n) = a T(n-1) + b_n
- divide by
$1/a_n$
- divide by
- $T(n) / a_n = T(n-1) / an-1 + b_n / a_n$
- Define T’(n) = T(n) / a_n
- T’(n) = T’(n-1) + b’_n
- (…)
- T(n) = a^n T(0) + ∑i=1^n b_i an-i
- Example Hanoi:
- T(n) = 2 T(n-1) + 1
- T(n) = 2^n - 1
- Resolver otras Ecuaciones de recurrencia
- Example Hanoi:
- T(n) = a T(n-1) + b_n
- Prueba por Induccion
- Software: Matlab, Maple
- Campo entero de Mathematica:
- “Functional Analysis”
- Fractals
- etc…
- Fibonacci
- Programacion Dinamica
- Algoritmos Avaros
- Dividir para Reinar
- Basico: binary search
- General: Merge Sort
- Advanced: Optimal Boxes (Satellite imagery)
- Notaciones Asimptoticas en Practica
- Inutiles para diferenciar “Insertion Sort” y “Selection Sort”
- Utiles para diferenciar “Merge Sort” and “Insertion Sort”
- Inutiles (de nuevo) para diferenciar “Merge Sort” y “Heap Sort”
- Repaso:
- Recurrencias y Teorema Maestro
- Caso
$p>q$ : $T(n) ∈ O(nlog_q p)$ - Caso
$p=q$ :$T(n) ∈ O(nlg n)$ - Caso
$p<q$ :$T(n) ∈ O(n)$
- Caso
- Programas Recursivos
- Hanoi
- Fibonacci
- (Edit Distance)
- Programacion Dinamica: resolver problemas de optimizacion (maximizacion o minimizacipn de alguna funcion objetivo)
- Ejemplo: Multiplicacion de una secuencia de matrices
- A 100x10, B 10x100, C 100x10
- (AB)C = 200.000, A(BC) = 20.000
- Explosion de solucion ingenuas:
- los subproblemas se “traslapan” (overlapping problems)
- Tiempo en $4^n / n3/2$
- Pero hay solamente n(n-1)∈ O(n^2) problemas distintos!
- memoization = Uso de memoria
- Espacio en
$O(n^2)$ - Tiempo en
$O(n^3)$ - Ejemplos de Applicaciones
- Espacio en
- Multiplicacion de secuencia
- Longest Increasing Subsequence
- (Edit Distance)
- State “CANC” from “” [2018-04-09 Mon 13:46]
- Algoritmos Avaros (“Greedy Algorithms”)
- para resolver problemas de optimisacion
- busca optimum local, simple de programar:
- toma decisiones en base a informacion local
- nunca cambia una decision pasada
- no siempre optimal (e.g. cuando algunos optimos locales no son globales)
- Ejamplo:
- camino mas corto
- assignacion de actividades (ejemplo de las apuntes)
- Estudio de Caso: Subsecuencia de Suma Maxima
- Definicion:
- Estudio de Caso: Subsecuencia de Suma Maxima
- Dados enteros
$A_1,\ldots,A_n$ - Encontrar
$i,j$ tal que $∑k∈[i..j] A_k$ es maximo- Ejemplo
- S = -2,11,-4, 13, -5, -2
- Respuesta: 20
- Soluciones
- Fuerza Bruta:
$O(n^2)$ - Fuerza Bruta mejorado:
$O(n^2)$ - Dividiendo el problema:
$O(nlg n)$
- Fuerza Bruta:
-
$T(n)= 2 T(n/2) + O(n)$ - Algoritmo Eficiente:
$O(n)$
- Algoritmo Eficiente:
- Soluciones
- Importancia del orden (arreglo en los slides de Benjamin)
- OJO: problema distinto de la optimizacion del calculo del producto de una cadena de matrices
- Simple algoritmo:
$O(n^3)$ - Se puede mejorar?
- no mejor que
$O(n^2)$ -> la complejidad del problema es a dentro de$Ω(n^2)$ - problema abierto por mucho tiempo de mejorar
$O(n^3)$ o$Ω(n^2)$ - en 1960, Strassen mostro como mejorar
$O(n^3)$ por dividir y conquistar-
$T(N) ∈ 7T(N/2) + O(N^2)$ -> $T(N) ∈ O(Nlog_2(7)) \subseteq O(N2.81)$ - Nota:
-
- Todavia no es abierto el problema de la complejidad
- Algoritmo de Strassen mejor solamente cuando N es muy grande
- El algoritmo es numericamente inestable.
- La multiplicacion de 2 matrices tiene muchas applicaciones sorprendantes (Transforma de Fourier)
- The (simplified) Teorema maestro as previously taught applies to recurrences of the form
$T(n) = p T(n/q) + kn$ - Strassen algorithms yields a recurrence in
$T(N) ∈ 7T(N/2) + O(N^2)$ - The result of $O(N2.81)$ is still valid by the more general master theorem (e.g. as described on https://en.wikipedia.org/wiki/Master_theorem), for equations of the form
$T(n) = p T(n/q) + f(n)$ where$f(n)∈ O(n^c)$ where$c<log_p q$ .
- State “ACTF” from “” [2015-10-01 Thu 11:09]
- Contexto:
- Applicaciones:
- Comparar dos secuencias de ADN o ARN
- Comparar dos tareas submitidas por alumnos
- En general, es una medida (entre otras) para determinar si dos secuencias son similares:
- si una es una subsecuencia de la otra
- costo de trandormar una en otra (distancia de edicion o “Edit Distance”, cf tarea 3)
- encontrar una tercera que se parezca a ambas
- Definicion:
- Subsecuencia
- la secuencia con cero o mas elementos dejados fuera
- Formalmente:
- Z es subsecuencia de X si existe secuencia de indices creciente de X tal que
$\Exist (i_1,\ldots,i|Z|), ∀ j∈ [1..k] z_j = xi_j$
- Subsecuencia comun
- Z es subsecuencia comun de X e Y si es subsecuencia de X y de Y.
- el problema es de encontrar la subsecuencia comun mas grande entre dos secuencias
$X$ y$Y$ (de tamaños$n$ y$m$ )- Algoritmos:Cual algoritmo pueden imaginar?
- Fuerza Bruta
- Cuantas subsecuencias tiene una secuencia de
$n$ elementos?- en el peor caso (e.g. sin repeticiones de simbolos)
- Cuantas subsecuencias tiene una secuencia de
- Dividir (por conquistar)
- Define
$X_i = (x_1,\ldots,x_i)$ - Subproblemas: encontrar la subsecuencia mas larga de subfijos
- Theorema
-
- Sea
$X_m$ e$Y_n$ secuencias,$Z_k$ una LCS de$X$ e$Y$
- Sea
- Define
- Si
$x_m = y_n$ ,-
$z_k = x_m = y_n$ y $Zk-1$ es una LCS de $Xm-1$ e $Yn-1$ - (acordense que los elementos de
$Z$ no tienen que ser consecutivos en$X$ o$Y$ )
-
- Si
$x_m ≠ y_n$ ,-
$z_k ≠ x_m$ implica que$X$ es una LCS de $Xm-1$ e $Yn$. -
$z_k ≠ y_m$ implica que$X$ es una LCS de $Xm$ e $Yn-1$.- El Teorema suggera una solucion recursiva de grado 2 (dos llamadas recursivas al maximo)
- Matriz
$C$ de$m× n$ entradas, definidas por$c[i,j] =$
-
-
$0$ si$i=0$ y$j=0$ -
$c[i-1,j-1]+1$ si$i,j>0$ y$x_i = y_j$ -
$max\{ c[i,j-1], c[i-1,j] \}$ si$i,j>0$ y$x_i ≠ y_j$ - Rendimiento
- tiempo en
$O(nm)$ - espacio en
$O(n)$
- tiempo en
- Rendimiento
- Sigamos en la proxima session con Estructuras de datos!
- Conjunto(s)
- Conjunto desordenado dinamico
- encuentra(clave)
- tamano()
- agrega(clave)
- borra(clave)
- Cola de prioridad minima (dinamica)
- encuentra(clave)
- tamano()
- agrega(clave)
- borra(clave)
- encuentraMinimo()
- borraMinimo()
- Diccionario(s)
- Diccionario statico ordenado
- Diccionario(s)
- encuentra(clave) -> dato
- tamano()
- encuentraProximo(clave)
- encuentraPrevio(clave)
- Diccionario dinamico ordenado
- encuentra(clave) -> dato
- tamano()
- agrega(clave,dato)
- borra(clave)
- encuentraProximo(clave)
- encuentraPrevio(clave)
Cuales son lo tipos de datos abstractos correspondiendo a estas estructuras de datos? (i.e. Cuales problemas pueden resolver estas soluciones?)
- Arreglo desordenado (mas una variable para el tamano)
- agregar
- tamano
- buscar (dificil)
- borrar (una vez encontrado)
- proximoMasGrande(clave) dificil
- encuentra minimo(clave) dificil
- Arreglo ordenado
- Lista Enlazada
- Arbol Binario (de Busqueda)
- Arbol General (de Busqueda)
- Listas (Encadenadas)
- Busqueda
- Insercion
- Delecion
- Pilas
- ADT o DS?
- Implementaciones
- Listas
- Arreglo
- Applicaciones
- pasaje de parametros a funciones
- Fila
- LIFO, FILO, LILO, FIFO: cuantas posibilidades?
- Fila
- Conceptos
- Niveles de Abstraccion
- Typos de Datos Abstractos (“Abstract Data Type” ADT)
- Data Structure
- Applicaciones
- Fila (File)
- ADT: FIFO = First In First Out
- DS:
- en lista
- en arreglo
- Rendimientos
- Pilas (stack)
- ADT: LIFO = Last In First Out
- DS:
- en lista
- en arreglo
- Rendimientos
- Other ADTs:
- FILO = First In Last Out?
- LILO = Last In Last Out?
- Otros?
- Listas
- Descripcion
- ADT o DS?
- Variantes
- “Double Linked List”
- Lista de Listas
- Skiplists
- Colas
- Tipo de Datos Abstractos (TDAs)
- Cola
- Cola de prioridad
- Estructuras de Datos
- Lista
- Pila
- Cola
- Cola de prioridad
- Cola de Prioridad mas en detalles
- CorrectUp
- CorrectDown
- Heapify
- Definiciones
- Arboles <<<Ordinales>>>
- Nodos Internos y Externos (Hojas)
- Altura
- Profundidad de un nodo o de una hoja
- Arboles <<<Cardinales>>> (y Binarios en particular)
- general, o
- Balanceado, o
- Completo y Quasi completo
- Applicaciones
- Expressiones de calculo
- notacion polacka invertida
- Expressiones con parenthesis
- Heaps
- Diccionarios
- Arboles De Busqueda
- Red-Black Arboles,
- (2-3)-Arboles, (k-(2k-1))-Arboles
- B-Arboles
- …
- Propriedades
- Expressiones de calculo
- Cantidad de nodos internos vs cantidad de nodos externos en un arbol binario?
- e = 1+i
- Altura de un arbol completo con
$n$ nodos, si- binario? h = log_2(n +1 ) -1 ∈ O(log_2 n)
- (k-ary)? (homework)
- quasi-completo binario?
$h = ⌈ log_2(n +1 )⌉ -1 ∈ O(log_2 n)$ - balanceado?
- Nociones Utiles
- Pre-orden
- In-Orden (binario)
- Post-Orden
- DFUDS
- TDA(s) Diccionario
- TDA Diccionario Estatico
- compile(conjunto de pares)
- find(key)
- TDA Diccionario Dinamico
- isEmpty()
- add(key,data)
- remove(key,data)
- find(key)
- TDA Diccionario (Dinamico) Ordenado
- [X] isEmpty()
- [X] add(key,data)
- [X] remove(key)
- [X] find(key)
- [X] findNext(key)
- [ ] rank(key)
- [ ] select(rank)
- Tecnicas para Diccionario
- Arreglo desordenado
- Busqueda Secuencial
- moveToFront
- Arreglo ordenado
- Busqueda Secuencial
- Busqueda Binaria
- Busqueda Doblada
- Otras Busquedas
- Arbol Binario de Busqueda
- Busqueda en arbol de busqueda
- TDA Diccionario (Dinamico) Ordenado
- [X] isEmpty()
- [ ] add(key,data)
- [ ] remove(key)
- [X] find(key)
- [X] findNext(key)
- Estructuras de Datos para Diccionario :AVL ((Georgy Adelson-Velsky and Evgenii Landis’ tree, 1962)
- [ ] isEmpty()
- [ ] add(key,data)
- [ ] remove(key)
- [ ] find(key)
- [ ] findNext(key)
- (2,3)-Arboles
- [ ] find(key)
$3h ∈ O(h)$ - [ ] findNext(key)
$O(h)$ - [ ] add(key,data)
$O(h)$ - [ ] remove(key)
$O(h)$ - Combinatoria
- (d,2d-1)-Arboles
- [ ] find(key)
- [ ] add(key,data)
- [ ] remove(key)
- [ ] findNext(key)
- Finger Search Trees
- [ ] find(key)
- [ ] add(key,data)
- [ ] remove(key)
- [ ] findNext(key)
- [X] “Move To Front” en Arreglos Ordenados
- Definicion de distribucion
- Promedio sobre input
- vantajas sobre analisis en el peor caso
- [ ] Arboles de Busqueda Binarios Optimos (ABB optimos)
- Definicion
- Computacion (Programacion Dinamica!)
- Analisis:
$O(n^3)$ ,$O(n^2)$ - [ ] Splay Trees (AVLs que cambian tambien cuando se busca)
- Motivacion
- Definicion
- Analisis: logros y problemas abiertos
- Algoritmos y Estructuras de Datos aleatorizados
- Algoritmos y Estructuras de Datos deterministicos
- Instrucciones aleatorizadas
- Analisis: Peor caso vs Promedio
- [ ] sobre instancias
- [X] sobre aleatorizacion
- SkipLists: diseño
- [X] Listas enlazadas
- [X] Resumen exacto de Listas enlazadas
- [X] Resumen aproximado de listas enlazadas
- Skiplists: analisis
- tiempo de busqueda
- tiempo de inserción
- tiempo de deleción
- Valores y Comparaciones
- Algoritmos en el modelo de comparaciones (e.g. busqueda binaria)
- Algoritmos afuera del modelo de comparaciones (e.g. busqueda por interpolacion)
- Frecuencia de colisiones: Paradojo de los cumpleanos
- Tablas de Hash
- [ ] Encadenamiento
- Listas enlazadas en cada cedula
- Hashing con listas mezcladas
- [ ] Direccionamiento abierto (“Open directing” but “closed table”)
- Linear Probing
- Quadratic Probing
- Hashing con doble funcion de hash
- Detalles tecnicos
- Borrar
- Funciones de Hash
- Suma de caracteres
- funcion de hash aleatorizada ha,b(k)= ak + b mod p mod N
- Analisis amortizada
- Busqueda Desordenada
- Busqueda Ordenada
- Ordenamiento
- Heap Sort
- Review Priority Queues and Dictionaries
- Using Priority Queues for Sorting (Heapify)
- Using Dictionaries for Sorting
- Quick Sort
- Partitioning an array by a pivot
- linear time median
- Divide and Conquer Sorting no 2
- Detecting very frequent elements
- Quick Select
- Definitions
- Rank
- Select
- Select Algorithms
$O(nlg n)$ $O(n)$
- Lazy Data Structures for Rank and Select Queries (Online)
- Counting Sort
- Value Based Sorting algorithms: (relatively) small domain
- Complexity in funciton of
$n$ and$σ$ - Hash Sort?
- large domain but Small effective domain
- Radix Sort
- Grafos
- ADT
- DS
- Matrix
- Listas
- Otras
- Applicaciones
- https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
- https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
- Pattern Matching: Definition and Brute Force Algorithm
- Definition
- Brute Force
- Improvements
- Indexing the Pattern (explored in this lecture)
- Indexing the text (current research)
- Indexing both
- Knuth-Morris-Pratt (KMP) Algorithm
- Knuth:
- Father of Theoretical Computer Science
- Original Programmer of TeX
- Author of “The Art of Computer Programming”, a reference in the field
- Ideas:
- Failure function
- Complexity:
- O(n+m) in worst and best case.
- Boyer-Moore-Horspool (BMH) Algorithm
- O(n+m) in worst and best case.
- Ideas:
- Right to Left
- Simplified Failure function
- Complexity
- O(nm) in worst case
- O(n/m) in best case and “on average”
- Beyond the course
- Combination of KMP with BMH: BMS
- O(n+m) in worst case
- O(n/m) in best case and “on average”
- Ω(n/m) lower bound anyway
- Automata (Extra)
- Completely indexing the pattern
- O(n+m^2) worst case
- Pattern Matching with Partial MisMatch