Búsqueda de Fibonacci
- Algoritmo de búsqueda de Fibonacci
- Ejemplo de búsqueda de Fibonacci
- Implementación del algoritmo de búsqueda de Fibonacci
- Complejidad del algoritmo de búsqueda de Fibonacci
La búsqueda de Fibonacci es un algoritmo de búsqueda de intervalo eficiente. Es similar a búsqueda binaria en el sentido de que también se basa en la estrategia de divide y vencerás y también necesita el array para ser ordenado. Además, la complejidad del tiempo para ambos algoritmos es logarítmica. Se llama búsqueda de Fibonacci porque utiliza la serie de Fibonacci (el número actual es la suma de dos predecesores F[i] = F[i-1] + F[i-2]
, F[0]
= 0
y F[1]
= 1
son los dos primeros números Series) y dividel array en dos partes con el tamaño dado por los números de Fibonacci. Es un método fácil de calcular que usa solo operaciones de suma y resta en comparación con la división, multiplicación y cambios de bits requeridos por la búsqueda binaria.
Algoritmo de búsqueda de Fibonacci
Supongamos que tenemos un array sin clasificar A[]
que contiene n
elementos, y queremos encontrar un elemento - X
.
-
Encuentra el número de Fibonacci más pequeño justo mayor o igual que el tamaño del array
n
. Sea este número mth el número de Fibonaccifib(m)
y su predecesorfib(m-1)
yfib(m-2)
. -
Inicializa el desplazamiento como
-1
. -
Mientras que
fib(m-2)
es mayor que0
, haz lo siguiente:- Comparar
X
con el último elemento cubierto porfib(m-2)
. Está dado porA[min(offset + fib(m-2), n - 1)]
. - Si
X
es igual a este elemento, devuelve el índice. - De lo contrario, si
X
es más pequeño que este elemento, descartamos la mitad después de este elemento y movemos la secuencia de Fibonacci dos pasos hacia atrás. Además, actualice el desplazamiento para cambiar el índice de inicio del espacio de búsqueda. Estos pasos descartan los dos tercios posteriores del espacio de búsqueda del array. - De lo contrario, si
X
es mayor que este elemento, descartamos la mitad antes de este elemento y movemos la secuencia de Fibonacci un paso hacia atrás. Este paso descarta el tercio frontal del espacio de búsqueda del array.
- Comparar
-
Si
fib(m-1)
es igual a1
tenemos un elemento sin marcar, compáralo conX
. SiX
es igual a este elemento, devuelve el índice. -
Si ninguno de los elementos coincide, devuelve
-1
.
Ejemplo de búsqueda de Fibonacci
Supongamos que tenemos el array (1, 2, 3, 4, 5, 6, 7)
. Tenemos que buscar el elemento X
= 6.
el array tiene 7 elementos. Entonces, n
= 7. El número de Fibonacci más pequeño mayor que n
es 8.
-
Obtenemos
fib(m)
=8
,fib(m-1)
=5
yfib(m-2)
=3
. -
Primera iteración
- Calculamos el índice del elemento como
min(-1 + 3, 6)
dándonos el elemento comoA[2] = 3
. 3
<6
es decir,A[2]
<X
, por lo tanto, descartamosA[0....2]
y establecemosoffset
como2
.- También actualizamos la secuencia de Fibonacci para mover
fib(m-2)
a2
,fib(m-1)
a3
yfib(m)
a5
.
- Calculamos el índice del elemento como
-
Segunda iteración
- Calculamos el índice del elemento como
min(2 + 2, 6)
dándonos el elemento comoA[4] = 5
. 5
<6
es decir,A[4]
<X
, por lo tanto, descartamosA[2 .... 4]
y establecemosoffset
como4
.- También actualizamos la secuencia de Fibonacci para mover
fib(m-2)
a1
,fib(m-1)
a2
yfib(m)
a3
.
- Calculamos el índice del elemento como
-
Tercera iteración
- Calculamos el índice del elemento como
min(4 + 1, 6)
dándonos el elemento comoA[5] = 6
. 6
==6
es decir,A[5]
==X
, devolvemos el índice5
.
- Calculamos el índice del elemento como
Implementación del algoritmo de búsqueda de Fibonacci
#include <bits/stdc++.h>
using namespace std;
int fibonacciSearch(int A[], int x, int n) {
int fbM2 = 0;
int fbM1 = 1;
int fbM = fbM2 + fbM1;
int offset = -1;
while (fbM < n) {
fbM2 = fbM1;
fbM1 = fbM;
fbM = fbM2 + fbM1;
}
while (fbM > 1) {
int i = min(offset + fbM2, n - 1);
if (A[i] < x) {
fbM = fbM1;
fbM1 = fbM2;
fbM2 = fbM - fbM1;
offset = i;
} else if (A[i] > x) {
fbM = fbM2;
fbM1 = fbM1 - fbM2;
fbM2 = fbM - fbM1;
} else
return i;
}
if (fbM1 && A[offset + 1] == x) return offset + 1;
return -1;
}
int main() {
int n = 9;
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int x = 8;
int result = fibonacciSearch(arr, x, n);
if (result == -1) {
cout << "Element not found !!";
} else
cout << "Element found at index " << result;
return 0;
}
Complejidad del algoritmo de búsqueda de Fibonacci
Complejidad del tiempo
- Caso promedio
Reducimos el espacio de búsqueda en un tercio / dos tercios en cada iteración y, por lo tanto, el algoritmo tiene una complejidad logarítmica. La complejidad de tiempo del algoritmo de búsqueda de Fibonacci es O(logn)
.
- Mejor caso
La complejidad del tiempo en el mejor de los casos es O(1)
. Ocurre cuando el elemento a buscar es el primer elemento que comparamos.
- Peor caso
El peor de los casos ocurre cuando el elemento objetivo X
siempre está presente en el subarreglo más grande. La complejidad de tiempo en el peor de los casos es O(logn)
. Es lo mismo que la complejidad del tiempo promedio de los casos.
Complejidad espacial
La complejidad espacial de este algoritmo es O(1)
porque no se requiere espacio adicional más que las variables temporales.
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