Recherche Fibonacci

Harshit Jindal 12 octobre 2023
  1. Algorithme de recherche de Fibonacci
  2. Exemple de recherche Fibonacci
  3. Mise en œuvre de l’algorithme de recherche de Fibonacci
  4. Complexité de l’algorithme de recherche de Fibonacci
Recherche 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 Fibonacci fib(m) et ses prédécesseurs fib(m-1) et fib(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 par fib(m-2). Il est donné par A[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.
  • Si fib(m-1) est égal à 1 nous avons un élément non coché, comparez-le avec X. Si X 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 et fib(m-2) = 3.
  • Premier tour
    • Nous calculons l’indice de l’élément comme min(-1 + 3, 6) nous donnant l’élément comme A[2] = 3.
    • 3 < 6 i.e. A[2] < X d’où nous rejetons A[0.... 2] et nous fixons le offset comme 2.
    • Nous mettons également à jour la séquence de Fibonacci pour déplacer fib(m-2) à 2, fib(m-1) à 3 et fib(m) à 5.
  • Deuxième tour
    • Nous calculons l’indice de l’élément comme min(2 + 2, 6) nous donnant l’élément comme A[4] = 5.
    • 5 < 6 i.e. A[4] < X d’où nous rejetons A[2 .... 4] et nous fixons le décalage comme 4.
    • Nous mettons également à jour la séquence de Fibonacci pour déplacer fib(m-2) à 1, fib(m-1) à 2 et fib(m) à 3.
  • Troisième itération
    • Nous calculons l’indice de l’élément comme min(4 + 1, 6) nous donnant l’élément comme A[5] = 6.
    • 6 == 6, c’est-à-dire que A[5]== X, nous obtenons l’indice 5.

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 avatar Harshit Jindal avatar

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

Article connexe - Search Algorithm