【数算-16】插值查找
作者:互联网
文章目录
1、算法思想
2、问题描述
3、代码实现
注:这里将插值查找算法实现为能返回多个下标的集合
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhihua.li
* @date 2021/2/7 - 21:45
* 插值查找算法
**/
public class InsertValueSearch {
/**
* @param arr 待查找数组
* @param left 左侧索引
* @param right 右侧索引
* @param target 待查找目标值
* @return
* @Method insertValueSearch
* @Author zhihua.Li
* @Version 1.0
* @Description 针对要查找的值在待查找有序数组中包含多个时,需要返回多个下标
* 插值查找相较于二分查找而言:
* 通过自适应式获取mid值(将目标值带入到求mid值公式中)能较快的查找到目标元素所在位置
* 对于数据量较大,关键字分布较均匀(跳跃性较小)的查找表来说,速度较快
* 关键字分布不均匀(跳跃性较大)时不一定比折半查找好
* @Return List<Integer> 返回下标集合
* @Exception
* @Date 2021/2/7 8:16
*/
private List<Integer> insertValueSearch(int[] arr, int left, int right, int target) {
System.out.println("~~~");
// 在left>righ的基础上添加了后两个判断条件,避免因目标值过大或过小而一直查找到最后的问题
if (left > right ) {
return null;
}
int mid = left + (right - left) * (target - arr[left]) / (arr[right] - arr[left]);
int midValue = arr[mid];
List<Integer> resIndexList = new ArrayList<>();
if (target < midValue) {
return insertValueSearch(arr, left, mid - 1, target);
} else if (target > midValue) {
return insertValueSearch(arr, mid + 1, right, target);
} else {
int temp = mid - 1;
while (true) {
if (temp < 0 || arr[temp] != target) {
break;
}
resIndexList.add(temp);
temp--;
}
resIndexList.add(mid);
temp = mid + 1;
while (true) {
if (temp > arr.length - 1 || arr[temp] != target) {
break;
}
resIndexList.add(temp);
temp++;
}
return resIndexList;
}
}
}
4、测试与分析
@Test
public void test() {
int arr[] = {1, 8, 10, 89, 1000, 1000, 1234};
System.out.println(insertValueSearch(arr, 0, arr.length - 1, 1000));
}
5、插值查找的适用场景
标签:arr,数算,temp,16,插值,mid,查找,left,target 来源: https://blog.csdn.net/weixin_45729934/article/details/113773655