Pesquisa de interpolação em Java

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

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:

image

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:

image

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:

image

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:

image

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.