Está en la página 1de 2

Tarea # 2

Análisis y Diseño de Algoritmos / Ingenierı́a Civil Informática


Departamento Ciencias de la Computación y
Tecnologı́as de la Información

Universidad del Bı́o-Bı́o

Profs: Gilberto Gutiérrez

Primavera 2023

Búsqueda del k-ésimo de un conjunto. Asuma un conjunto de números enteros (no hay repetidos), el k-
ésimo menor elemento del conjunto corresponde al elemento que ocupa la posición k al ordenar el conjunto en
forma ascendente (de menor a mayor). Una forma obvia de solucionar este problema es ordenar los elementos del
conjunto y retornar el elemento que est´a en la posición k. Llamamos A1 a este algoritmo. Sin embargo, esta
solución es de complejidad temporal (peor caso) O(n log2 n) y que corresponde al costo de ordenar los elementos.
Existe otro algoritmo (dividir para reinar), que llamamos A2, para encontrar el k-ésimo menor que no necesita
ordenar el arreglo. El algoritmo es el siguiente:

int k-esimo(S, k) {
if(k > |S|) return Error
else {
separar S en tres conjuntos:
S1 con los elementos de S < S[k]
S2 con los elementos de S = S[k]
S3 con los elementos de S > S[k]
if(|S1| > k) return k-esimo(S1,k)
if(|S1 U S2| >= k) return S[k]
else return k-esimo(S3,k-|S1 U S2|)
}
}

Notar que el algoritmo A2 particiona el conjunto de manera muy parecida a como lo hace el algorirmo QuickSort.
Anticipamos que A2 es de complejidad temporal O(n2 ), pero en la práctica (caso promedio) es muy eficiente.
A2 tiene un comportamiento muy similar a QuickSort, es decir, a pesar de tener un muy mal peor caso, el caso
promedio es mucho mejor. En la literatura existe otro algoritmo, y que llamamos A3, que permite resolver el
problema en tiempo lineal, es decir O(n). Los detalles del algoritmo A3 los puede ver en las siguientes referencias:

1. Aho, Alfred et al. Estructuras de Datos y Algoritmos (Capı́tulo 8).


2. Cormen, Thomas et al. Introduction to Algorithms (Capı́tulo 9).

1
3. 3. Brassard, G. et al. Fundamentos de ALgoritmia (Capı́tulo 7).

En esta tarea se pide:

1. Implementar en su lenguaje favorito los algoritmos A2 y A3.


2. Comparar de manera empı́rica (mediante experimentos) el rendimiento de los algoritmos A2 y A3. Se sugiere
considerar conjuntos (generados al azar) de distintos tamaños entre 100.000 y 2 millones de elementos y
medir el tiempo de ejecución de cada algoritmo para diferentes valores de k en cada uno de estos conjuntos.
En este punto se pide obtener al menos 2 conclusiones respecto del comportamiento de los algoritmos.
3. Obtener la complejidad(peor caso) del algoritmo A3 y demostrar que es lineal

1 Condiciones
1. Máximo tres personas por grupo
2. Fecha de entrega: 31 de octubre de 2023 hasta 23:59
3. Forma de entrega: Subir a la plataforma (adecca) del curso:
4. Informe (con al menos las siguientes secciones)
(a) Introdución (de que trata la tarea )
(b) Descripción del problema
(c) Una sección con la solución (algoritmos y sus complejidades)
(d) Sección con resultados de experimentación de los algoritmos A2 y A3
(e) Sección de Conclusiones.
5. Programas fuentes y un archivo con las instrucciones para compilarlos y ejecutarlos

También podría gustarte