Recherche Fibonacci
- Algorithme de recherche de Fibonacci
- Exemple de recherche Fibonacci
- Mise en œuvre de l’algorithme de recherche de Fibonacci
- Complexité de l’algorithme de recherche de Fibonacci
La recherche de Fibonacci est un algorithme de recherche par intervalle efficace. Elle est similaire à la [Recherche dichotomique](/fr/tutorial/algorithm/binary-search/ dans le sens où elle est également basée sur la stratégie diviser pour mieux régner
et qu’elle a également besoin du tableau pour être triée. De plus, la complexité temporelle des deux algorithmes est logarithmique. Il est appelé recherche de Fibonacci car il utilise la série de Fibonacci (Le nombre actuel est la somme de deux prédécesseurs F[i] = F[i-1] + F[i-2]
, F[0]
=0
& F[1]
=1
sont les deux premiers nombres de la série.) et divise le tableau en deux parties dont la taille est donnée par les nombres de Fibonacci. Il s’agit d’une méthode de calcul conviviale qui n’utilise que des opérations d’addition et de soustraction par rapport à la division, la multiplication et les décalages de bits requis par la Recherche dichotomique.
Algorithme de recherche de Fibonacci
Supposons que nous ayons un tableau non trié A[]
contenant n
éléments, et nous voulons trouver un élément - X
.
-
Trouvez le plus petit nombre de Fibonacci juste supérieur ou égal à la taille du tableau
n
. Soit ce nombre me le nombre de Fibonaccifib(m)
et ses prédécesseursfib(m-1)
etfib(m-2)
. -
Initialise le décalage comme
-1
. -
Si
fib(m-2)
est supérieur à0
, faites ce qui suit :- Comparez
X
avec le dernier élément couvert parfib(m-2)
. Il est donné parA[min(offset + fib(m-2), n - 1)]
. - Si
X
est égal à cet élément, alors l’indice est retourné. - Sinon, si
X
est plus petit que cet élément, nous éliminons la moitié après cet élément et nous reculons la séquence de Fibonacci de deux pas. De plus, on met à jour le décalage pour modifier l’index de départ de l’espace de recherche. Ces pas éliminent les deux tiers arrière de l’espace de recherche du tableau. - Sinon, si
X
est plus grand que cet élément, nous éliminons la moitié avant cet élément et nous reculons la séquence de Fibonacci d’un pas. Cette étape élimine le tiers avant de l’espace de recherche du tableau.
- Comparez
-
Si
fib(m-1)
est égal à1
nous avons un élément non coché, comparez-le avecX
. SiX
est égal à cet élément, alors renvoyez l’index. -
Si aucun des éléments ne correspond, alors retournez
-1
.
Exemple de recherche Fibonacci
Supposons que nous ayons le tableau : (1, 2, 3, 4, 5, 6, 7)
. Nous devons chercher l’élément X
= 6.
Le tableau a 7 éléments. Le plus petit nombre de Fibonacci supérieur à n
est 8.
-
On obtient
fib(m)
=8
,fib(m-1)
=5
etfib(m-2)
=3
. -
Premier tour
- Nous calculons l’indice de l’élément comme
min(-1 + 3, 6)
nous donnant l’élément commeA[2] = 3
. 3
<6
i.e.A[2]
<X
d’où nous rejetonsA[0.... 2]
et nous fixons leoffset
comme2
.- Nous mettons également à jour la séquence de Fibonacci pour déplacer
fib(m-2)
à2
,fib(m-1)
à3
etfib(m)
à5
.
- Nous calculons l’indice de l’élément comme
-
Deuxième tour
- Nous calculons l’indice de l’élément comme
min(2 + 2, 6)
nous donnant l’élément commeA[4] = 5
. 5
<6
i.e.A[4]
<X
d’où nous rejetonsA[2 .... 4]
et nous fixons ledécalage
comme4
.- Nous mettons également à jour la séquence de Fibonacci pour déplacer
fib(m-2)
à1
,fib(m-1)
à2
etfib(m)
à3
.
- Nous calculons l’indice de l’élément comme
-
Troisième itération
- Nous calculons l’indice de l’élément comme
min(4 + 1, 6)
nous donnant l’élément commeA[5] = 6
. 6
==6
, c’est-à-dire queA[5]== X
, nous obtenons l’indice5
.
- Nous calculons l’indice de l’élément comme
Mise en œuvre de l’algorithme de recherche 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;
}
Complexité de l’algorithme de recherche de Fibonacci
Complexité du temps
- Cas moyen
Nous réduisons l’espace de recherche d’un tiers / deux tiers à chaque itération, et l’algorithme a donc une complexité logarithmique. La complexité temporelle de l’algorithme de recherche de Fibonacci est O(logn)
.
- Meilleur cas
Le meilleur cas de complexité temporelle est O(1)
. Elle se produit lorsque l’élément à rechercher est le premier élément que nous comparons.
- Pire cas
Le pire cas se produit lorsque l’élément cible X
est toujours présent dans le grand sous-réseau. La complexité temporelle la plus défavorable est O(logn)
. C’est la même chose que la complexité temporelle moyenne.
Complexité spatiale
La complexité spatiale de cet algorithme est O(1)
car aucun espace supplémentaire autre que des variables temporaires n’est nécessaire.
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