Busqueda Binaria Recursiva

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 3

“INSTITUTO TECNOLOGICO DE IZTAPALAPA”

INGENIERIA EN SISTEMAS COMPUTACIONALES

MATERIA:
ESTRUCTURA DE DATOS

NOMBRE(S) DEL ALUMNO:


HERNANDEZ HUERTA FABIAN OMAR

DOCENTE: JUAN CARLOS VELIZ MARTINEZ

TITULO:
BUSQUEDA BINARIA RECURSIVA

PERIODO: AGOSTO – DICIEMBRE 2022.


BUSQUEDA BINARIA RECURSIVA
Prerrequisitos (?)

→ Vectores
→ Saber qué es y cómo se lleva a cabo la búsqueda binaria Código:
1. int busqueda_binaria(vector <int> list, int val){
2. int der = list.size() - 1, izq = 0, m;
3. while(izq <= der){
4. m = (izq + der) / 2;
5. if(m == list[val]) return m; //la posicion del valor
6. if(m > list[val]) der = m – 1;
7. else izq = m + 1;
8. }
9. return -1; // no se encontro el dato :P
10. }

Teniendo en cuenta que ya sabemos la lógica que sigue este algoritmo y su


implementación arriba expuesta, vamos a pensar en hacerlo de forma
recursiva, es decir, que la misma función vaya reduciendo el tamaño (N) del
problema a un caso base, de tal manera, al conocer la solución del caso
base, va a poder dar solución a cualquier problema de tamaño N.

Entonces el código sería el siguiente:

(utilizo int casting para no usar la librería math.h) Código:


11. int BinarySearch(int x, int v[], int tam) {
12.
13. int RecursiveBinarySearch(int x, int v[], int i, int m, int d) {
14. if (i>d) return -1;
15. else if ( x == v[m] ) return m;
16. else if ( x < v[m] ) return RecursiveBinarySearch(x, v, i, (int)((i+m-1)/2), (m-
1));
17. else return RecursiveBinarySearch(x, v, (m+1), (int)((d+m+1)/2), d);
18. }
19.
20. int i = 0;
21. int m = tam/2;
22. int d = tam;
23.
24. return RecursiveBinarySearch(x, v, i, m, d);
25.
26. }
Explicación general:

La premisa que tenemos es que nosotros tenemos que buscar un elemento


x en un vector v de tamaño N que está previamente ordenado. Teniendo
eso en cuenta podemos afirmar que cualquier subvector w de v de tamaño
[0..N] también está ordenado.

Pues teniendo eso en cuenta vamos reduciendo el tamaño del problema (N)
a la mitad en cada llamada recursiva. ¿Por qué? Porque si x no es el
elemento medio del vector v de tamaño N, entonces verificamos si es
menor o mayor que él. Si es menor, buscamos en el subvector de tamaño
N/2 izquierdo, sino en el derecho.

En este caso, el algoritmo se pasa de forma cíclica a forma recursiva casi


sin pensar. ¿Por qué? Estamos ante una Tail Recursive Function (la
autollamada es lo último que se hace) y podemos pensar en definitiva que
estamos ejecutando un ciclo simplemente.

Podría aquí estar escribiendo horas y horas sobre algoritmos de búsqueda y


ordenación pero no es plan xD

Decir simplemente que hay tener en cuenta que el vector en el que


vayamos a buscar un elemento, debe estar previamente ordenado.

En este momento os preguntaréis: ¿Qué me conviene más, buscar


directamente en un vector con la búsqueda lineal o es mejor ordenarlo
previamente (quicksort) y luego aplicar búsqueda binaria? Bueno eso ya son
temas de complejidad algorítmica y haciendo un pequeño estudio se puede
sacar conclusiones.

Decir también que hay estructuras de datos eficientes para la búsqueda


como lo son por ejemplo las Tablas Hash o los Árboles Binarios de
Búsqueda, ABB (variante AVL), por ejemplo.

FUENTE:
https://foro.elhacker.net/programacion_cc/c_busqueda_binaria_recursiva-
t374647.0.html

También podría gustarte