Algoritmo de pesquisa ------- pesquisa de interpolação

Pesquisa de interpolação

Então encontramos nosso último método de pesquisa, a pesquisa binária se tornará problemática se você procurar alguns números. Para um exemplo simples, temos 1, 2, 3, 4, 5, 6, 7 e pesquisamos 1 e descobriremos que irá pesquisar 3 vezes, Um pouco insatisfatório, então temos um método mais eficiente?

princípio

1. O algoritmo de busca de interpolação é semelhante à busca binária , a diferença é que a busca de interpolação começa a partir do meio adaptativo de cada vez .
2. A fórmula para encontrar o índice médio na metade da pesquisa, baixo representa o índice esquerdo e alto representa o índice direito.

Insira a descrição da imagem aqui

key é o valor que queremos encontrar findValue

3.int midlIndex = low + (high - low) * (key - arr [| ow]) / (arr [high] - arr [| ow])

O código correspondente torna-se

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

Exemplos e ideias

Encontre em uma matriz de 1-100

Ideias

No método tradicional, mid = 99/2 = 49, que é o 50º número para iniciar a pesquisa

Mas agora precisamos encontrar o valor se for 1.

Usando a pesquisa binária, precisamos recursar várias vezes para encontrar o número 1

Se estivermos usando o algoritmo de busca de interpolação, nosso mid = 0

Se a pesquisa for 100, então nosso mid = 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;
		}
	}
}

Precauções

1. Para tabelas de pesquisa com uma grande quantidade de dados e distribuição de palavras-chave relativamente uniforme , a pesquisa de interpolação é mais rápida.
2. No caso de distribuição desigual de palavras-chave , este método de acesso não é necessariamente melhor do que a metade da pesquisa , às vezes também é mais otimizado

Podemos comparar a matriz e os métodos de pesquisa nos algoritmos escritos em meus blogs anteriores e entenderemos

Acho que você gosta

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