PRÁCTICA Nš 1: 1 sesión
(del 5 de Marzo al 9 de Marzo de 2000)
Análisis de costes algorítmicos
0. Objetivo
En esta práctica intentaremos obtener el coste temporal de diferentes algoritmos de búsqueda vistos en clase.
Para ello realizaremos un programa que implementará en C++ los diferentes algoritmos como subprogramas que se aplicaran a diferentes vectores, devolviendo en cada caso el número de asignaciones y comparaciones realizados por el subprograma.
1. Introducción
Una tarea habitual en informática es la búsqueda de un valor en un conjunto de valores y para ello se han desarrollado diferentes algoritmos.
El algoritmo más normal para buscar en un conjunto de valores es la búsqueda secuencial.
Si suponemos que buscamos 'x' (entero) en un conjunto de valores (enteros) guardados en un vector 'v' de 'n' elementos tendríamos la siguiente función de búsqueda:
Algoritmo Buscar_1
Entradas
v: vector, n:entero, x:entero
Salidas
enc: booleano
Variables auxiliares
i: entero
Inicio
enc <- falso
i <- 0
Mientras ( x < n ) Hacer
Si v[i] = x Entonces
enc <- verdadero
Fin_si
i <- i + 1
Fin_mientras
Devolver (enc)
Fin
Ya se comentó en teoría que la función se podía modificar cortando la búsqueda en cuanto se encuentre el elemento
Algoritmo Buscar_2
Entradas
v: vector, n:entero, x:entero
Salidas
enc: booleano
Variables auxiliares
i: entero
Inicio
i <- 0
Mientras ( x < n ) && ( v[i] != x ) Hacer
i <- i + 1
Fin_mientras
Si (x == n) Entonces
enc <- falso
Sino
enc <- verdadero
Fin_si
Devolver (enc)
Fin
Y, finalmente, que la función mejoraba si añadíamos la presencia de un centinela
Algoritmo Buscar_3
Entradas
v: vector, n:entero, x:entero
Salidas
enc: booleano
Variables auxiliares
i: entero
Inicio
v[n] <- x
i <- 0
Mientras (v[i] != x) Hacer
i <- i + 1
Fin_mientras
Si (x == n) Entonces
enc <- falso
Sino
enc <- verdadero
Fin_si
Devolver (enc)
Fin
En el caso en que tengamos el vector ordenado podemos aprovechar este hecho para determinar si tenemos que seguir buscando o no.
Algoritmo Buscar_4
Entradas
v: vector, n:entero, x:entero
Salidas
enc: booleano
Variables auxiliares
i: entero
Inicio
v[n] <- x
i <- 0
Mientras (v[i] < x) Hacer
i <- i + 1
Fin_mientras
Si (v[i] == x) && (i != n) Entonces
enc <- verdadero
Sino
enc <- falso
Fin_si
Devolver (enc)
Fin
Además también podemos aplicar una nueva técnica de búsqueda: La búsqueda dicotómica.
Algoritmo Buscar_1
Entradas
v: vector, n:entero, x:entero
Salidas
enc: booleano
Variables auxiliares
i: entero; bajo, alto, medio: entero
Inicio
bajo <- 0
alto <- n-1
medio <- (bajo + alto) / 2
Mientras (v[medio] != x) && (bajo < alto) Hacer
Si (x < v[medio]) Entonces
alto <- medio - 1
Sino
bajo <- medio + 1
Fin_si
medio <- (bajo + alto) / 2
Fin_mientras
Si (v[medio] == x) Entonces
enc <- TRUE
Sino
enc <- FALSE
Fin_si
Devolver (enc)
Fin
2. Realización de la práctica
En la practica implementaremos las diferentes funciones de búsqueda añadiendo en la realización de las mismas, dos contadores para determinar el número de asignaciones y el número de comparaciones que se realizan en la llamada a la función.
Por ejemplo, la primera función de búsqueda quedaría como sigue:
Algoritmo Buscar_1
Entradas
v: vector, n:entero, x:entero
por referencia n_a, n_c: entero
Salidas
enc: booleano
Variables auxiliares
i: entero
Inicio
n_c <- 0
n_a <- 2
enc <- falso
i <- 0
Mientras ( x < n ) Hacer
n_c <- n_c + 2
Si v[i] = x Entonces
n_a <- n_a + 1
enc <- verdadero
Fin_si
n_a <- n_a + 1
i <- i + 1
Fin_mientras
n_c <- n_c + 1
Devolver (enc)
Fin_funcion
El programa principal presentara las siguientes posibilidades:
a. Introducir un valor de 'n' (numero de elementos donde buscar en el vector) siempre menor que TAM-1
b. Generar un vector aleatorio con valores entre '0' y 'n'
c. Generar un vector ordenado (por ejemplo con los valores 0, 1, 2, ..., n-1)
d. Buscar en el vector con la funcion 1, el primer elemento del vector
e. Buscar en el vector con la funcion 2, el primer elemento del vector
f. Buscar en el vector con la funcion 3, el primer elemento del vector
g. Buscar en el vector, si esta ordenado, con la funcion 4, el primer elemento del vector
h. Buscar en el vector, si esta ordenado, con la funcion 5, el elemento que esta en el punto medio del vector
i. Buscar en el vector con la funcion 1, un elemento x con valor n+1
j. Buscar en el vector con la funcion 2, un elemento x con valor n+1
k. Buscar en el vector con la funcion 3, un elemento x con valor n+1
l. Buscar en el vector, si esta ordenado, con la funcion 4, un elemento x con valor n+1
m. Buscar en el vector, si esta ordenado, con la funcion 5, un elemento x con valor n+1
n. Buscar en el vector con la funcion 1, un elemento x aleatorio que se encuentre en el vector
o. Buscar en el vector con la funcion 2, un elemento x aleatorio que se encuentre en el vector
p. Buscar en el vector con la funcion 3, un elemento x aleatorio que se encuentre en el vector
q. Buscar en el vector, si esta ordenado, con la funcion 4, un elemento x aleatorio que se encuentre en el vector
r. Buscar en el vector, si esta ordenado, con la funcion 5, un elemento x aleatorio que se encuentre en el vector
Una vez realizado el programa habría que rellenar la tabla adjunta:
Vector aleatorio |
Vector ordenado |
|||||||||||
mejor |
medio |
peor |
mejor |
medio |
peor |
|||||||
n_a |
n_c |
n_a |
n_c |
n_a |
n_c |
n_a |
n_c |
n_a |
n_c |
n_a |
n_c |
|
Buscar_1 |
||||||||||||
Buscar_2 |
||||||||||||
Buscar_3 |
||||||||||||
Buscar_4 |
||||||||||||
Buscar_5 |
Para los siguientes valores de n: 100, 300, 600, 1000, 2000, 3000 (definir la constante TAM como 3001).
Para el cálculo del valor medio repetir las pruebas 10 veces y calcular la media de los valores obtenidos.
3. Requisitos
Recordar que para poder acceder a la sesión de prácticas correspondiente es necesario entregar un pequeño esquema de lo que se va a realizar en la práctica. Si no se presenta el resumen ANTES de acceder al laboratorio, no se permitirá la entrada a la sesión de prácticas.
4. Entrega de prÁcticas
Por e-mail a la dirección del profesor encargado del grupo o en disquette al iniciar la siguiente sesión de prácticas, pero siempre ANTES de empezar la siguiente sesión de prácticas.
Cualquier práctica entregada fuera de plazo no será admitida para su corrección.