Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Presbiteriana Mackenzie Métodos de Pesquisa ou Busca Busca Linear e Busca Binária Profa. Ana Cristina dos Santos Faculdade de Computação e Informática Estrutura de Dados 2 1 Especificação do Problema • A tarefa de pesquisar ou buscar está entre as tarefas mais frequentemente encontradas no dia- a-dia. • Veremos algoritmos para o problema de recuperar informação a partir de uma massa grande de informação previamente armazenada 2 Busca Linear e Busca Binária Representação das informações • A informação geralmente é dividida em registros, onde cada registro possui uma chave para ser usada na pesquisa • Chave: componente de uma estrutura, ou de um registro de banco de dados, segundo o qual se realiza a busca • Objetivo: encontrar uma ou mais ocorrências de u registros com chaves iguais à chave de pesquisa, ocorrendo sucesso ou insucesso na pesquisa. • Conjunto de registros: chamado de tabela ou arquivos. 3 Busca Linear e Busca Binária Representação das informações • Tabelas: termo associado à entidades de vida curta, criadas na memória interna, durante a execução de um programa; • Arquivos: entidades de vida mais longa, armazenadas na memória externa. • O conjunto de elementos onde será efetuada a pesquisa, muitas vezes será representado através de um vetor ou lista, onde cada item apresenta uma estrutura de registro, contendo um campo que atua como chave para a pesquisa 4 Busca Linear e Busca Binária Especificação do Problema • Dado um conjunto com N elementos do mesmo tipo de dado armazenados em um vetor V, retornar em qual posição (índice do vetor) encontra-se o elemento de valor X, ou -1 caso o elemento não se encontre no vetor. 5 Busca Linear e Busca Binária 6 Visualização do Problema 3015201012 Vetor V = { 12, 10, 20, 15, 30 } N = 5 X = 15 Índice no vetor Vetor V Qual a posição do Elemento X em V ? 43210 Busca Linear e Busca Binária Métodos de Busca • Existe uma variedade de métodos de pesquisa. • A escolha do método mais adequado a uma determinada aplicação depende: – da quantidade de dados envolvidos e – do arquivo estar sujeito a inserções e retiradas constantes 7 Busca Linear e Busca Binária Métodos de Busca • Há dois métodos de busca classicamente utilizados: – Busca Linear – Busca Binária 8 Busca Linear e Busca Binária Busca Linear • Estratégia: – Percorrer o vetor da posição inicial até a final, comparando cada elemento com o elemento de busca – Quando encontrar o elemento, devolver a posição – Caso contrário, devolver que o elemento não foi encontrado 9 Busca Linear e Busca Binária Busca Linear 3015201012 Vetor V = { 12, 10, 20, 15, 30 } N = 5 X = 15 43210 i Índice no vetor Vetor V Variável para controlar a posição do elemento do vetor que deve ser comparado com X 10 Busca Linear e Busca Binária Método Busca Linear // Pesquisar de 0 a n – 1 public int buscaLinear (int [] v, int n, int x){ for (int i = 0; i < n; i++){ if (v[i] == x) return i; } return -1; //Não encontrou! } 11 Busca Linear e Busca Binária Método Busca Linear - Sobrecarga public int buscaLinear (int [] v, int x) { return buscaLinear (v, v.length, x); } 12 Busca Linear e Busca Binária Desempenho da Busca Linear Melhor Caso: A chave de pesquisa ou o elemento procurado é o primeiro. O algoritmo faz apenas uma comparação, logo complexidade constante: O (1) Pior Caso: O elemento procurado não está no vetor. O número de comparações é proporcional ao tamanho do vetor. Logo, O (n) 13 Busca Linear e Busca Binária Busca Binária • Estratégia: – Ordenar o Vetor – Encontrar a posição do meio – Comparar se o elemento do meio é menor, maior ou igual ao elemento de busca. • Se elemento foi encontrado, é o fim da busca • Senão, do resultado desta comparação, definir se a busca continuará: – Na primeira metade do vetor (inferior) – Na segunda metade do vetor (superior) – Repetir o processo até que todos os elementos tenham sido analisados 14 Busca Linear e Busca Binária Busca Binária 5040302010 10090807060 Vetor V = { 10,20,30,40,50,60,70,80,90,100 } N = 10 X = 70 Índice no vetor Vetor V 43210 98765 ini fim meio Posição inicial do vetor Variável para controlar a posição meio do vetor X > V[meio], então a busca continua na metade superior do vetor Variável para controlar a posição final do vetor 15 Busca Linear e Busca Binária Busca Binária 5040302010 10090807060 X = 70 43210 98765 ini fim meio ini fim meio ini fim meio ini fim meio Índice Vetor V A posição do meio é calculada pela seguinte expressão: Meio ← (ini+fim)/2 16 Busca Linear e Busca Binária Método de Busca Binária Iterativo public int buscaBinaria (int [] v, int n, int x){ int ini= 0, fim = n-1, meio; while (ini <= fim){ meio = (ini + fim) / 2; if (v[meio]==x) // Encontrou! return meio; else if (x > v[meio] ) // Busca na segunda metade ini = meio + 1; else // Busca na primeira metade fim = meio - 1; } return -1; //Não encontrou! } 17 Busca Linear e Busca Binária Método de Busca Binária Iterativo - Sobrecarga public int binSearch(int [] v, int x) { return binSearch(v,0,v.length-1,x); } 18 Busca Linear e Busca Binária Busca Binária Recursiva public int buscaBinaria(int [] v, int ini, int fim, int x){ if (ini > fim) return -1; //Não encontrou! int meio = (ini + fim) / 2; if (x == v[meio]) // Encontrou! return meio; else if (x > v[meio]) // Busca do lado direito return buscaBinaria(v, meio+1, fim, x); else // Busca do lado esquerdo return buscaBinaria(v, ini, meio-1, x); } 19 Busca Linear e Busca Binária A Classe Busca //Classe Busca public class Busca { // Vários métodos public int buscaLinear ( ... ) { ... } public int buscaBinaria ( ... ) { ... } } 20 Busca Linear e Busca Binária Comparação de Desempenho • Qual método de busca é melhor, para um vetor de tamanho N? – Podemos verificar que o custo da Busca Linear é proporcional ao tamanho do vetor, ou seja a N – Já o custo da busca binária é proporcional ao logaritmo na base 2 de N: log2 N 21 Busca Linear e Busca Binária Busca Binária: Pior Caso Ocorre quando o elemento procurado não pertence a lista Vamos mostrar que o desempenho será: Ο(log n) Para tanto, vamos considerar a instrução mais importante do algoritmo como sendo as comparações x < v[meio] e x > v[meio]. O valor procurado é comparado 2 vezes com o registro apontado pelo meio do vetor. Em seguida o processo é repetido com uma das sublistas. 22 Busca Linear e Busca Binária Busca Binária: Pior Caso Portanto, até aqui sabemos que o número de comparações é: T(n) = 2 + T(p), em que p = tamanho da sublista [sublista da esquerda] [sublista da direita] Meio Mas p = n/2, portanto, T(n) = 2 + T(n/2) Suponha n = 1, teremos T(n) = 2 Para n = 5, teremos: T(5) = 2 + T(2) = 2 + { 2 + T(1) } = 6 23 Busca Linear e Busca Binária Busca Binária: Pior Caso • Para calcular T(n), para qualquer n, é preciso encontrar uma fórmula direta, T(n), que não sejaRecorrente como o exemplo anterior. • Podemos encontrar a função que desejamos por observação: 24 Busca Linear e Busca Binária Busca Binária: Pior Caso n T(n) 1 2 + 0 = 2 2 2 + T(1) = 4 3 2 + T(1) = 4 4 2 + T(2) = 2 + 2 + T(1) = 6 5 2 + T(2) = 2 + 2 + T(1) = 6 6 2 + T(2) = 2 + 2 + T(1) = 6 7 2 + T(2) = 2 + 2 + T(1) = 6 8 2 + T(4) = 2 + 2 + T(2) = 2 +2 + 2 + T(1) = 8 .... 16 2 + T(8) = 10 .... 32 2 + T(16) = 12 25 Busca Linear e Busca Binária Busca Binária: Pior Caso • Os valores da função de complexidade muda quando n= 1, 2, 4, 8 , 16...., ou seja, os valores “especiais” são potências de 2: 20, 21, 22, 24... N T(n) 20 = 1 2 + 0 = 2 21 = 2 2 + 2 = 4 22 = 4 2 + 4 = 6 23 = 8 2 + 6 = 8 24 = 16 2 + 8 = 10 dobro do expoente 26 Busca Linear e Busca Binária Busca Binária: Pior Caso • Portanto T(n) = 2 + 2k, onde k é o expoente da potência de dois desses valores. • Mas k deve ser expresso em função de n. • Para tanto, 2k = n log2 2 k = log2 n k. log22 = log2n k = log2n 27 Busca Linear e Busca Binária Busca Binária: Pior Caso Então podemos dizer que k é k = log2n Logo, T(n) = 2 + 2 log2n, • desprezando as constantes aditivas e multiplicativas temos: T(n) = 2 + 2 log2n T(n) = O(log n) 28 Busca Linear e Busca Binária Exercício Fazer a pilha de execução para a Busca Binária com a entrada: ini=0, fim=5, x=22 e v={5,7,10,15,20,22} . 29 Busca Linear e Busca Binária Exercício buscaBin (V={5,7,10,15,20,22} , ini = 0 , fim = 5, x = 22 ) meio=2 meio = buscaBin(V={15,20,22} , ini = 3, fim = 5, x = 22 ) meio=4 meio = buscaBin(V={22} , ini = 5 , fim = 5, x = 22 ) meio=5 retorna 5 retorna 5 retorna 5 30 Busca Linear e Busca Binária Obrigada Ana Cristina dos Santos anacristina.santos@mackenzie.br 31 Busca Linear e Busca Binária
Compartilhar