Estructuras de Datos y Algoritmos (EDA)

Un curso sobre Tipos Abstractos de Datos

Archive for the ‘Material’ Category

Árboles de juego

without comments

Written by Javier Campos

diciembre 12th, 2013 at 11:28 am

Mejora del quicksort para conseguir coste O(n log n) en el caso peor

without comments

El quicksort, tal y como aparece en los libros, tiene un coste asintótico cuadrático en el caso peor.

No obstante, existe una modificación no trivial del quicksort que sí consigue un coste asintótico O(n logn). Consiste en elegir la mediana como el pivote que se utiliza para la partición del vector en dos trozos, en cada llamada recursiva del quicksort.

El cálculo de la mediana de los n datos de un vector es un caso particular del conocido como problema de selección, consistente en calcular el estadístico de orden k de esos datos (es decir, el dato que ocuparía la posición k en el supuesto en que se ordenasen los datos de menor a mayor). Si n es impar, la mediana sería el estadístico de orden (n+1)/2; si por el contrario n es par, hay dos medianas que son los estadísticos de orden n/2 y n/2 + 1.

Como decía, se conoce un algoritmo de coste asintótico lineal en el caso peor para el problema de selección y, por tanto, para el cálculo de la mediana. Os lo incluyo aquí debajo, extraído del libro Introducion to Algorithms, de Cormen, Leiserson, Rivest y Stein.

selection_is_linear

Written by Javier Campos

noviembre 19th, 2013 at 11:11 am

Uso de colas con prioridad en el algoritmo de Dijkstra

without comments

Las colas con prioridad (y por tanto la estructura de datos montículo con la que se representan en memoria) se utilizan a menudo para mejorar la eficiencia de algoritmos en los que iterativamente se precisa conocer el mínimo (o máximo) de un conjunto de valores y eliminarlo del conjunto. Ejemplo:

monticulos_y_dijkstra

Si utilizamos una cola con prioridades (montículo), añadiéndole una operación de reducción de clave, el algoritmo anterior queda de la siguiente forma:

Dijkstra usando cola con prioridades

(Detalles: en la asignatura Algoritmia Básica, de la Especialidad en Computación)

———

Por supuesto, la utilidad del algoritmo anterior se obtiene si n es grande.

n 10 100 1000 10000 100000 1000000
n log n 30 600 10000 130000 1600000 19000000
n2 100 10000 1000000 100000000 10000000000 1000000000000

Written by Javier Campos

noviembre 19th, 2013 at 11:06 am

Más ejercicios de los Temas I y II

without comments

Se ha publicado en la página de material adicional un documento con más ejercicios de los Temas I y II (especificación e implementación de TAD’s lineales).

Written by Javier Campos

noviembre 7th, 2013 at 4:02 pm

Árboles rojinegros

without comments

Una alternativa a los árboles AVL son los árboles rojinegros.

Aquí tenéis unas transparencias bastante autocontenidas:

Rojinegros

Un applet para probarlos: aquí (seleccionar “R-B” en el panel de la derecha).

Y el capítulo de un libro con una implementación “top-down”: con código Java y con código C++ (acceso restringido, acceder con usuario y clave habituales).

Written by Javier Campos

noviembre 5th, 2013 at 1:59 pm

Posted in Material

Lectura avanzada: transformación de algoritmos recursivos en iterativos

without comments

Si bien la lección no está incluida en el programa de la asignatura, dado que en la clase de hoy (grupo de mañanas) ha surgido el tema al comparar la versión recursiva del recorrido en pre-orden de un árbol binario con la versión iterativa que utiliza una pila auxiliar, se incluye aquí un texto que trata la transformación de algoritmos recursivos en iterativos.
[issuu width=420 height=297 embedBackground=%23000000 backgroundColor=%23222222 documentId=121105155255-44efe93b155e49a6a28f9f29874148d6 name=recursivo_a_iterativo username=javier.campos tag=algoritmos unit=px v=2]
Pdf descargable aquí (autor: Javier Campos).

Written by Javier Campos

octubre 29th, 2013 at 12:27 pm

Posted in Material

Vídeo y explicaciones adicionales sobre punteros

without comments

binky

Haz clic en el cuadro negro de arriba para que empiece…

Directamente desde la Universidad de Stanford. Recomendable además leer el documento sobre “punteros y memoria” de la misma Universidad.

Written by Javier Campos

octubre 14th, 2013 at 10:40 am

Posted in Material

Errata corregida en el material (grupo de mañanas)

without comments

En clase lo dije bien pero en la transparencia y en el fichero de pseudocódigo correspondiente estaba mal…

Código correcto de la función “posterior” (de comparación de fechas):

función posterior(f1,f2:fecha) devuelve booleano
principio
  devuelve not( iguales(f1,f2)  or  anterior(f1,f2) )
fin

Ya está corregido en las transparencias (transp. nº 12) y en el fichero de pseudocódigo (pág. 2).

Written by Javier Campos

septiembre 23rd, 2013 at 12:14 pm

Posted in Anuncios,Material

Una aplicación de las colas con prioridad

without comments

Las colas con prioridad (y por tanto la estructura de datos montículo con la que se representan en memoria) se utilizan a menudo para mejorar la eficiencia de algoritmos en los que iterativamente se precisa conocer el mínimo (o máximo) de un conjunto de valores y eliminarlo del conjunto. Ejemplo:

monticulos_y_dijkstra

Si utilizamos una cola con prioridades (montículo), añadiéndole una operación de reducción de clave, el algoritmo anterior queda de la siguiente forma:

Dijkstra usando cola con prioridades

(Detalles: en la asignatura Algoritmia Básica, de la Especialidad en Computación)

———

Por supuesto, la utilidad del algoritmo anterior se obtiene si n es grande.

n 10 100 1000 10000 100000 1000000
n log n 30 600 10000 130000 1600000 19000000
n2 100 10000 1000000 100000000 10000000000 1000000000000

Written by Javier Campos

noviembre 29th, 2012 at 1:14 pm

Posted in Material

Más enunciados de ejercicios (Temas I y II)

without comments

Se han publicado en la página de material adicional más enunciados de ejercicios de los Temas I y II (especificación e implementación de TADs lineales).

Se recuerda que (como dice la Guía Docente de la asignatura):

La dedicación del estudiante para alcanzar los resultados de aprendizaje en esta asignatura se estima en 157 horas distribuidas del siguiente modo:

  • 49 horas, aproximadamente, de actividades presenciales (clases teóricas, de problemas y prácticas en laboratorio)
  • 41 horas de trabajo de programación en equipos de 2 personas para desarrollar los programas propuestos en las prácticas de laboratorio
  • 61 horas de estudio personal efectivo (estudio de apuntes y textos, resolución de problemas, preparación clases y prácticas, desarrollo de programas)
  • 6 horas de examen final de teoría escrito y de prácticas en laboratorio

Written by Javier Campos

noviembre 13th, 2012 at 12:26 pm

Posted in Anuncios,Material