보간 조회
그런 다음 마지막 검색 방법을 찾았습니다. 숫자를 찾아 보면 이진 검색이 번거로울 것입니다. 간단한 예를 들어 1, 2, 3, 4, 5, 6, 7이 있고 1을 검색하면 3 번 검색 할 것입니다. 약간 불만족 스럽습니다. 그렇다면 더 효율적인 방법이 있습니까?
원리
1. 보간 검색 알고리즘은 이진 검색과 유사하지만 , 차이점은 보간 검색이 매번 적응 형 중간부터 시작 된다는 것 입니다.
2. 절반 검색에서 중간 지수를 찾는 공식, 낮음은 왼쪽 지수, 높음은 오른쪽 지수를 나타냅니다.
key는 findValue 를 찾고자하는 값입니다.
3.int midlIndex = 낮음 + (높음-낮음) * (키-arr [| ow]) / (arr [high]-arr [| ow])
해당 코드는
int mid = left + (right - left) * (findValue-arr[left])/(arr[right] - arr[left])
예와 아이디어
1-100의 배열에서 찾기
아이디어
기존 방법에서는 mid = 99 / 2 = 49로 검색을 시작하는 50 번째 숫자입니다.
그러나 이제 우리는 1이면 값을 찾아야합니다.
이진 검색을 사용하여 숫자 1을 찾기 위해 여러 번 반복해야합니다.
보간 검색 알고리즘을 사용하는 경우 mid = 0
검색이 100이면 mid = 0 + 99 * 99 / 99 = 99
암호
//插值查找
//@author 王
//2021年1月19日21:14:32
public class InsertValueSearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i+1;
}
int index = insertValueSearch(arr, 0, arr.length-1,3);
System.out.println(index);
}
//插值查找算法
/**
*
* @param arr 数组
* @param left 左边索引
* @param right 右边索引
* @param findValue 需要找的值
* @return
*/
public static int insertValueSearch(int[] arr,int left,int right,int findValue) {
System.out.println("统计查找次数");
if(left > right || findValue < arr[0] || findValue > arr[arr.length-1]){
return -1;
}
//求出mid
int mid = left + (right - left) * (findValue - arr[left])/(arr[right] - arr[left]);
int midValue = arr[mid];
if(findValue > midValue){
//向右边递归
return insertValueSearch(arr, mid+1, right, findValue);
}else if(findValue < midValue){
//向左边查找
return insertValueSearch(arr, left, mid - 1, findValue);
}else{
return mid;
}
}
}
지침
1. 룩업 테이블 다량 의 데이터 와 비교적 균일 키워드 분포 보간 검색이 빠르다.
2. 의 경우 불균일 키워드 분포 ,이 접근 방법은 반드시 반쪽 검색 이상 , 때때로 더 최적화되어
이전 블로그에서 작성한 알고리즘의 배열 및 검색 방법을 비교할 수 있습니다.