
- DSA using Java - Home
- DSA using Java - Overview
- DSA using Java - Environment Setup
- DSA using Java - Algorithms
- DSA using Java - Data Structures
- DSA using Java - Array
- DSA using Java - Linked List
- DSA using Java - Doubly Linked List
- DSA using Java - Circular Linked List
- DSA using Java - Stack
- DSA - Parsing Expressions
- DSA using Java - Queue
- DSA using Java - Priority Queue
- DSA using Java - Tree
- DSA using Java - Hash Table
- DSA using Java - Heap
- DSA using Java - Graph
- DSA using Java - Search techniques
- DSA using Java - Sorting techniques
- DSA using Java - Recursion
- DSA using Java Useful Resources
- DSA using Java - Quick Guide
- DSA using Java - Useful Resources
- DSA using Java - Discussion
DSA using Java - 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
Demo Program
package com.tutorialspoint.simplesearch; import java.util.Arrays; public class InterpolationSearchDemo { public static void main(String args[]){ int[] sourceArray = {1,2,3,4,6,7,9,11,12,14,15, 16,17,19,33,34,43,45,55,66,76,88}; System.out.println("Input Array: " +Arrays.toString(sourceArray)); printline(50); // find location of 55 // int location = find(sourceArray, 55); if(location != -1){ System.out.println("Element found at location: " +(location+1)); }else { System.out.println("Element not found."); } } public static int find(int[] intArray, int data){ int lowerBound = 0; int upperBound = intArray.length -1; int midPoint = -1; int comparisons = 0; int index = -1; while(lowerBound <= upperBound){ System.out.println("Comparison " + (comparisons +1) ) ; System.out.println("lowerBound : "+lowerBound + " , intArray[" + lowerBound+"] = " + intArray[lowerBound]) ; System.out.println("upperBound : "+upperBound + " , intArray[" + upperBound+"] = " + intArray[upperBound]) ; comparisons++; // probe the mid point midPoint = lowerBound + Math.round((float)(upperBound - lowerBound) / (intArray[upperBound] - intArray[lowerBound]) * (data - intArray[lowerBound])); System.out.println("midPoint = "+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; } } } System.out.println("Total comparisons made: " + comparisons); return index; } public static void printline(int count){ for(int i=0;i <count-1;i++){ System.out.print("="); } System.out.println("="); } }
If we compile and run the above program then it would produce following result −
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