PESQUISA
Nos dias de hoje, o acesso rápido a informação pode ser determinante para o sucesso do aplicativo. Por isso o algoritmo de pesquisa é tão importante quanto a estrutura de armazenamento e o algoritmo de ordenação.
PESQUISA SEQUENCIAL
Vamos falar do mecanismo de pesquisa mais trivial que existe, a Pesquisa Linear ou Sequencial.
Esse algoritmo consiste em percorrer cada um dos elementos da nossa estrutura até encontrar o elemento desejado. Sua eficiência é inversamente proporcional a quantidade de elementos que tivermos que percorrer. Na melhor hipótese o elemento desejado será o primeiro e na pior hipótese o elemento desejado será o último.
Podemos melhorar significativamente o desempenho se os elementos estiverem ordenados. Por isso é tão importante escolher a estrutura certa assim como aplicar algoritmos de ordenação.
Por exemplo, se queremos encontrar um nome específico na nossa agenda telefônica, será muito mais rápido se a agenda estiver organizada por ordem alfabética. Assim podemos pular alguns nome que temos certeza que não irão atender ao critério de pesquisa.
public class PesquisaLinear {
public static int pesquisar(String arr[], String argumento) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == argumento) {
return i;
}
}
return -1;
}
public static void main(String args[]) {
String arr[] = { "A", "B", "C", "D" };
System.out.println(pesquisar(arr, "C"));
}
}
PESQUISA BINÁRIA
A pesquisa binária utiliza da técnica "dividir para conquisar". Consiste em dividir os elementos ao meio, em seguida é verificado se o elemento desejado é maior ou menor que o elemento central. Caso seja maior, então o elemento desejado obrigatoriamente deve estar do lado direito da divisão e caso seja menor então obrigatoriamente deve estar do lado esquerdo. Esse processo de divisão e verificação é repetido até encontrar o elemento.
Repare para que esse algoritmo funcione, os elementos devem estar obrigatoriamente ordenados, caso contrário pode não funcionar.
public class PesquisaBinaria {
public static int pesquisar(int arr[], int l, int r, int x) {
if (r >= l) {
int mid = l + (r - l) / 2;
if (arr[mid] == x)
return mid;
if (arr[mid] > x)
return pesquisar(arr, l, mid - 1, x);
return pesquisar(arr, mid + 1, r, x);
}
return -1;
}
public static void main(String args[]) {
int arr[] = { 2, 3, 4, 10, 40 };
int n = arr.length;
int x = 10;
int posicao = pesquisar(arr, 0, n - 1, x);
if (posicao == -1)
System.out.println("Elemento não encontrado");
else
System.out.println("Elemento encontrado na posição " + posicao);
}
}
PESQUISA POR INTERPOLAÇÃO
Este algoritmo de pesquisa, assim como a busca binária, tem como premissa que os elementos esteja previamente ordenados, além disso o algoritmo é semelhante a busca binária, eles diferem na forma como os elementos são divididos. Enquanto a busca binária está sempre dividindo ao meio, a busca por interpolação divide os elementos com base na fórmula abaixo:
pos = lo + [ (x-arr[lo])*(hi-lo) / (arr[hi]-arr[Lo]) ]
public class PesquisaInterpolacao {
public static int pesquisar(int[] arr, int x) {
int lo = 0, hi = (arr.length - 1);
while (lo <= hi && x >= arr[lo] && x <= arr[hi]) {
if (lo == hi) {
if (arr[lo] == x)
return lo;
return -1;
}
int pos = lo + (((hi - lo) / (arr[hi] - arr[lo])) * (x - arr[lo]));
if (arr[pos] == x)
return pos;
if (arr[pos] < x)
lo = pos + 1;
else
hi = pos - 1;
}
return -1;
}
public static void main(String[] args) {
int x = 18;
int arr[] = new int[] { 10, 12, 13, 16, 18, 19, 20, 21, 22, 23, 24, 33, 35, 42, 47 };
int posicao = pesquisar(arr, x);
if (posicao != -1)
System.out.println("Elemento encontrado na posição " + posicao);
else
System.out.println("Elemento não encontrado.");
}
}

Nenhum comentário:
Postar um comentário