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.
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