Recherche par interpolation

Harshit Jindal 12 octobre 2023
  1. Algorithme de recherche par interpolation
  2. Exemple de recherche par interpolation
  3. Mise en œuvre de l’algorithme de recherche par interpolation
  4. Complexité de l’algorithme de recherche par interpolation
Recherche par interpolation

La recherche par interpolation est un algorithme de recherche rapide et efficace. Il améliore l’algorithme de recherche dichotomique pour les scénarios où les éléments du tableau sont uniformément répartis sur le tableau trié. Il travaille sur la position de sondage de la valeur requise. Contrairement à la recherche dichotomique, elle ne va pas toujours au milieu du tableau mais peut aller à n’importe quelle position en fonction de la valeur de la clé à rechercher. Nous comparons la valeur à la position estimée et réduisons l’espace de recherche à la partie qui la suit ou la précède. Par exemple, lorsque nous recherchons un mot dans le dictionnaire, nous retournons les pages en fonction de la position des lettres à l’intérieur de celui-ci et non en divisant chaque fois l’espace de recherche en deux moitiés.

Algorithme de recherche par interpolation

Supposons que nous ayons un tableau non trié A[] contenant n éléments et que nous voulons trouver un élément donné X.

  • Définissez lo comme 0, mid comme -1 et hi comme n-1.
  • Alors que lo <= hi et X se situent dans la plage entre lo et hi, c’est-à-dire X >= A[lo] et X <= A[hi].
    • Calculer mid en utilisant la formule pour la position de la sonde - mid = lo + (X - A[lo]) * (hi - lo) / (A[hi] - A[lo]).
    • Si l’élément à la position de la sonde est inférieur à l’élément cible, déplacez-vous vers la droite. Si A[mid] < X, définissez lo comme mid + 1.
    • Sinon, si l’élément est supérieur à l’élément cible, déplacez-vous vers la gauche. Si A[mid]> X, définissez hi sur mid-1.
    • Sinon, nous avons trouvé l’élément et nous retournons mid.
  • Si lo == hi, il ne reste qu’un seul élément vérifier s’il s’agit de l’élément cible, c’est-à-dire si A[lo] == X.
    • Si true, alors renvoie lo.
    • Sinon, retourne -1.

Exemple de recherche par interpolation

Supposons que nous ayons le tableau : (1, 3, 7, 8, 11, 15, 17, 18, 21), et que nous voulions trouver X - 18.

  • Set lo = 0 , mid= -1 et hi = 8.
  • Calculer mid comme 6 en utilisant la formule - 0 + (18 - 1)*(8 - 0)/(21-1).
  • Ensuite, nous comparons A[6] avec X pour voir qu’il est plus petit et nous fixons lo comme 7.
  • Calculer mid en utilisant 7 + (18 - 18)*(8 - 7)/(21 - 18).
  • Ensuite, on compare A[7] avec X pour voir qu’il est égal à 18 et on obtient l’indice 7.

Mise en œuvre de l’algorithme de recherche par interpolation

#include <bits/stdc++.h>
using namespace std;

int interpolation_search(int arr[], int n, int X) {
  int lo = 0;
  int hi = n - 1;
  int mid;

  while ((arr[hi] != arr[lo]) && (X >= arr[lo]) && (X <= arr[hi])) {
    mid = lo + ((X - arr[lo]) * (hi - lo) / (arr[hi] - arr[lo]));

    if (arr[mid] < X)
      lo = mid + 1;
    else if (X < arr[mid])
      hi = mid - 1;
    else
      return mid;
  }

  if (X == arr[lo])
    return lo;
  else
    return -1;
}

int main(void) {
  int n = 9;
  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int x = 4;
  int result = interpolation_search(arr, n, x);
  if (result == -1) {
    cout << "Element not found !!";
  } else
    cout << "Element found at index " << result;
  return 0;
}

Complexité de l’algorithme de recherche par interpolation

Complexité du temps

  • Cas moyen

La complexité temporelle moyenne de l’algorithme est de l’ordre de O(log(logn)). Elle se produit lorsque tous les éléments à l’intérieur du tableau sont uniformément distribués.

  • Meilleur cas

Le meilleur cas se produit lorsque l’élément que nous recherchons est le premier élément interrogé par la recherche par interpolation. Le meilleur cas de complexité temporelle de l’algorithme est O(1).

  • Le pire cas

Le pire cas se produit lorsque les valeurs numériques des cibles augmentent de manière exponentielle. La complexité temporelle de l’algorithme dans le pire des cas est O(n).

Complexité spatiale

La complexité spatiale de cet algorithme est O(1) car il ne nécessite aucune structure de données autre que des variables temporaires.

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