logo

Recherche par interpolation

Étant donné un tableau trié de n valeurs uniformément distribuées, arr[] écrit une fonction pour rechercher un élément particulier x dans le tableau. 
La recherche linéaire trouve l'élément en un temps O(n) Recherche sautée prend un temps O(n) et Recherche binaire prend un temps O (log n). 
La recherche par interpolation est une amélioration par rapport à Recherche binaire pour les cas où les valeurs d'un tableau trié sont uniformément distribuées. L'interpolation construit de nouveaux points de données dans la plage d'un ensemble discret de points de données connus. La recherche binaire va toujours à l'élément du milieu pour vérifier. D'un autre côté, la recherche par interpolation peut aller vers différents emplacements en fonction de la valeur de la clé recherchée. Par exemple, si la valeur de la clé est plus proche du dernier élément, la recherche par interpolation commencera probablement vers la fin.
Pour trouver la position à rechercher, il utilise la formule suivante. 

// L'idée de la formule est de renvoyer une valeur de pos plus élevée
// lorsque l'élément à rechercher est plus proche de arr[hi]. Et
// valeur plus petite lorsqu'on se rapproche de arr[lo]



insérer un filigrane dans Word

arr[] ==> Tableau où les éléments doivent être recherchés

x     ==> Élément à rechercher

lo    ==> Index de départ dans arr[]



salut    ==> Fin de l'index dans arr[]

après = le +               

Il existe de nombreuses méthodes d'interpolation différentes, dont l'une est connue sous le nom d'interpolation linéaire. L'interpolation linéaire prend deux points de données que nous supposons comme (x1y1) et (x2y2) et la formule est : au point (xy).



Cet algorithme fonctionne de la même manière que nous recherchons un mot dans un dictionnaire. L'algorithme de recherche par interpolation améliore l'algorithme de recherche binaire.  La formule pour trouver une valeur est : K = >K est une constante utilisée pour restreindre l’espace de recherche. Dans le cas d'une recherche binaire, la valeur de cette constante est : K=(low+high)/2.

dans.suivant java

  

La formule pour pos peut être dérivée comme suit.

Let's assume that the elements of the array are linearly distributed.   

General equation of line : y = m*x + c.
y is the value in the array and x is its index.

Now putting value of lohi and x in the equation
arr[hi] = m*hi+c ----(1)
arr[lo] = m*lo+c ----(2)
x = m*pos + c ----(3)

m = (arr[hi] - arr[lo] )/ (hi - lo)

subtracting eqxn (2) from (3)
x - arr[lo] = m * (pos - lo)
lo + (x - arr[lo])/m = pos
pos = lo + (x - arr[lo]) *(hi - lo)/(arr[hi] - arr[lo])

Algorithme  
Le reste de l'algorithme d'interpolation est le même, à l'exception de la logique de partition ci-dessus. 

  • Étape 1 : Dans une boucle, calculez la valeur de « pos » en utilisant la formule de position de la sonde. 
  • Étape 2 : S'il s'agit d'une correspondance, renvoyez l'index de l'élément et quittez. 
  • Étape 3 : Si l'élément est inférieur à arr[pos], calculez la position de la sonde du sous-tableau gauche. Sinon, calculez la même chose dans le sous-tableau de droite. 
  • Étape 4 : Répétez jusqu’à ce qu’une correspondance soit trouvée ou que le sous-tableau soit réduit à zéro.


Vous trouverez ci-dessous la mise en œuvre de l'algorithme. 

biais et variance
C++
// C++ program to implement interpolation // search with recursion #include    using namespace std; // If x is present in arr[0..n-1] then returns // index of it else returns -1. int interpolationSearch(int arr[] int lo int hi int x) {  int pos;  // Since array is sorted an element present  // in array must be in range defined by corner  if (lo <= hi && x >= arr[lo] && x <= arr[hi]) {  // Probing the position with keeping  // uniform distribution in mind.  pos = lo  + (((double)(hi - lo) / (arr[hi] - arr[lo]))  * (x - arr[lo]));  // Condition of target found  if (arr[pos] == x)  return pos;  // If x is larger x is in right sub array  if (arr[pos] < x)  return interpolationSearch(arr pos + 1 hi x);  // If x is smaller x is in left sub array  if (arr[pos] > x)  return interpolationSearch(arr lo pos - 1 x);  }  return -1; } // Driver Code int main() {  // Array of items on which search will  // be conducted.  int arr[] = { 10 12 13 16 18 19 20 21  22 23 24 33 35 42 47 };  int n = sizeof(arr) / sizeof(arr[0]);  // Element to be searched  int x = 18;  int index = interpolationSearch(arr 0 n - 1 x);  // If element was found  if (index != -1)  cout << 'Element found at index ' << index;  else  cout << 'Element not found.';  return 0; } // This code is contributed by equbalzeeshan 
C
// C program to implement interpolation search // with recursion #include  // If x is present in arr[0..n-1] then returns // index of it else returns -1. int interpolationSearch(int arr[] int lo int hi int x) {  int pos;  // Since array is sorted an element present  // in array must be in range defined by corner  if (lo <= hi && x >= arr[lo] && x <= arr[hi]) {  // Probing the position with keeping  // uniform distribution in mind.  pos = lo  + (((double)(hi - lo) / (arr[hi] - arr[lo]))  * (x - arr[lo]));  // Condition of target found  if (arr[pos] == x)  return pos;  // If x is larger x is in right sub array  if (arr[pos] < x)  return interpolationSearch(arr pos + 1 hi x);  // If x is smaller x is in left sub array  if (arr[pos] > x)  return interpolationSearch(arr lo pos - 1 x);  }  return -1; } // Driver Code int main() {  // Array of items on which search will  // be conducted.  int arr[] = { 10 12 13 16 18 19 20 21  22 23 24 33 35 42 47 };  int n = sizeof(arr) / sizeof(arr[0]);  int x = 18; // Element to be searched  int index = interpolationSearch(arr 0 n - 1 x);  // If element was found  if (index != -1)  printf('Element found at index %d' index);  else  printf('Element not found.');  return 0; } 
Java
// Java program to implement interpolation // search with recursion import java.util.*; class GFG {  // If x is present in arr[0..n-1] then returns  // index of it else returns -1.  public static int interpolationSearch(int arr[] int lo  int hi int x)  {  int pos;  // Since array is sorted an element  // present in array must be in range  // defined by corner  if (lo <= hi && x >= arr[lo] && x <= arr[hi]) {  // Probing the position with keeping  // uniform distribution in mind.  pos = lo  + (((hi - lo) / (arr[hi] - arr[lo]))  * (x - arr[lo]));  // Condition of target found  if (arr[pos] == x)  return pos;  // If x is larger x is in right sub array  if (arr[pos] < x)  return interpolationSearch(arr pos + 1 hi  x);  // If x is smaller x is in left sub array  if (arr[pos] > x)  return interpolationSearch(arr lo pos - 1  x);  }  return -1;  }  // Driver Code  public static void main(String[] args)  {  // Array of items on which search will  // be conducted.  int arr[] = { 10 12 13 16 18 19 20 21  22 23 24 33 35 42 47 };  int n = arr.length;  // Element to be searched  int x = 18;  int index = interpolationSearch(arr 0 n - 1 x);  // If element was found  if (index != -1)  System.out.println('Element found at index '  + index);  else  System.out.println('Element not found.');  } } // This code is contributed by equbalzeeshan 
Python
# Python3 program to implement # interpolation search # with recursion # If x is present in arr[0..n-1] then # returns index of it else returns -1. def interpolationSearch(arr lo hi x): # Since array is sorted an element present # in array must be in range defined by corner if (lo <= hi and x >= arr[lo] and x <= arr[hi]): # Probing the position with keeping # uniform distribution in mind. pos = lo + ((hi - lo) // (arr[hi] - arr[lo]) * (x - arr[lo])) # Condition of target found if arr[pos] == x: return pos # If x is larger x is in right subarray if arr[pos] < x: return interpolationSearch(arr pos + 1 hi x) # If x is smaller x is in left subarray if arr[pos] > x: return interpolationSearch(arr lo pos - 1 x) return -1 # Driver code # Array of items in which # search will be conducted arr = [10 12 13 16 18 19 20 21 22 23 24 33 35 42 47] n = len(arr) # Element to be searched x = 18 index = interpolationSearch(arr 0 n - 1 x) if index != -1: print('Element found at index' index) else: print('Element not found') # This code is contributed by Hardik Jain 
C#
// C# program to implement  // interpolation search using System; class GFG{ // If x is present in  // arr[0..n-1] then  // returns index of it  // else returns -1. static int interpolationSearch(int []arr int lo   int hi int x) {  int pos;    // Since array is sorted an element  // present in array must be in range  // defined by corner  if (lo <= hi && x >= arr[lo] &&   x <= arr[hi])  {    // Probing the position   // with keeping uniform   // distribution in mind.  pos = lo + (((hi - lo) /   (arr[hi] - arr[lo])) *   (x - arr[lo]));  // Condition of   // target found  if(arr[pos] == x)   return pos;     // If x is larger x is in right sub array   if(arr[pos] < x)   return interpolationSearch(arr pos + 1  hi x);     // If x is smaller x is in left sub array   if(arr[pos] > x)   return interpolationSearch(arr lo   pos - 1 x);   }   return -1; } // Driver Code  public static void Main()  {    // Array of items on which search will   // be conducted.   int []arr = new int[]{ 10 12 13 16 18   19 20 21 22 23   24 33 35 42 47 };    // Element to be searched   int x = 18;   int n = arr.Length;  int index = interpolationSearch(arr 0 n - 1 x);    // If element was found  if (index != -1)  Console.WriteLine('Element found at index ' +   index);  else  Console.WriteLine('Element not found.'); } } // This code is contributed by equbalzeeshan 
JavaScript
<script> // Javascript program to implement Interpolation Search // If x is present in arr[0..n-1] then returns // index of it else returns -1. function interpolationSearch(arr lo hi x){  let pos;    // Since array is sorted an element present  // in array must be in range defined by corner    if (lo <= hi && x >= arr[lo] && x <= arr[hi]) {    // Probing the position with keeping  // uniform distribution in mind.  pos = lo + Math.floor(((hi - lo) / (arr[hi] - arr[lo])) * (x - arr[lo]));;    // Condition of target found  if (arr[pos] == x){  return pos;  }    // If x is larger x is in right sub array  if (arr[pos] < x){  return interpolationSearch(arr pos + 1 hi x);  }    // If x is smaller x is in left sub array  if (arr[pos] > x){  return interpolationSearch(arr lo pos - 1 x);  }  }  return -1; } // Driver Code let arr = [10 12 13 16 18 19 20 21   22 23 24 33 35 42 47]; let n = arr.length; // Element to be searched let x = 18 let index = interpolationSearch(arr 0 n - 1 x); // If element was found if (index != -1){  document.write(`Element found at index ${index}`) }else{  document.write('Element not found'); } // This code is contributed by _saurabh_jaiswal </script> 
PHP
 // PHP program to implement $erpolation search // with recursion // If x is present in arr[0..n-1] then returns // index of it else returns -1. function interpolationSearch($arr $lo $hi $x) { // Since array is sorted an element present // in array must be in range defined by corner if ($lo <= $hi && $x >= $arr[$lo] && $x <= $arr[$hi]) { // Probing the position with keeping // uniform distribution in mind. $pos = (int)($lo + (((double)($hi - $lo) / ($arr[$hi] - $arr[$lo])) * ($x - $arr[$lo]))); // Condition of target found if ($arr[$pos] == $x) return $pos; // If x is larger x is in right sub array if ($arr[$pos] < $x) return interpolationSearch($arr $pos + 1 $hi $x); // If x is smaller x is in left sub array if ($arr[$pos] > $x) return interpolationSearch($arr $lo $pos - 1 $x); } return -1; } // Driver Code // Array of items on which search will // be conducted. $arr = array(10 12 13 16 18 19 20 21 22 23 24 33 35 42 47); $n = sizeof($arr); $x = 47; // Element to be searched $index = interpolationSearch($arr 0 $n - 1 $x); // If element was found if ($index != -1) echo 'Element found at index '.$index; else echo 'Element not found.'; return 0; #This code is contributed by Susobhan Akhuli ?> 

Sortir
Element found at index 4

Complexité temporelle : O(journal2(enregistrer2n)) pour le cas moyen et O(n) pour le pire des cas 
Complexité de l'espace auxiliaire : O(1)

Une autre approche: -

Il s'agit de l'approche itérative pour la recherche d'interpolation.

  • Étape 1 : Dans une boucle, calculez la valeur de « pos » en utilisant la formule de position de la sonde. 
  • Étape 2 : S'il s'agit d'une correspondance, renvoyez l'index de l'élément et quittez. 
  • Étape 3 : Si l'élément est inférieur à arr[pos], calculez la position de la sonde du sous-tableau gauche. Sinon, calculez la même chose dans le sous-tableau de droite. 
  • Étape 4 : Répétez jusqu’à ce qu’une correspondance soit trouvée ou que le sous-tableau soit réduit à zéro.

Vous trouverez ci-dessous la mise en œuvre de l'algorithme. 

C++
// C++ program to implement interpolation search by using iteration approach #include   using namespace std;   int interpolationSearch(int arr[] int n int x) {  // Find indexes of two corners  int low = 0 high = (n - 1);  // Since array is sorted an element present  // in array must be in range defined by corner  while (low <= high && x >= arr[low] && x <= arr[high])  {  if (low == high)  {if (arr[low] == x) return low;  return -1;  }  // Probing the position with keeping  // uniform distribution in mind.  int pos = low + (((double)(high - low) /  (arr[high] - arr[low])) * (x - arr[low]));    // Condition of target found  if (arr[pos] == x)  return pos;  // If x is larger x is in upper part  if (arr[pos] < x)  low = pos + 1;  // If x is smaller x is in the lower part  else  high = pos - 1;  }  return -1; }   // Main function int main() {  // Array of items on whighch search will  // be conducted.  int arr[] = {10 12 13 16 18 19 20 21  22 23 24 33 35 42 47};  int n = sizeof(arr)/sizeof(arr[0]);    int x = 18; // Element to be searched  int index = interpolationSearch(arr n x);    // If element was found  if (index != -1)  cout << 'Element found at index ' << index;  else  cout << 'Element not found.';  return 0; }  //this code contributed by Ajay Singh 
Java
// Java program to implement interpolation // search with recursion import java.util.*; class GFG {  // If x is present in arr[0..n-1] then returns  // index of it else returns -1.  public static int interpolationSearch(int arr[] int lo  int hi int x)  {  int pos;  if (lo <= hi && x >= arr[lo] && x <= arr[hi]) {  // Probing the position with keeping  // uniform distribution in mind.  pos = lo  + (((hi - lo) / (arr[hi] - arr[lo]))  * (x - arr[lo]));  // Condition of target found  if (arr[pos] == x)  return pos;  // If x is larger x is in right sub array  if (arr[pos] < x)  return interpolationSearch(arr pos + 1 hi  x);  // If x is smaller x is in left sub array  if (arr[pos] > x)  return interpolationSearch(arr lo pos - 1  x);  }  return -1;  }  // Driver Code  public static void main(String[] args)  {  // Array of items on which search will  // be conducted.  int arr[] = { 10 12 13 16 18 19 20 21  22 23 24 33 35 42 47 };  int n = arr.length;  // Element to be searched  int x = 18;  int index = interpolationSearch(arr 0 n - 1 x);  // If element was found  if (index != -1)  System.out.println('Element found at index '  + index);  else  System.out.println('Element not found.');  } } 
Python
# Python equivalent of above C++ code  # Python program to implement interpolation search by using iteration approach def interpolationSearch(arr n x): # Find indexes of two corners  low = 0 high = (n - 1) # Since array is sorted an element present  # in array must be in range defined by corner  while low <= high and x >= arr[low] and x <= arr[high]: if low == high: if arr[low] == x: return low; return -1; # Probing the position with keeping  # uniform distribution in mind.  pos = int(low + (((float(high - low)/( arr[high] - arr[low])) * (x - arr[low])))) # Condition of target found  if arr[pos] == x: return pos # If x is larger x is in upper part  if arr[pos] < x: low = pos + 1; # If x is smaller x is in lower part  else: high = pos - 1; return -1 # Main function if __name__ == '__main__': # Array of items on whighch search will  # be conducted. arr = [10 12 13 16 18 19 20 21 22 23 24 33 35 42 47] n = len(arr) x = 18 # Element to be searched index = interpolationSearch(arr n x) # If element was found if index != -1: print ('Element found at index'index) else: print ('Element not found') 
C#
// C# program to implement interpolation search by using // iteration approach using System; class Program {  // Interpolation Search function  static int InterpolationSearch(int[] arr int n int x)  {  int low = 0;  int high = n - 1;    while (low <= high && x >= arr[low] && x <= arr[high])   {  if (low == high)   {  if (arr[low] == x)   return low;   return -1;   }    int pos = low + (int)(((float)(high - low) / (arr[high] - arr[low])) * (x - arr[low]));    if (arr[pos] == x)   return pos;     if (arr[pos] < x)   low = pos + 1;     else   high = pos - 1;   }    return -1;  }    // Main function  static void Main(string[] args)  {  int[] arr = {10 12 13 16 18 19 20 21 22 23 24 33 35 42 47};  int n = arr.Length;    int x = 18;  int index = InterpolationSearch(arr n x);    if (index != -1)   Console.WriteLine('Element found at index ' + index);  else   Console.WriteLine('Element not found');  } } // This code is contributed by Susobhan Akhuli 
JavaScript
// JavaScript program to implement interpolation search by using iteration approach function interpolationSearch(arr n x) { // Find indexes of two corners let low = 0; let high = n - 1; // Since array is sorted an element present // in array must be in range defined by corner while (low <= high && x >= arr[low] && x <= arr[high]) {  if (low == high) {  if (arr[low] == x) {  return low;  }  return -1;  }  // Probing the position with keeping  // uniform distribution in mind.  let pos = Math.floor(low + (((high - low) / (arr[high] - arr[low])) * (x - arr[low])));  // Condition of target found  if (arr[pos] == x) {  return pos;  }  // If x is larger x is in upper part  if (arr[pos] < x) {  low = pos + 1;  }  // If x is smaller x is in lower part  else {  high = pos - 1;  } } return -1; } // Main function let arr = [10 12 13 16 18 19 20 21 22 23 24 33 35 42 47]; let n = arr.length; let x = 18; // Element to be searched let index = interpolationSearch(arr n x); // If element was found if (index != -1) { console.log('Element found at index' index); } else { console.log('Element not found'); } 

Sortir
Element found at index 4

Complexité temporelle : O(log2(log2 n)) pour le cas moyen et O(n) pour le pire des cas 
Complexité de l'espace auxiliaire : O(1)