Búsqueda binaria
- Algoritmo de búsqueda binaria
- Ejemplo de búsqueda binaria
- Implementación del algoritmo de búsqueda binaria
- Complejidad del algoritmo de búsqueda binaria
La búsqueda binaria es el algoritmo de búsqueda más popular y eficiente. De hecho, es el algoritmo de búsqueda más rápido. Al igual que la ordenación por salto, también necesita que se ordene el array. Se basa en el enfoque de dividir y conquistar en el que dividimos el array en dos mitades y luego comparamos el elemento que estamos buscando con el elemento del medio. Si el elemento del medio coincide, devolvemos el índice del elemento del medio; de lo contrario, nos movemos a la mitad izquierda y derecha según el valor del artículo.
Algoritmo de búsqueda binaria
Supongamos que tenemos un array sin clasificar A[]
que contiene n
elementos, y queremos encontrar un elemento X
.
-
Establece
lo
como0
yhi
comon - 1
. -
Mientras que
lo
<hi
:- Ajuste
mid
=lo + (hi - lo)/2
. - si
A[mid]
==X
devuelvemid
. - si
A[mid]
<X
entonceslo
=mid+1
. - en caso contrario, si
A[mid]
>X
entonceshi
=mid-1
.
- Ajuste
-
El elemento no se encuentra, así que devuelve
-1
.
Ejemplo de búsqueda binaria
Supongamos que tenemos el array: (1, 2, 3, 4, 5, 6, 7, 8, 9)
, y queremos encontrar X - 8
.
-
Establece
lo
como0
yhi
como8
. -
Calcula
mid
como4
. DesdeA[mid]
<X
, establezcalo
=4 + 1
=5
. -
Calcula
mid
como6
. DesdeA[mid]
<X
, establezcalo
=6 + 1
=7
. -
Calcula la mitad como
7
. Dado queA[mid]
==8
, devuelve 7.
Implementación del algoritmo de búsqueda binaria
#include <bits/stdc++.h>
using namespace std;
int binarySearch(int arr[], int lo, int hi, int x) {
while (lo <= hi) {
int m = lo + (hi - lo) / 2;
if (arr[m] == x) return m;
if (arr[m] < x)
lo = m + 1;
else
hi = m - 1;
}
return -1;
}
int main(void) {
int n = 9;
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int x = 8;
int result = binarySearch(arr, 0, n - 1, x);
if (result == -1) {
cout << "Element not found !!";
} else
cout << "Element found at index " << result;
return 0;
}
Complejidad del algoritmo de búsqueda binaria
Complejidad del tiempo
- Caso promedio
Cuando realizamos la búsqueda binaria, buscamos en una mitad y descartamos la otra mitad, reduciendo el tamaño del array a la mitad cada vez.
La expresión para la complejidad del tiempo viene dada por la recurrencia.
T(n) = T(n/2) + k , k is a constant.
Este resultado de esta recurrencia da logn
, y la complejidad temporal es del orden de O(logn)
. Es más rápido que la búsqueda lineal y la búsqueda por salto.
- Mejor caso
El mejor de los casos ocurre cuando el elemento del medio es el elemento que estamos buscando y se devuelve en la primera iteración. La complejidad del tiempo en el mejor de los casos es O(1)
.
- Peor caso
La complejidad del tiempo del caso más desfavorable es la misma que la complejidad del tiempo del caso medio. La complejidad de tiempo en el peor de los casos es O(logn)
.
Complejidad espacial
La complejidad espacial de este algoritmo es O(1)
en el caso de implementación iterativa porque no requiere ninguna estructura de datos más que variables temporales.
En el caso de la implementación recursiva, la complejidad del espacio es O(logn)
debido al espacio requerido por la pila de llamadas recursivas.
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn