Pesquisa de interpolação em Java
1. Introdução
Neste tutorial, vamos percorrer os algoritmos de pesquisa de interpolação e discutir seus prós e contras. Além disso, vamos implementá-lo em Java e falar sobre a complexidade do tempo do algoritmo.
2. Motivação
A pesquisa de interpolação é uma melhoria em relação abinary search adaptada para dados uniformemente distribuídos.
A pesquisa binária divide pela metade o espaço de pesquisa em cada etapa, independentemente da distribuição de dados, portanto, sua complexidade de tempo é sempreO(log(n)).
Por outro lado,interpolation search time complexity varies depending on the data distribution. É mais rápido do que a pesquisa binária de dados uniformemente distribuídos com a complexidade de tempo deO(log(log(n))). No entanto, no pior cenário, ele pode ter um desempenho tão ruim quantoO(n).
3. Pesquisa de interpolação
Semelhante à pesquisa binária, a pesquisa de interpolação só pode funcionar em uma matriz classificada. Ele coloca uma sonda em uma posição calculada em cada iteração. Se a sonda estiver no item que estamos procurando, a posição será retornada; caso contrário, o espaço de pesquisa será limitado ao lado direito ou esquerdo da sonda.
O cálculo da posição da sonda é a única diferença entre a pesquisa binária e a pesquisa de interpolação.
Na pesquisa binária, a posição da sonda é sempre o item mais intermediário do espaço de pesquisa restante.
Pelo contrário, a pesquisa de interpolação calcula a posição da sonda com base nesta fórmula:
Vamos dar uma olhada em cada um dos termos:
-
probe: a nova posição da sonda será atribuída a este parâmetro.
-
lowEnd: o índice do item mais à esquerda no espaço de pesquisa atual.
-
highEnd: o índice do item mais à direita no espaço de pesquisa atual.
-
data[]: a matriz que contém o espaço de pesquisa original.
-
item: o item que procuramos.
Para entender melhor como funciona a pesquisa de interpolação, vamos demonstrar com um exemplo.
Digamos que queremos encontrar a posição de 84 na matriz abaixo:
O comprimento da matriz é 8, então inicialmentehighEnd = 7 elowEnd = 0 (porque o índice da matriz começa em 0, não 1).
Na primeira etapa, a fórmula de posição da sonda resultará emprobe = 5:
Como 84 (oitem que estamos procurando) é maior que 73 (o item de posiçãoprobe atual), a próxima etapa abandonará o lado esquerdo da matriz atribuindolowEnd =probe + 1. Agora, o espaço de pesquisa consiste em apenas 84 e 101. A fórmula de posiçãoprobe definiráprobe = 6, que é exatamente o índice de 84:
Como o item que procurávamos foi encontrado, a posição 6 será retornada.
4. Implementação em Java
Agora que entendemos como o algoritmo funciona, vamos implementá-lo em Java.
Primeiro, inicializamoslowEnd ehighEnd:
int highEnd = (data.length - 1);
int lowEnd = 0;
A seguir, montamos um loop e a cada iteração, calculamos o novoprobe com base na fórmula mencionada. A condição de loop garante que não estejamos fora do espaço de pesquisa, comparandoitem adata[lowEnd]edata[highEnd]:
while (item >= data[lowEnd] && item <= data[highEnd] && lowEnd <= highEnd) {
int probe
= lowEnd + (highEnd - lowEnd) * (item - data[lowEnd]) / (data[highEnd] - data[lowEnd]);
}
Também verificamos se encontramos o item após cada nova atribuição deprobe.
Finalmente, ajustamoslowEnd ouhighEnd para diminuir o espaço de pesquisa em cada iteração:
public int interpolationSearch(int[] data, int item) {
int highEnd = (data.length - 1);
int lowEnd = 0;
while (item >= data[lowEnd] && item <= data[highEnd] && lowEnd <= highEnd) {
int probe
= lowEnd + (highEnd - lowEnd) * (item - data[lowEnd]) / (data[highEnd] - data[lowEnd]);
if (highEnd == lowEnd) {
if (data[lowEnd] == item) {
return lowEnd;
} else {
return -1;
}
}
if (data[probe] == item) {
return probe;
}
if (data[probe] < item) {
lowEnd = probe + 1;
} else {
highEnd = probe - 1;
}
}
return -1;
}
5. Conclusão
Neste artigo, exploramos a pesquisa de interpolação com um exemplo. Também o implementamos em Java.
Os exemplos mostrados neste tutorial estão disponíveisover on Github.