Programação de Computadores II. Cap. 17 Busca

Documentos relacionados
INF1007: Programação 2 7 Busca em Vetores. 01/04/2014 (c) Dept. Informática - PUC-Rio 1

Algoritmos de Busca em Vetores

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Programação II. Busca em Vetor (search) Bruno Feijó Dept. de Informática, PUC-Rio

Projeto e Análise de Algoritmos

INF 1007 Programação II

Programação de Computadores II. Cap. 16 Ordenação

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

DAINF - Departamento de Informática

Programação de Computadores II. Cap. 5 Vetores

Linguagem C: Ordenação

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

INF 1007 Programação II

Módulo 16 - Ordenação

INF1005: Programação 1. Vetores. 02/05/10 (c) Paula Rodrigues 1

Programação de Computadores II. Cap. 4 Funções

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Cap. 3 Entrada e Saída e Controle de Fluxo

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

/* percorreu todo o vetor e não encontrou elemento */ return -1;

MÉTODOS DE PESQUISA DE DADOS EM MEMÓRIA PRIMÁRIA. Material da Prof. Ana Eliza

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Árvore B. Uma Árvore B de ordem m éumaárvore,talque: Cada nó contém no máximo m

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Pesquisa Linear. Adriano J. Holanda 15/3/2016

Árvore Binária de Busca. Prof. César Melo

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Fontes Bibliográficas. Listas Circulares. Função Imprime

Tópicos Cap. 3 Entrada e Saída e Controle de Fluxo Livro printf e scanf if e? while for switch break continue Entrada e Saída Entrada e Saída

INF 1620 P2-14/10/05 Questão 1 Nome:

Referências. Programação de Computadores II. Cap. 6 Matrizes. Tópicos. Alocação Estática versus Dinâmica. Alocação Estática versus Dinâmica

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

INF1007 Programação 2 9 Pilhas. (c) Dept. Informática - PUC-Rio 1

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Classificação e Pesquisa

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

ÁRVORE BINÁRIA DE BUSCA

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO

Módulo 16 - Ordenação. Referências

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Árvores Binárias de Busca (ABB) 18/11

Módulo 3 Controle de Fluxo

INF 1010 Estruturas de Dados Avançadas

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

Linguagem C: Árvores Binarias

Árvores binárias de busca

INF 1007 Programação II

INF 1010 Estruturas de Dados Avançadas

INF 1620 P3-02/07/02 Questão 1 Nome:

Estruturas de Dados Filas

Módulo 10 Listas Encadeadas

INF 1010 Estruturas de Dados Avançadas

Módulo 18 - Tabelas de Dispersão. Referências

4. Algoritmos de Busca em Vetores

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Busca. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Árvores Binárias de Busca (ABB) 18/11

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Carlos Eduardo Batista. Centro de Informática - UFPB

Análise e Complexidade de Algoritmos

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados I

Métodos de Pesquisa em Memória Primária

Capacitação em Linguagem C Parte 2

Árvores Binárias de Busca

UNIVERSIDADE DA BEIRA INTERIOR

Algoritmos de pesquisa

Programação de Computadores II. Cap. 9 Tipos Abstratos de Dados (TAD)

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

UNIVERSIDADE DA BEIRA INTERIOR

Programação de Computadores II. Recursividade

Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

INF 1007 Programação II

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

Estruturas de Dados. Módulo 6 Matrizes. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Módulo 14 - Estruturas genéricas

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

Árvores binárias de busca

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

Estruturas de Repetição

Busca. Pesquisa sequencial

Carlos Eduardo Batista. Centro de Informática - UFPB

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Linguagem C: Listas Encadeadas

Transcrição:

Programação de Computadores II Cap. 17 Busca Livro: Waldemar Celes, Renato Cerqueira, José Lucas Rangel. Introdução a Estruturas de Dados, Editora Campus (2004) Slides adaptados dos originais dos profs.: Marco Antonio Casanova e Marcelo Gattass (PUC-Rio) 1

Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 17 Busca 2

Tópicos Busca em vetor Busca linear Busca binária 3

Busca em Vetor Busca em vetor: entrada: vetor vet com n elementos elemento elem saída: n se o elemento elem ocorre em vet[n] -1 se o elemento não se encontra no vetor 4

Busca Linear em Vetor percorra o vetor vet, elemento a elemento, verificando se elem é igual a um dos elementos de vet int busca (int n, int* vet, int elem) { int i; for (i=0; i<n; i++) { if (elem == vet[i]) return i; /* encontrou */ /* não encontrou */ return -1; 5

Análise da Busca Linear em Vetor pior caso: n comparações, onde n representa o número de elementos do vetor desempenho computacional varia linearmente em relação ao tamanho do problema (algoritmo de busca linear) complexidade: O(n) caso médio: n/2 comparações desempenho computacional continua variando linearmente em relação ao tamanho do problema complexidade: O(n) 6

Busca Linear em Vetor Ordenado 0 1 1 1 2 3 4 5 7 8 int busca_ord (int n, int* vet, int elem) { int i; for (i=0; i<n; i++) { if (elem == vet[i]) return i; /* encontrou */ else if (elem < vet[i]) return -1;/* interrompe busca */ 6 /* não encontrou */ return -1; 7

Análise da Busca Linear em Vetor Ordenado caso o elemento procurado não pertença ao vetor, a busca linear com vetor ordenado apresenta um desempenho ligeiramente superior à busca linear pior caso: algoritmo continua sendo linear complexidade: O(n) 8

Busca Binária em Vetor Ordenado entrada: vetor vet com n elementos, ordenado elemento elem saída: n se o elemento elem ocorre em vet[n] -1 se o elemento não se encontra no vetor procedimento: compare elem com o elemento do meio de vet se elem for menor, pesquise na primeira metade do vetor se elem for maior, pesquise na segunda parte do vetor se for igual, retorne a posição continue o procedimento, subdividindo a parte de interesse, até encontrar o elemento ou chegar a uma parte do vetor com tamanho 0 9

int busca_bin (int n, int* vet, int elem) { /* no início consideramos todo o vetor */ int ini = 0; int fim = n-1; /* enquanto a parte restante for maior que zero */ while (ini <= fim) { int meio = (ini + fim) / 2; if (elem < vet[meio]) fim = meio 1; /* ajusta posição final */ else if (elem > vet[meio]) ini = meio + 1; /* ajusta posição inicial */ else return meio; /* elemento encontrado */ /* não encontrou: restou parte de tamanho zero */ return -1; 10

Análise da Busca em Vetor Ordenado pior caso: O(log n) elemento não ocorre no vetor 2 comparações são realizadas a cada ciclo a cada repetição, a parte considerada na busca é dividida à metade logo, no pior caso, são necessárias log n repetições Repetição 1 2 3... log n Tamanho do problema n n/2 n/4... 1 11

Diferença entre n e log(n) tamanho 10 60 600 3 600 86 400 2 592 000 946 080 000 94 608 000 000 O(n) 10 seg 1 min 10 min 1 h 1 dia 1 mês 1 ano 100 anos O(log(n)) 3 6 9 12 16 21 30 36 12

Busca binária em Vetor prós: dados armazenados em vetor, de forma ordenada bom desempenho computacional para pesquisa contra: inadequado quando inserções e remoções são freqüentes exige re-arrumar o vetor para abrir espaço uma inserção exige re-arrumar o vetor após uma remoção 13

Exercício Considere um tipo que representa um funcionário de uma empresa, definido pela estrutura a seguir: struct funcionario { char nome[81]; /* nome do funcionário */ float valor_hora; /* valor da hora de trabalho em Reais */ int horas_mes; /* horas trabalhadas em um mês */ ; typedef struct funcionario Funcionario; Escreva uma função que faça uma busca binária em um vetor de ponteiros para o tipo Funcionario, cujos elementos estão em ordem alfabética dos nomes dos funcionários. Essa função deve receber como parâmetros o número de funcionários, o vetor e o nome do funcionário que se deseja buscar, e deve ter como valor de retorno um ponteiro para o registro do funcionário procurado. Se não houver um funcionário com o nome procurado, a função deve retornar NULL. Sua função deve ter o seguinte cabeçalho: Funcionario* busca (int n, Funcionario** v, char* nome); 14

Funcionario* busca (int n, Funcionario** v, char* nome) { /* no início consideramos todo o vetor */ int ini = 0; int fim = n-1; /* enquanto a parte restante for maior que zero */ while (ini <= fim) { int meio = (ini + fim) / 2; switch (strcmp(nome, v[meio]->nome)) { case -1: fim = meio 1; /* ajusta posição final */ break; case 1: ini = meio + 1; /* ajusta posição inicial */ break; case 0: return v[meio]; /* elemento encontrado */ /* não encontrou: restou parte de tamanho zero */ return NULL; 15

Busca linear em vetor: Resumo percorra o vetor, elemento a elemento, verificando se o elemento de interesse é igual a um dos elementos do vetor Busca binária: compare elem com o elemento do meio de vet se elem for menor, pesquise na primeira metade do vetor se elem for maior, pesquise na segunda parte do vetor se for igual, retorne a posição continue o procedimento, subdividindo a parte de interesse, até encontrar o elemento ou chegar a uma parte do vetor com tamanho 0 16