---
# System prepended metadata

title: "\n\t\tAnálise informal de algoritmos de buscas\n\t"
tags: [Lab_ICC_II]

---

---
tags: Lab_ICC_II
---
<center>
	<h3>
		Universidade de São Paulo (USP)<br>
		Instituto de Ciências Matemáticas e de Computação (ICMC)<br>        
	</h3>
	<h3>
		Bacharelado de Ciências de Computação<br>
		Disciplina: Laboratório de Introdução à Ciência da Computação II<br>
		Professor: Leonardo Pereira<br><br>
		Aluno: Guilherme Machado Rios (11222839)
	</h3>
	<h1>
		Análise informal de algoritmos de buscas
	</h1>
</center>

## Introdução

Serão feitas as análises de três algoritmos envolvendo busca em um vetor de inteiros previamente ordenado. O primeiro é uma simples busca sequencial, o segundo e terceiro uma busca binária, iterativa e recursiva, respectivamente.

## Qual é mais eficiente? Por quê?

Em um contexto genêrico (vetor gerado randomicamente) pode-se dizer que a busca binária, em suas duas implementações, é mais eficiente — mesmo que, em certos casos, haja a nececissadade de ordenação do vetor de entrada — dado que uma busca desse tipo trabalha com a ideia de ***divisão e conquista***. Procurando um elemento sempre ao meio de um vetor ordenado, o algoritmo conseque ***dividir*** esse vetor e, caso o elemento não se encontre no meio, ***conquistar***, analisando em qual metade esse elemento está, o subvetor do qual o procurado faz parte; com o mesmo se repetindo para esse subvetor, de forma iterativa ou recursiva.
Vale ressaltar que a busca binária implementada iterativamente, quando comparada a implementação recursiva, pode se mostrar mais efiente. O tratamento de memória é melhor naquela, pois nessa um espaço além é ocupado pelas chamadas recursivas que vão sendo empilhadas.

Concluindo, pressupondo a escolha de um bom algoritmo que garanta a ordenação do vetor no qual ocorrerá a busca, ***buscas binárias se mostram mais efientes, na média, para vetores significamente grandes***. Sendo assim, *buscas sequencias podem ser mais adequadas a contextos com vetores menores*.

## Em que caso(s) o algoritmo apresenta sua melhor performance?

1. *`sequential_search()`:* chave 8867 da entrada `4.in`, dado que essa é a chave mais próxima do ponto de partida da busca, o início do vetor;

2. *`iterative_bin_search()`:* a chave 218439197 da entrada `1.in`, dado que essa está mais próxima do início da lista de "pontos médios" no contexto de divisão e conquista, entre as listas de todas as entrada;

3. *`recursive_bin_search()`:* a chave 329090 da entrada `3.in`, seguindo a mesma lógica utilizada acima para a busca iterativa.

## Em que caso(s) (entrada) o algoritmo apresenta sua pior performance (pior caso)?
1. *`sequential_search()`:* chave 598893067 da entrada `4.in`, dado que essa é a chave mais distante do ponto de partida da busca, o início do vetor;

2. *`iterative_bin_search()`:* a chave 0 da entrada `4.in`, já que essa não está no vetor, o que culmina na execução do número máximo de iterações para esta função; além disso, esse é o maior vetor de todos nos quais a chave não é encontrada;

3. *`recursive_bin_search()`:* as chaves 34 e 623309823 da entrada `3.in`, seguindo a mesma lógica utilizada acima para a busca iterativa.