3. Vectores: Algoritmos de Pesquisa. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006)

Documentos relacionados
Algoritmos e Estruturas de Dados 2005/2006. Algoritmo: conjunto claramente especificado de instruções a seguir para resolver um problema

PROGRAMAÇÃO DE MICROPROCESSADORES 2007 / 2008

5. Análise de Complexidade de Algoritmos. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2003/2004) Luís Paulo Reis (versão 2005/2006)

Linguagens de Programação I

Linguagem C++ Estruturas de controle Parte II Estruturas de repetição

Algoritmos de Pesquisa e Ordenação em Vectores

Linguagem de Programação I. Aula 08 Linguagem C: Arrays

Ordenação de Vectores

Programação: Vetores

Linguagem de Programação I. Aula 10 Funções

Overloading de Operadores

Estruturas de repetição

Aula 11. Prof. Laura Silva de Assis. Engenharia da Computação. CEFET/RJ - Centro Federal de Educação Tecnológica Celso Suckow da Fonseca

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

UNIVERSIDADE LUSÓFONA DE HUMANIDADES E TECNOLOGIAS 2º Semestre 2013/2014

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

Algoritmos de pesquisa

INTRODUÇÃO À PROGRAMAÇÃO

Algoritmos e Estruturas de Dados I (DCC/003) Variáveis Indexadas. Aula Tópico 6 Variáveis Indexadas

1. Selecione a Estrutura de Dados que melhor representa os diretórios ou pastas de arquivos do computador.

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

Análise de Algoritmos

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

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

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Estruturas de dados e algoritmos fundamentais

3. Linguagem de Programação C

#include <stdio.h> main() { int i; // Cabeçalho for (i = 1; i <=20; i++) putchar( * ); putchar( \n ); puts( Numeros entre 1 e 5 );

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Aula 18 Algoritmos básicos de busca e classificação

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

Tipos de Dados Abstractos Estruturas Lineares Listas

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Objectivos. Iniciar a programação de funções. Estudar a chamada de funções. Estudar a forma como são executadas as funções

Conhecendo a Linguagem de Programação C

Introdução à Programação

Programação Orientada a Objetos para Redes de Computadores

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2008/2009

Algoritmos e Programação

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

//conteúdo do arquivo Matriz.h class Matriz { private: int *elementos; int numerodelinhas; int numerodecolunas; void setnumerodelinhas(int); void

ESTRUTURA DE DADOS (TCC )

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 7 Arrays. Arrays

Programação estruturada

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Linguagem de Programação

Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Ministrado por: Prof. André Amarante

Linguagem de Programação III

Diagramas Sintáticos

Ordenação. Prof. Túlio A. M. Toffolo Prof. Marco Antonio M. Carvalho BCC402 Aula 04 Algoritmos e Programação Avançada

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

DEM-Sec.Sistemas Tipos Abstractos de Informação 2006 / Programação

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2009/2010

AED2 - Aula 11 Problema da separação e quicksort

Busca em Arranjos. Busca em arranjos. Busca em arranjos. Programação de Computadores. Busca em Arranjos

6. Pesquisa e Ordenação

Métodos de Monte Carlo

Aula 18: Vetores Introdução a Programação Túlio Toffolo & Puca Huachi

Controlo de Execução. K&R: Capitulo 3

Estrutura de Dados Básica

Programação em C++: Introdução

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

Aula 21 - Algoritmos e Funções Recursivas

Revisão C++ - Parte 1

C++ - Funções. Forma geral das funções C++

Redefinição de Operadores

Introdução à Programação em C (I)

Linguagens de Programação

Introdução à Programação Aula 09. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Introdução à Programação

12. SOBRECARGA DE OPERADOR

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Tabelas Hash. Prof. Túlio Toffolo BCC202 Aulas 23 e 24 Algoritmos e Estruturas de Dados I

Linguagem e Técnicas de Programação

Introdução à Programação em C

Puca Huachi Vaz Penna / José Américo T. Messias

Exercícios... Capítulo 15. if62c. prof. Robinson Vida Noronha. Monday, March 23, 15

Programação científica C++

Revisão: Tipo Abstrato de Dados Recursividade

Pacotes Manual de referência

Introdução à Programação em C (I)

Questão 1 Analise o trecho do código abaixo, escrito na linguagem C#:

Recursão David Déharbe

Análise de complexidade

Linguagem de Programação

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

Ponteiros. podem aumentar/diminuir de tamanho como listas encadeadas, árvores, etc. memória. sua vez armazena um valor

Conceitos Básicos da Linguagem C++ Prof. Leonardo Barreto Campos 1

Programação Orientada a Objetos para Redes de Computadores

Objectivos. João Sousa Miguel Pedro Silva

Algoritmos e Estruturas de dados

CMP Técnicas de Programação 2 a Lista de Exercícios - Passagem de parâmetros por referência e ponteiros Max Gontijo de Oliveira

Sintaxe da linguagem Java

Complexidade de algoritmos Notação Big-O

Sub Rotinas. Estrutura de Dados. Prof. Kleber Rezende

Transcrição:

3. Vectores: Algoritmos de Pesquisa João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006) FEUP - MIEEC Prog2-2006/2007 Introdução Algoritmo: conjunto claramente especificado de instruções a seguir para resolver um problema noção de algoritmo muito próxima da noção de programa (imperativo) o mesmo algoritmo pode ser "implementado" por muitos programas de computador diferentes o mesmo problema pode ser resolvido por muitos algoritmos diferentes Descrição de algoritmos: em linguagem natural, pseudo-código, numa linguagem de programação, etc. 2 1

Pesquisa Sequencial Problema (pesquisa de valor em array): Verificar se um valor existe num array e, no caso de existir, indicar a sua posição. Possíveis variantes para o caso de arrays com valores repetidos: (a) indicar a posição da primeira ocorrência (b) indicar a posição da última ocorrência (c) indicar a posição de uma ocorrência qualquer 3 Pesquisa Sequencial Algoritmo (pesquisa sequencial): Percorrer sequencialmente todas as posições do array, da primeira para a última (a) ou da última para a primeira (b), até encontrar o valor pretendido ou chegar ao fim do array (a) caso se pretenda saber a posição da primeira ocorrência (b) caso se pretenda saber a posição da última ocorrência Adequado para arrays não ordenados ou pequenos 4 2

Implementação Pesquisa Sequencial em C++ /* Procura um valor x num array v de n inteiros (n>=0). Retorna o índice da primeira ocorrência de x em v, se encontrar; senão, retorna -1. */ int SequentialSearch(const int v[], int n, int x) for (int i = 0; i < n; i++) if (v[i] == x) return i; // encontrou return -1; // não encontrou 5 Exemplo de aplicação: totoloto // Programa para gerar aleatoriamente uma aposta do totoloto #include <iostream.h> #include <stdlib.h> #include <time.h> // para usar rand() e srand() // para usar time() // Constantes const int TAMANHO_APOSTA = 6; const int MAIOR_NUMERO = 49; // Gera inteiro aleatório entre a e b int rand_between(int a, int b) return (rand() % (b - a + 1)) + a; // Nota: rand() gera um inteiro entre 0 e RAND_MAX Sugestão: começar a ler o programa do fim para o princípio! 6 3

Exemplo de aplicação: totoloto (cont.) // Verifica se existe o valor x nas primeiras n posições // do array v // (inline: explicado adiante) inline bool existe(int x, const int a[], int n) return SequentialSearch(a, n, x)!= -1; // Preenche a aposta ap com valores aleatórios sem repetições void geraaposta(int ap[]) for (int i = 0; i <= TAMANHO_APOSTA - 1; i++) do ap[i] = rand_between(1, MAIOR_NUMERO); while ( existe(ap[i], ap, i) ); 7 Exemplo de aplicação: totoloto (concl.) // Imprime a aposta ap void imprimeaposta(const int ap[]) cout << "A aposta gerada é: "; for (int i = 0; i <= TAMANHO_APOSTA - 1; i++) cout << ap[i] << ' '; cout << '\n'; main() int aposta[tamanho_aposta]; srand(time(0)); /* Inicializa gerador de numeros pseudoaleatórios com valor diferente de cada vez que o programa corre */ geraaposta(aposta); imprimeaposta(aposta); return 0; 8 4

Nota sobre funções inline em C++ Qualificador inline antes do nome do tipo retornado por uma função: "aconselha" o compilador a gerar uma cópia do código da função no lugar em que é chamada Evita o peso do mecanismo de chamada de funções Exemplo: estando definida uma função inline int max(int a, int b) return a > b? a : b; o compilador pode converter uma chamada do género x = max(z, y); em algo do género: x = z > y? z : y; Usar só com funções pequenas, porque o código da função é replicado em todos os sítios em que a função é chamada! Dispensa uso de macros! 9 Nomes de funções sobrecarregados (overloaded) Podem-se definir várias funções com o mesmo nome, desde que as suas listas de argumentos sejam suficientemente diferentes (em número ou tipo) para que se possa determinar a que função se refere cada chamada Diz-se que o nome está sobrecarregado ou "overloaded" Não basta que as funções difiram no tipo de retorno // Protótipos double abs(double); int abs(int); double abs(double x, double y); // sqrt(sqr(x)+sqr(y)) // Chamadas abs(1); // chama abs(int); abs(1.0); // chama abs(double); abs(2, 3.0); // chama abs(double, double); 10 5

Templates de funções Um template de funções define uma família ilimitada de funções com o mesmo nome (overloaded), que só diferem em nomes de tipos (parâmetros da definição) Sintaxe: Preceder cabeçalho da função da palavra chave template seguida da lista de parâmetros formais entre < >. Cada parâmetro é precedido da palavra chave class (no sentido de "tipo de dados"). O compilador gera funções individuais de acordo com as chamadas efectuadas (instanciando os parâmetros do padrão de acordo com os tipos dos argumentos actuais passados) // Dá o maior de 2 valores do tipo T (comparáveis com ">") template <class T> T max(t a, T b) return a > b? a : b; // Chamadas max(1, 2); // gera e chama max(int, int) max('a', 'b'); // gera e chama max(char, char) max(1, 'a'); // Erro: não consegue gerar max(int, char) 11 Implementação Genérica da Pesquisa Sequencial em C++ Template de função em C++, na variante (a): /* Procura um valor x num array v de n elementos (n>=0) comparáveis com os operadores de comparação. Retorna o índice da primeira ocorrência de x em v, se encontrar; senão, retorna -1. */ template <class T> int SequentialSearch(const T v[], int n, T x) for (int i = 0; i < n; i++) if (v[i] == x) return i; // encontrou return -1; // não encontrou 12 6

Pesquisa Binária Problema (pesquisa de valor em array ordenado): verificar se um valor (x) existe num array (v) previamente ordenado e, no caso de existir, indicar a sua posição no caso de arrays com valores repetidos, consideramos a variante em que basta indicar a posição de uma ocorrência qualquer (as outras ocorrências do mesmo valor estão em posições contíguas) Algoritmo (pesquisa binária): Comparar o valor que se encontra a meio do array com o valor procurado, podendo acontecer uma de três coisas: é igual ao valor procurado está encontrado é maior do que o valor procurado continuar a procurar (do mesmo modo) no sub-array à esquerda da posição inspeccionada é menor do que o valor procurado continuar a procurar (do mesmo modo) no sub-array à direita da posição inspeccionada. Se o array a inspeccionar se reduzir a um array vazio, conclui-se que o valor procurado não existe no array inicial. 13 Exemplo de Pesquisa Binária left middle right x: 2 1ª iteração v: 1 3 3 5 7 8 9 (>x) left middle right 2ª iteração 1 3 3 (>x) left middle right 5 7 8 9 3ª iteração 1 (<x) 3 3 5 7 8 9 4ª iteração left right 1 3 3 5 7 8 9 array a inspeccionar vazio o valor 2 não existe no array inicial! 14 7

Implementação da Pesquisa Binária em C++ /* Procura um valor x num array v de tamanho n previamente ordenado. Retorna o índice de uma ocorrência de x em v, se encontrar; senão, retorna -1. Supõe que os elementos do array são comparáveis com os operadores de comparação. */ template <class T> int BinarySearch(const T v[], int n, T x) int left = 0, right = n - 1; while (left <= right) int middle = (left + right) / 2; if (x == v[middle]) return middle; // encontrou else if (x > v[middle]) left = middle + 1; else right = middle - 1; return -1; // não encontrou 15 8