Primeiro familiarizado com a pesquisa de matriz (pesquisa linear e pesquisa binária)

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.
Insira a descrição da imagem aqui
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.
Insira a descrição da imagem aqui
Pegue outro 8 para comparação, que está à esquerda de 8. Planeje novamente o escopo.
Insira a descrição da imagem aqui
7 é maior que 6, então está à direita de 6, continue a comparar.
Insira a descrição da imagem aqui
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.
Insira a descrição da imagem aqui
Então esquerda = MID + 1 é 10, neste momento, esquerda
direita, 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.

Acho que você gosta

Origin blog.csdn.net/weixin_52199109/article/details/112726928
Recomendado
Clasificación