Added Interpolation Search and JUnit test.
This commit is contained in:
parent
829f7d7313
commit
c0ca53743a
60
src/main/java/com/search/InterpolationSearch.java
Normal file
60
src/main/java/com/search/InterpolationSearch.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package src.main.java.com.search;
|
||||||
|
|
||||||
|
public class InterpolationSearch {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A linear interpolation search algorithm that finds the position of a
|
||||||
|
* target value in an sorted array using its lowest value and highest value.
|
||||||
|
*
|
||||||
|
* Average time-complexity O(log log n) - uniformly distributed.
|
||||||
|
* Worst-case time-complexity O(n) - non-uniformly distributed
|
||||||
|
* Worst-case space complexity O(1)
|
||||||
|
*
|
||||||
|
* @param <T>This is any comparable type
|
||||||
|
* @param arr This is the array where the element should be found
|
||||||
|
* @param key This is the element to find in the array
|
||||||
|
* @return The index of the key in the array
|
||||||
|
*/
|
||||||
|
public <T extends Comparable<T>> int findIndex(T arr[], T key) {
|
||||||
|
return checkCondition(arr, key, 0, arr.length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param lowIndex The first and smallest element in the sorted array
|
||||||
|
* @param highIndex The last and largest element in the sorted array
|
||||||
|
* @return The found key's index in the array through iteration
|
||||||
|
*/
|
||||||
|
private <T extends Comparable<T>> int checkCondition(T arr[], T key, int lowIndex, int highIndex) {
|
||||||
|
boolean conditionOne = lowIndex <= highIndex && key.compareTo(arr[lowIndex]) >= 0;
|
||||||
|
boolean conditionTwo = key.compareTo(arr[lowIndex]) == 0 && key.compareTo(arr[highIndex]) <= 0;
|
||||||
|
while (conditionOne || conditionTwo) {
|
||||||
|
int position = getPostion(arr, key, lowIndex, highIndex);
|
||||||
|
if (arr[position].equals(key))
|
||||||
|
return position;
|
||||||
|
|
||||||
|
if (arr[position].compareTo(key) < 0)
|
||||||
|
lowIndex = position + 1;
|
||||||
|
else
|
||||||
|
highIndex = position - 1;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The array's current retrieved index position
|
||||||
|
*/
|
||||||
|
private <T> int getPostion(T arr[], T key, int lowIndex, int highIndex) {
|
||||||
|
String startValueString = arr[lowIndex].toString(); //First convert <T> array element to String
|
||||||
|
int startValueInt = Integer.parseInt(startValueString); //Convert String to int to computate later
|
||||||
|
String endValueString = arr[highIndex].toString();
|
||||||
|
int endValueInt = Integer.parseInt(endValueString);
|
||||||
|
String keyValueString = key.toString(); //Repeat for <T> key to later computate
|
||||||
|
int keyValueInt = Integer.parseInt(keyValueString);
|
||||||
|
|
||||||
|
int arrayIndexRangeDiff = highIndex - lowIndex;
|
||||||
|
int arrayHighLowValuesDiff = endValueInt - startValueInt;
|
||||||
|
int keyMinusArrayLowValue = keyValueInt - startValueInt;
|
||||||
|
int position = lowIndex + (((arrayIndexRangeDiff) / (arrayHighLowValuesDiff) * (keyMinusArrayLowValue)));
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
}
|
29
src/test/java/com/search/InterpolationSearchTest.java
Normal file
29
src/test/java/com/search/InterpolationSearchTest.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package src.test.java.com.search;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import src.main.java.com.search.InterpolationSearch;
|
||||||
|
|
||||||
|
public class InterpolationSearchTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInterpolationSearch() {
|
||||||
|
InterpolationSearch interpolationSearch = new InterpolationSearch();
|
||||||
|
|
||||||
|
Integer arr[] = {10, 12, 13, 16, 18, 19, 21};
|
||||||
|
int x = 18;
|
||||||
|
int index = interpolationSearch.findIndex(arr, x);
|
||||||
|
Assert.assertEquals("Incorrect index", 4, index);
|
||||||
|
|
||||||
|
Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100};
|
||||||
|
x = -190;
|
||||||
|
index = interpolationSearch.findIndex(arrTwo, x);
|
||||||
|
Assert.assertEquals("Incorrect index", 1, index);
|
||||||
|
|
||||||
|
String arrString[] = {"10", "12", "13", "16", "22", "25","29"};
|
||||||
|
String stringX = "13";
|
||||||
|
index = interpolationSearch.findIndex(arrString, stringX);
|
||||||
|
Assert.assertEquals("Incorrect index", 2, index);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user