Algoritmo de búsqueda ------- búsqueda de interpolación

Búsqueda de interpolación

Luego encontramos nuestro último método de búsqueda, la búsqueda binaria se volverá problemática si busca algunos números. Para un ejemplo simple, tenemos 1, 2, 3, 4, 5, 6, 7 y buscamos 1 y encontraremos que buscará 3 veces, un poco insatisfactorio, entonces, ¿tenemos un método más eficiente?

principio

1. El algoritmo de búsqueda de interpolación es similar a la búsqueda binaria , la diferencia es que la búsqueda de interpolación comienza desde el medio adaptativo cada vez .
2. La fórmula para encontrar el índice medio en la búsqueda media, bajo representa el índice izquierdo y alto representa el índice derecho.

Inserte la descripción de la imagen aquí

la clave es el valor que queremos encontrar findValue

3.int midlIndex = bajo + (alto - bajo) * (clave - arr [| ow]) / (arr [alto] - arr [| ow])

El código correspondiente se convierte en

int mid = left + (right - left) * (findValue-arr[left])/(arr[right] - arr[left])

Ejemplos e ideas

Encuentra en una matriz de 1-100

Ideas

En el método tradicional, mid = 99/2 = 49, que es el número 50 para comenzar a buscar

Pero ahora necesitamos encontrar el valor si es 1.

Usando la búsqueda binaria, necesitamos recurrir varias veces para encontrar el número 1

Si usamos el algoritmo de búsqueda de interpolación, nuestro mid = 0

Si la búsqueda es 100, entonces nuestro medio = 0 + 99 * 99/99 = 99

Código

//插值查找
//@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;
		}
	}
}

Precauciones

1. Para tablas de búsqueda con una gran cantidad de datos y una distribución de palabras clave relativamente uniforme , la búsqueda de interpolación es más rápida.
2. En el caso de una distribución desigual de palabras clave , este método de acceso no es necesariamente mejor que la mitad de la búsqueda , a veces también está más optimizado

Podemos comparar la matriz y los métodos de búsqueda en los algoritmos escritos en mis blogs anteriores, y entenderemos

Supongo que te gusta

Origin blog.csdn.net/qq_22155255/article/details/112852834
Recomendado
Clasificación