180 likes | 407 Views
Búsqueda. Búsqueda Secuencial. Es el método de búsqueda más sencillo En un arreglo o lista ligada consiste en ir visitando cada uno de sus elementos y preguntar si es igual al elemento buscado
E N D
Búsqueda Secuencial • Es el método de búsqueda más sencillo • En un arreglo o lista ligada consiste en ir visitando cada uno de sus elementos y preguntar si es igual al elemento buscado • Su orden de magnitud es en el peor de los casos O(n) siendo n el número de elementos del vector o de la lista. • El peor caso se da cuando el elemento buscado no es encontrado
Búsqueda Secuencial #include <iostream.h> #define tam 6 int b_s(int *v, int n, int dato) { int k=0; while(k<n && v[k]!= dato) k++; return k; }
Búsqueda Secuencial void main(void) { int vec[tam]={1,3,6,2,5,9}; int indice = b_s(vec, tam, 55); if(indice == tam) cout << "El elemento no estaba"; else cout << "Está en la pos: " << indice << endl; }
Búsqueda en un vector Ordenado Primera forma: • Se va comparando el elemento buscado contra cada uno de los elementos del vector hasta hallarlo o encontrarse con uno mayor (o sea que no estaba) • El algoritmo es el siguiente:
#include <iostream.h> #define tam 6 int b_s_o(int *v, int n, int dato) { if(v[0] > dato) return 0; int k=1; while(v[k]<= dato && k<n) k++; return k-1; }
void main(void) { int vec[tam]={1,3,6,9,15,29}; int buscado=30; int indice = b_s_o(vec, tam, buscado); if(vec[indice]!= buscado) cout << "El elem. no estaba" << endl; else cout << "Posición: " << indice << endl; }
Segunda forma: Para acelerar el proceso de búsqueda se compara el elemento buscado X con el elemento ubicado en la mitad del arreglo V: • Si V(m)=X: la búsqueda ha terminado • Si V(m)<X: como todos los elementos a la izquierda de m son menores que X, se buscará ahora sólo en la zona derecha (desde m+1 hasta N). El proceso se repite • V(m)>X: como todos los elementos a la derecha de m son mayores que X, se buscará ahora sólo en la zona izquierda (desde 1 hasta m-1). El proceso se repite
#include <iostream.h> int binrec(int *v, int i, int j, int x) { int k; if(i==j) return i; k=(i+j+1)/2; if(v[k]==x) return k; if(x < v[k]) return binrec(v, i, k-1, x); else return binrec(v, k, j, x); } int busquedabin(int *v, int n, int x) { if((n==0)||(x < v[0])) return 0; return binrec(v, 0, n-1, x); }
void main(void) { int vec[10]={2,5,6,8,9,10,11,17,27,29}; int buscado=6; int indice = busquedabin(vec,10,buscado); if(vec[indice]==buscado) cout<<"Posición:" << indice <<endl; else cout <<"No estaba"<<endl; }
Hashing • La idea del hashing es ejecutar alguna operación sobre el campo clave (el campo que permite identificar de manera única los diferentes elementos) y obtener un valor que es el índice del elemento en el vector (tabla) al que pertenece la clave • La operación se denomina función hash o función de dispersión
Es posible que para dos claves diferentes se obtenga el mismo valor (índice) mediante la función hash, en este caso se presenta una colisión • Las colisiones deben resolverse ya sea de manera abierta o cerrada (ver más adelante)
Los aspectos que hay que tener en cuenta en el hashing son: • Elegir la función hash • Resolver las colisiones • Decidir el tamaño de la tabla
Función hash ejemplo: • Método Clásico: h = clave mod T T es el tamaño de la tabla (vector) • Método del Cociente Cuadrático para resolución de colisiones (hashing cerrado): h = (residuo + cociente*i2 + 1 ) mod T residuo y cociente son el resultado de aplicar la función hash clásica e i es el número de veces que se ha aplicado la fórmula de resolución. Esta fórmula se aplica hasta encontrar una celda vacía…
Hashing Cerrado: Cuando se presenta una colisión se busca en la tabla (vector) otra posición vacía para ubicar la clave • Hashing Abierto: Todas las claves que comparten un mismo valor (índice) al aplicarles la función hashing forman una lista ligada
Suponga que se va a manejar un grupo de máximo 10 estudiantes, la clave es la cédula, supóngase estos 4 estudiantes: índice Ced: 71237689 mod 10 = 9 Ced: 43216785 mod 10 = 5 Ced: 73257663 mod 10 = 3 Ced: 43232195 mod 10 = 5 h = (5 + 4323219*12 + 1 ) mod 10 = 5 h = (5 + 4323219*22 + 1 ) mod 10 = 2 Colisión Continúa la colisión Se soluciona la colisión i
Hashing cerrado 5 7 3 1 2 4 6 8 9 0 Resolución de colisión
Hashing abierto 0 Lista ligada en cada índice para solucionar colisiones 1 2 73257663 3 4 43232195 43216785 5 6 7 8 71237689 9