검색 알고리즘 ------- 보간 검색

보간 조회

그런 다음 마지막 검색 방법을 찾았습니다. 숫자를 찾아 보면 이진 검색이 번거로울 것입니다. 간단한 예를 들어 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. 의 경우 불균일 키워드 분포 ,이 접근 방법은 반드시 반쪽 검색 이상 , 때때로 더 최적화되어

이전 블로그에서 작성한 알고리즘의 배열 및 검색 방법을 비교할 수 있습니다.

추천

출처blog.csdn.net/qq_22155255/article/details/112852834