DSA using C - Interpolation Search



Overview

Interpolation search is an improved variant of binary search. This search algorithm works on the probing position of required value. For this algorithm to work properly the data collection should be in sorted form.

Interpolation search search a particular item by computing the probe position.Initially probe position is the position of the middle most item of the collection. If match occurs then index of item is returned. If middle item is greater than item then probe position is again calculated in the sub-array to the right of the middle item other wise item is search in sub-array to the left of the middle item. This process continues on sub-array as well until the size of subarray reduces to zero.

Example of interpolation search is dictionary search, where to search a word starting from say, X we searches near the end of the dictionary thus by interpolating the probe position and so on.

Algorithm

Interpolation Search ( A: array of item, n: total no. of items 
   ,x: item to be searched)
Step 1: Set lowerBound = 0
Step 2: Set upperBound = n - 1
Step 3: if lowerBound  = upperBound or A[lowerBound] = A[upperBound] go to step 12
Step 4: set midPoint = lowerBound + 
   ((upperBound -lowerBound) / (A[upperBound] - A[lowerBound])) 
   * (x - A[lowerBound])
Step 5: if A[midPoint] < x
Step 6: set from = midPoint + 1
Step 7: if A[midPoint] > x
Step 8: set to = midPoint - 1 
Step 9: if A[midPoint] = x go to step 11
Step 10: Go to Step 3
Step 11: Print Element x Found at index midPoint and go to step 13
Step 12: Print element not found
Step 13: Exit

Example

#include <stdio.h>
#include <math.h>
#define MAX 20

// array of items on which linear search will be conducted. 
int intArray[MAX] = {1,2,3,4,6,7,9,11,12,14,15,16,17,19,33,34,43,45,55,66};

void printline(int count){
   int i;
   for(i=0;i <count-1;i++){
      printf("=");
   }
   printf("=\n");
}
int find(int data){
   int lowerBound = 0;
   int upperBound = MAX -1;
   int midPoint = -1;
   int comparisons = 0;      
   int index = -1;
   while(lowerBound <= upperBound){
      printf("Comparison %d\n" , (comparisons +1) ) ;
      printf("lowerBound : %d, intArray[%d] = %d\n",
         lowerBound,lowerBound,intArray[lowerBound]);
      printf("upperBound : %d, intArray[%d] = %d\n",
         upperBound,upperBound,intArray[upperBound]);
      comparisons++;
      // probe the mid point 
      midPoint = lowerBound + 
      round((double)(upperBound - lowerBound) 
         / (intArray[upperBound] - intArray[lowerBound]) 
         *  (data - intArray[lowerBound]));
      printf("midPoint = %d\n",midPoint);
      // data found 
      if(intArray[midPoint] == data){
         index = midPoint;
         break;
      } else {
         // if data is larger 
         if(intArray[midPoint] < data){
            // data is in upper half 
            lowerBound = midPoint + 1;
         }
         // data is smaller 
         else{           
            // data is in lower half 
            upperBound = midPoint -1;
         }
      }
   }
   printf("Total comparisons made: %d" , comparisons);
   return index;
}
void display(){
   int i;
   printf("[");
   // navigate through all items 
   for(i=0;i<MAX;i++){
      printf("%d ",intArray[i]);
   }
   printf("]\n");
}
int main(){
   printf("Input Array: ");
   display();
   printline(50);
   
   //find location of 1
   int location = find(55);

   // if element was found 
   if(location != -1)
      printf("\nElement found at location: %d" ,(location+1));
   else
      printf("Element not found.");
}

Output

If we compile and run the above program then it would produce following output −

Input Array: [1 2 3 4 6 7 9 11 12 14 15 16 17 19 33 34 43 45 55 66 ]
==================================================
Comparison 1
lowerBound : 0, intArray[0] = 1
upperBound : 19, intArray[19] = 66 midPoint = 16 Comparison 2
lowerBound : 17, intArray[17] = 45
upperBound : 19, intArray[19] = 66
midPoint = 18
Total comparisons made: 2
Element found at location: 19
dsa_using_c_search_techniques.htm
Advertisements