- 使用 Java 的 DSA 教程
- 使用 Java 的 DSA - 主页
- 使用 Java 的 DSA - 概述
- 使用 Java 的 DSA - 环境设置
- 使用 Java 的 DSA - 算法
- 使用 Java 的 DSA - 数据结构
- 使用 Java 的 DSA - 数组
- 使用 Java 的 DSA - 链表
- 使用 Java 的 DSA - 双链表
- 使用 Java 的 DSA - 循环链表
- 使用 Java 的 DSA - 栈
- DSA - 解析表达式
- 使用 Java 的 DSA - 队列
- 使用 Java 的 DSA - 优先级队列
- 使用 Java 的 DSA - 树
- 使用 Java 的 DSA - 哈希表
- 使用 Java 的 DSA - 堆
- 使用 Java 的 DSA - 图
- 使用 Java 的 DSA - 搜索技术
- 使用 Java 的 DSA - 排序技术
- 使用 Java 的 DSA - 递归
- 使用 Java 的 DSA 实用资源
- 使用 Java 的 DSA - 快速指南
- 使用 Java 的 DSA - 实用资源
- 使用 Java 的 DSA - 讨论
使用 Java 的 DSA - 插值查找
概述
插值查找是二分查找的改良版本。此搜索算法使用所需值的探查位置。此算法要能正常运作,数据集合必须已排序。
插值查找借助于计算探查位置的方式查找特定项目。最初探查位置是集合中中间项目的位置。如果出现匹配,则会返回项目索引。如果中间项目的项大于所需项,则重新计算右方的子数组的探查位置,否则在左方的子数组中查找所需项。此过程还会继续在子数组中进行,直到子数组的大小变为零。
插值查找的示例为字典查找,从某个单词开始,例如从 X 开始进行查找,我们将在字典的末尾附近进行查找,从而插入探查位置,依此类推。
算法
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
演示程序
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("=");
}
}
如果我们编译并运行上述程序,则会得到以下结果 -
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
广告