Duvida no aprendizado. Algoritmo de busca linear + tecnica sentinela.
Boa tarde a todos, espero que estejam bem.
Para contextualizar, estou aprendendo o básico de C (C por gosto mesmo e também por ter ouvido falar que é um pouco mais complexa, já que é de baixo nível. Minha lógica não é tão boa então pensei que poderia me auxiliar com essa questão).
No pdf que estou utilizando, aborda um pouco sobre alguns tipos de algoritmos (que também pretendo estudar, junto de estrutura de dados) como -até o momento pelo menos- busca linear e binária.
Vendo sobre busca linear, foi mencionado no material a técnica sentinela, alegando que pode melhorar o desempenho de um algoritmo de busca linear padrão. Mas ao tentar implementar (em um pequeno exercício proposto) não aparenta ser realmente ser mais eficiente. No material, a eficiência melhorada é justificada por possuir menos verificações do que sem a técnica. Aí gostaria de saber: realmente ajuda e eu não soube implementar com eficiência ou são casos específicos que realmente melhoram ?
Informando que ainda não vi nada sobre ponteiros e nem tenho noção sobre.
A seguir o enunciado e os códigos:
Exercício 5.28. Codifique a função definida a seguir:
posicao(x,L) = i se ∃ i tal que x= L[i]
−1 caso contrário
Exercício 5.29. Em cada iteração do laço for, na função pertence(), são realizadas duas comparações: i<n e x == L[i]. Podemos reduzir esse número pela
metade se empregarmos uma técnica, denominada sentinela, que consiste
em deixar uma posição livre no final do vetor e, antes de iniciar a busca,
armazenar nela o elemento procurado. Então, podemos percorrer o vetor
enquanto tivermos x≠L[i]. Quando o laço parar, se tivermos i<n significa que
o elemento foi encontrado; caso contrário, o laço parou por ter encontrado a
sentinela que foi posicionada no final do vetor e, portanto, ocorreu fracasso.
Implemente uma função de busca linear usando essa técnica.
Exercício 5.30. Dados a lista de convidados de uma festa15 e o nome de uma
pessoa, determinar se essa pessoa é ou não convidada da festa. Codifique um
programa completo para resolver esse problema. Crie um procedimento para
fazer a entrada da lista de convidados e adapte a função pertence(), definida
anteriormente, para verificar se o nome consta ou não da lista.
COM A TÉCNICA SENTINELA
//x => valor a ser procurado
//width => tamanho do vetor
void posicao(int x, int L[], int width){
L[width-1] = x;
int i = 0;
while(L[i] != x){
i++;
}
if(L[i] == x && i < width-1) printf("X pertence ao vetor \n");
else printf("X nao pertence ao vetor \n");
int main(void) {
int L[3] = {5,1};
posicao(5, L, 3);
}
SEM A TÉCNICA
int posicao(int x, int L[], int width){
for(int i = 0; i < width; i++){
if(x == L[i]) return i;
}
return -1;
}
int main(void) {
int L[2] = {1,3};
int verifica = posicao(1, L, 2);
printf("%d \n", verifica);
printf("%d \n", L[verifica]);
}
Desde já muito obrigado a todos que tentarem ajudar-me. Deus abençoe a todos.