Hashing y Recursión dentro de Algoritmos Pedro Luis Godoy Arellano Análisis de Algoritmos 17-06-18
Preguntas y desarrollo:
1. Suponga que tiene un conjunto de animales, donde estos se distribuyen uniformemente entre animales acuáticos, animales terrestres y animales aéreos (con la misma cantidad de animales de cada tipo): a) b) c) d)
¿Cómo se clasificarían dentro de un hash? ¿Usaría un hash simple o uno encadenado? ¿Cómo sería su función de hash? ¿Cuánto demoraría una búsqueda en su estructura?
Respuestas:
a) Para esté caso, la clasificación mediante “hash” se sugiere que el array que se usará sea uno de punteros hacia las listas enlazadas. Posición 1 2 3
Nombre Terrestres Acuáticos Aéreos
Gato Búfalo Cacatúa
Perro Orca Tucán
b) En este caso se aprecia que hay una colisión, entonces se usará el “hash encadenado” porque este consta de una solución a las colisiones que pueden existir en las tablas de hash, estas “colisiones” se generan cuando una función de hash retorna el valor para dos datos distintos, para ordenarlos se debe ingresar el nuevo elemento después del ya existente en la posición del hash.
c) El Hashing se compone de una función de hash, que que es h(x), esta puede ser definida de forma parcial, con la condición de debe utilizarse para la construcción de todo el hash, ahora con el caso de los animales para ordenarlos tomare en cuenta la segunda letra de cada nombre para luego ubicarlos en orden alfabético. Posición
Nombre
0 1
Gato
Cacatúa
2 3 4 5
Perro
6 7 8
Orca
9
Tucán
Búfalo
d) Tomando en cuenta el ejemplo anterior, se puede puede observar que el tiempo que tardaría en encontrar el elemento “Búfalo” es de O(1), pues h(tiburón) = 9, el tiempo de encontrar al búfalo en la lista es de 2 (Tucán y Búfalo) en la lista este corresponde a la posición 9 es 2, que es menor que el conjunto de todos los nombres: 9(Gato, Cacatúa, Perro, Orca, tucán y búfalo). Entonces, se puede decir que el tiempo que tardará la búsqueda de un elemento en un hash encadenado es de: O(1) + O(k) con k < n
2. Escriba en pseudocódigo el algoritmo de búsqueda binaria de forma recursiva
int BinarySearch(int x, int v[], int tam) {
int RecursiveBinarySearch(int x, int v[], int i, int m, int d) { if (i>d) return -1; else if ( x == v[m] ) return m; else if ( x < v[m] ) return RecursiveBinarySearch(x, v, i, (int)((i+m-1)/2), (m-1)); else return RecursiveBinarySearch(x, v, (m+1), (int)((d+m+1)/2), d); } int i = 0; int m = tam/2; int d = tam;
return RecursiveBinarySearch(x, v, i, m, d);
Bibliografía:
-
Contenidos de la semana 8, análisis de algoritmos.