Vamos primeiro entender o que é lookup.
Uh, bem, não há nada para entender,
mas descobrir a posição ou existência de um elemento na matriz.
É isso, não mais. Aprenda sobre o algoritmo de pesquisa diretamente.
Pesquisa linear
A pesquisa linear é um pouco diferente da pesquisa binária.
Os elementos da matriz podem estar desordenados, ou seja, não são armazenados em ordem. Este método é muito simples, começando pelo primeiro elemento, pesquisando para trás e comparando. É isso aí. Use loops e compare por sua vez.
Olhe o código.
#include <stdio.h>
int main(void)
{
int arr[] = {
5,4,6,8,7,9,10,2,3,1 };
int len = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
int i;
int n;
scanf("%d", &n);//输入要查找的元素
for (i = 0; i < len; i++)
{
if (arr[i] == n)
{
printf("%d的下标是%d\n", n, i);
break;//找到后就直接跳出循环
}
}
if (i == len)//因为如果数组元素全部遍历一遍后,都没有i++等于len后,便跳出循环再判断说不存在。
printf("Don't have number %d\n", n);
return 0;
}
A pesquisa linear é muito simples, mas se os elementos do array forem grandes, ela é mais problemática.
Busca binária
Vamos dar uma olhada na busca binária, que é a dicotomia que aprendi na matemática do ensino médio.O princípio é bastante simples. Mas ele só pode pesquisar a matriz classificada, que tem algumas limitações em comparação com a pesquisa linear.
Ao comparar o tamanho dos dados intermediários da matriz e os dados do padrão, pode-se avaliar se está à esquerda ou à direita dos dados intermediários, o que reduz instantaneamente a quantidade de cálculo pela metade. Em seguida, continue comparando dessa forma até que seja encontrado ou não encontrado.
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int arr[] = {
1,2,3,4,5,6,7,8,9,10};
int len = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = len - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > n)
{
right = mid-1;
}
else if (arr[mid] < n)
{
left = mid+1;
}
else
{
break;
}
}
if (left <= right)
printf("%d的下标是%d\n", n, mid);
else
printf("DON't have number %d\n", n);
return 0;
}
/*int i = 1;
Observe a imagem para fácil compreensão e memória.
Observe o código, o elemento do meio é 5, que está à direita de 5 e, em seguida, remova os elementos desnecessários fora do intervalo de comparação e, em seguida, reinicie o elemento do meio para comparação.
Pegue outro 8 para comparação, que está à esquerda de 8. Planeje novamente o escopo.
7 é maior que 6, então está à direita de 6, continue a comparar.
Neste momento, esquerda == direita, de acordo com a condição do loop while, você ainda pode entrar no loop, mas arr [mid]7. Isso significa que o elemento foi encontrado, ele vai quebrar; pular para fora do loop e, em seguida, julgar que a condição satisfaz left <= right, significa que ainda é válido e será gerado.
Caso contrário, se o elemento de destino for 11, será sempre o lado direito do elemento do meio.
Então esquerda = MID + 1 é 10, neste momento, esquerdadireita, o loop ainda não acabou, desta vez, mid é igual a 10 ou menor que 11, left = 10 + 1, e neste momento, left> right, se a condição não for atendida, o loop termina, e então julgar, se a condição não for atendida, insira else,, O que significa que 11 não está na matriz.
Quando escrevi pesquisa binária pela primeira vez, não escrevi
left = mid+1;
right = mid-1;
Mas escreva
right = mid;
left = mid;
Eu pensei que era quase o mesmo, uh, na verdade é quase o mesmo, mas quando os dados do alvo não estiverem no array, julgue com antecedência. Se você alterar as condições diretamente na forma do código acima, fará com que a esquerda seja sempre 9, a direita sempre seja 10 e a média sempre seja 9, o que não pode sair do loop, resultando em tal loop infinito.
Lembre-se de escrever a pesquisa binária.
Essas duas inspeções, é tudo por enquanto.
Se você tiver alguma dúvida, dê-me alguns conselhos.
Obrigado por assistir.