1 / 18

Búsqueda

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

Download Presentation

Búsqueda

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Búsqueda

  2. 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

  3. 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; }

  4. 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; }

  5. 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:

  6. #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; }

  7. 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; }

  8. 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

  9. #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); }

  10. 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; }

  11. 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

  12. 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)

  13. 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

  14. 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…

  15. 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

  16. 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

  17. Hashing cerrado 5 7 3 1 2 4 6 8 9 0 Resolución de colisión

  18. Hashing abierto 0 Lista ligada en cada índice para solucionar colisiones 1 2 73257663 3 4 43232195 43216785 5 6 7 8 71237689 9

More Related