Pesquisa e Ordenação

Documentos relacionados
SCC Capítulo 2 Recursão

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

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Programação Estruturada

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

Análise de Algoritmos Parte 4

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

CURSO DE ESTRUTURA DE DADOS MÓDULO: ALGORITMOS DE ORDENAÇÃO E PESQUISA PROFESSORA: DANIELA ELOISE FLÔR COLABORADORA: MARIA CAROLINA SILA VANUCHI

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

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

Projeto e Análise de Algoritmos

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Projeto e Análise de Algoritmos

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

INF 1010 Estruturas de Dados Avançadas

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

Recursividade. Objetivos do módulo. O que é recursividade

Capacitação em Linguagem C Parte 2

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Recursividade

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

Recursividade. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

ALGORITMOS DE ORDENAÇÃO

Árvores Binárias de Pesquisa (ABP) INF01203 Estruturas de Dados. Operações. Árvores Binárias de Pesquisa (ABP) Caminhamento Central à Esquerda

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

MC102 Aula 26. Instituto de Computação Unicamp. 17 de Novembro de 2016

BCC202 - Estrutura de Dados I

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Quick Sort. Considerações Sobre Algoritmos de Ordenação. Estagiário PAE: Jesimar da S. Arantes Professor: ClaudioQuick F. M.

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

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

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

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

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

Quicksort. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos

Métodos de Ordenação Parte I

Recursividade. Prof. Jesus José de Oliveira Neto

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)

Análise e Complexidade de Algoritmos

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

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

Recursividade. Recursividade

Linguagem e Técnicas em Programação. Gilson de Souza Carvalho

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

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Aprendendo a Programar Programando numa Linguagem Algorítmica Executável (ILA)

Técnicas de projeto de algoritmos: Indução

Análise de Algoritmos

Lógica de Programação I

Método de ordenação - objetivos:

Universidade da Madeira. 1. Recursão. 3. Busca. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2

Algoritmos e Estruturas de Dados LEE 2013/2014. popular devido à facilidade de implementação e eficiência

CIC 110 Análise e Projeto de Algoritmos I

Algoritmos e Estruturas de Dados I Prof. Tiago Eugenio de Melo

O Problema da Ordenação Métodos de Ordenação Parte 1

Construção de Algoritmos II Aula 06

Transcrição:

Pesquisa e Ordenação SC121 - Introdução à Programação ICMC - USP - São Carlos Maio de 2009

Algoritmo de Procura Algoritmo de Procura O problema de procurar, pesquisar alguma informação numa tabela ou num catálogo é muito comum Exemplo: procurar o telefone de uma pessoa no catálogo procurar o nº da conta de um certo cliente consultar o seu saldo em um terminal automático

Algoritmo de Procura A tarefa de pesquisa, procura ou busca é, como se pode imaginar, uma das funções mais utilizadas rotinas que a executem de uma forma eficiente Eficiente: uma rotina que faça a busca no menor tempo possível O TEMPO GASTO pesquisando dados em tabelas depende do TAMANHO da tabela.

Algoritmo de Procura O tempo gasto para se descobrir um telefone na lista de São Paulo > O tempo gasto para se descobrir um telefone na lista de uma cidade do interior com 3000 habitantes

Algoritmo de Procura TEMPO GASTO pode variar muito dependendo do algoritmo utilizado Para os algoritmos de busca que se seguem vamos denotar por: Tab - um vetor de n posições Dado - elementos que devemos procurar em Tab Achou - indica o sucesso ou falha na pesquisa Ind - aponta para a posição do elemento encontrado

Parte que se repetirá... ( ) Tab[100] of integer; {tabela de pesquisa} Int Ind;{retorna a posição do elemento} boolean Achou; {sucesso ou falha na busca} Int Dado; {valor a ser procurado} Int I; {auxiliar}

Algoritmo 1 - Busca em Tabela #includes ( ) Int main(){ printf( Entre com os valores da tabela ); for (i=0;i<n;i++) scanf( %d, &Tab[I]); printf( Entre com o valor a ser procurado ); scanf( %d,&dado); Achou=false; for (i=0;i<n;i++) if Tab[I] == Dado{ N comparações Achou=true; Ind = I; ( ~ percorrer 1 dicionário todo) } if Achou printf( %d %d se encontra na posição, Dado, Ind) Dado); getch(); } else printf( %d não encontra na tabela,

Algoritmo 2 - Busca em tabela Pára-se o processo de busca quando o dado for encontrado. 1º modo I 1 Enquanto (Tab [I] <> dado) and (I<=n) faça I= 1 + 1 Este algoritmo não funciona pois Ind N +1 e Tab [N+1] - referência inválida

2 o Modo (Com o uso da variável BOOLEAN) Program Alg2; (*) Int Main(){ Achou:= false; Procura:= true; Ind:= 0; printf( Entre com os valores da tabela ); for (i=0;i<n;i++) scanf( %d, &Tab[I]); Dado pode estar na 1 a posição printf( Entre com o valor a ser procurado ); scanf( %d,&dado); ou Dado pode estar na última while Procura{ Ind++; Na média: N/2 comparações if Ind > N Procura= false; else Procura = Tab[Ind] <> Dado Obs: 2 testes } - Procura = true if Ind <= N -Ind> N Achou = true; if Achou printf( %d se encontra na posição %d,dado, Ind); else printf( %d não encontra na tabela, Dado); }

Algoritmo 3: Busca com Sentinela Se soubermos que o dado se encontra na tabela na precisaríamos fazer o teste Ind > N INSERIR o Dado no final da tabela

Program Alg3; {Bem + simples} (*) begin printf( Entre com os valores da tabela ); for (i=0;i<n;i++) scanf( %d, &Tab[I]); printf( Entre com o valor a ser procurado ); scanf( %d,&dado); Achou= false; Ind= 0; Tab[N]= Dado; while (Tab[Ind]!= Dado){ Ind++; } Achou= Ind!= N; if Achou printf( %d se encontra na posição %d,dado, Ind); else printf( %d não se encontra na tabela, Dado); end.

Algoritmo 4 -Busca binária (+ eficiente) Dicionário - Tarol Abre-se o dicionário ao meio letra J Abandonamos a 1 a metade Tomamos a metade a partir de J letra P Abandonamos a 1 a metade Tomamos a metade a partir de P letra S (pág. 1318) Dividimos novamente, chegamos a palavra Tomo (pág. 1386) palavra está entre 1318 e 1386

Algoritmo 4 - Busca binária A cada passo dividimos a área de pesquisa à metade Caso o dicionário tenha 1500 palavras 1500/2 750 24/2 12 11 pesquisas = log 2 1500 750/2 375,5 12/2 6 N log 2 N 376/2 188 6/2 3 32.000 15 comparações 188/2 94 3/2 1,5 94/2 47 2/2 1 47/2 23,5

Program Alg4; (*) Inicio, Fim, Meio: Integer; begin printf( Entre com os valores da tabela ); for (i=0;i<n;i++) scanf( %d, &Tab[I]); printf( Entre com o valor a ser procurado ); scanf( %d,&dado); Achou= false; Inicio=1; Fim= N; Meio = (1+N)/2; while (Dado <> Tab[Meio]) and (Inicio <> Fim){ if Dado > Tab[Meio] Inicio = Meio + 1; else Fim = Meio; Meio= (Inicio + Fim) / 2; } Achou = Dado = Tab[Meio]; if Achou printf( %d se encontra na posição %d,dado, Meio); else printf( %d não encontra na tabela, Dado); end.

Algoritmos de Ordenação

Algoritmos de Ordenação Da mesma forma que a BUSCA, a ORDENAÇÃO é uma das tarefas básicas em processamento de dados A ordenação de um vetor significa fazer com que os seus elementos estejam colocados de acordo com algum critério de ordenação

Algoritmos de Ordenação (continuação) Supor que os elementos de um vetor sejam inteiros Critério de ordenação: ordem crescente ou decrescente Assim, se o vetor tem N elementos: VET[I] >= VET[J] se I > J crescente VET[I] <= VET[J] se I > J decrescente

Método da Seleção VET = [ 46 15 91 59 62 76 10 93 ] Ordem crescente 1 o passo:- para saber quem fica na posição 1, determina-se o menor elemento do vetor da posição 2 até a 8 - Compara-se com o elemento VET[1] - se for menor troca-se as posições VET = [ 10 15 91 59 62 76 46 93 ]

Método da Seleção (continuação) 2 o passo:- procura-se o menor elemento da posição 3 até a 8 e repetimos o processo VET = [ 10 15 91 59 62 76 46 93 ] 3 o passo: VET = [ 10 15 46 59 62 76 91 93 ]

Método da Seleção (continuação) 4 o passo: VET = [ 10 15 46 59 62 76 91 93 ] 5 o passo: VET = [ 10 15 46 59 62 76 91 93 ] 6 o passo: VET = [ 10 15 46 59 62 76 91 93 ] 7 o passo: VET = [ 10 15 46 59 62 76 91 93 ] Ok!

Algoritmo1 - Ordenação por Seleção (**) program ordena1; #includes... int Tab[10] {tabela de pesquisa} int Ind1, Ind2; {marcadores} int Aux; {posição para a troca} int IndMin; {posição do menor elemento}

Algoritmo1 - Ordenação por Seleção (continuação) Int Main(){ (**) printf( Entre com os valores da tabela ); for (i=0;i<n;i++) scanf( %d, &Tab[I]); for(ind1=0;ind1< N 1;Ind1++){ IndMin= Ind1; for(ind2= IndMin + 1;I<N;I++){ if Tab[Ind2] < Tab[IndMin] IndMin= Ind2; if Tab[IndMin] < Tab[Ind1]{ Aux = Tab[IndMin]; Tab[IndMin]= Tab[Ind1]; Tab[Ind1]= Aux; } } printf( O vetor ordenado e\n ); for (Ind1=0;Ind1<N;Ind1++){ printf( %d,tab[ind1]); }

Esforço Computacional 1 o passo: 7 comparações 2 o passo: 6 comparações 3 o passo: 5 comparações 4 o passo: 4 comparações 5 o passo: 3 comparações 6 o passo: 2 comparações 7 o passo: 1 comparação N elementos : soma do N-1 primeiros inteiros N C = (N-1). N / 2 N T = (N-1) {no máximo}

Método da Bolha É mais popular que o anterior, embora seu desempenho seja inferior Tab = [ 10 46 15 91 59 62 76 93 ] 1 [ 10 46 15 91 59 62 76 93 ] 2 [ 10 15 46 59 91 62 76 93 ] 3 [ 10 15 46 59 62 91 76 93 ] 4 [ 10 15 46 59 62 76 91 93 ]

Algoritmo2 - Método da Bolha Int Main(){ (**) boolean Troquei; {indicador de parada} printf( Entre com os valores da tabela ); for (i=0;i<n;i++) scanf( %d, &Tab[I]); Ind2= N; do{ Troquei= false; for (Ind1=0;Ind1<Ind2 1;Ind1++){ if Tab[Ind1] > Tab[Ind1+1]{ Aux= Tab[Ind1]; Tab[Ind1]= Tab[Ind1+1]; Tab[Ind1+1]= Aux; Troquei:= true; }}} while(troquei); writeln( O vetor ordenado e ); printf( O vetor ordenado e\n ); for (Ind1=0;Ind1<N;Ind1++){ printf( %d,tab[ind1]); printf( O vetor ordenado e\n ); for (Ind1=0;Ind1<N;Ind1++){ printf( %d,tab[ind1]); }

Esforço Computacional Método da Bolha N C = (N-1) N / 2 N T = 3 (N-1) N / 4 N C = número de comparações N T = número de trocas

Método Quicksort Vamos, agora, examinar um processo de ordenação chamado ORDENAÇÃO POR PARTIÇÃO, que é vantajoso em relação aos processos anteriores O esforço computacional cresce com N log N e não mais quadraticamente

Idéia Básica (Quicksort) Trocas em distâncias maiores do que 1 Três marcadores: Antes, Depois e Meio Vet[Meio] Vet elemento maior Mediana elemento menor

Idéia Básica (Quicksort) Procura-se de um lado um elemento menor que a Mediana e por outro lado um elemento maior que a Mediana e troca-se suas posições Se existir apenas um elemento nas cond. anteriores, entao, troca-se esse elemento com a Mediana. Repete-se o processo até que Antes seja maior que Depois

Exemplo VET = [ 46 15 91 59 62 76 10 93 ] Antes = 1 Depois = 8 Meio = 4 VET = [ 46 15 10 59 62 76 91 93 ] está na posição correta

Exemplo (continuação) Repete-se o processo, isto é, a partição, para cada uma das METADES 1 a metade 2 a metade VET = [ (46 15 10) 59 (62 76 91 93) ] VET = [ 10 15 46 59 62 76 91 93 ] Ordenado!

Subprogramas Recursivos (1 de 5) O Escopo de um subprograma é delimitado desde de sua definição até o fim do bloco que está definido. Sendo assim, um subprograma pode ser chamado por um outro subprograma ou até mesmo por si próprio. Quando um subprograma contém uma chamada a si próprio, ele é dito um subprograma recursivo.

Subprogramas Recursivos (2 de 5) Exemplos de definições recursivas: (i) fat(n) = n * fat(n-1), n >= 1 fat(n) = 1, n = 0 (ii) fib(n) = fib(n-1)+fib(n-2), n >= 2 fib(n) = 1, n = 1 fib(n) = 0, n = 0

Subprogramas Recursivos (3 de 5) Todas as definições recursivas têm em comum: um índice para cada definição; pelo menos, uma definição não-recursiva (condição de saída) que, ao ser alcançada garante a interrupção da recursão; Cada chamada faz a função ser executada novamente, com um argumento diferente para cada nova execução.

Subprogramas Recursivos (4 de 5) fib(n) = fib(n-1)+fib(n-2), n >= 2 fib(n) = 1, n = 1 fib(n) = 0, n = 0 Int function fib(int n){ } if n = 0 fib := 0; else if n = 1 fib := 1; else fib = fib(n-1)+fib(n-2)

Subprogramas Recursivos (5 de 5) Programas recursivos consomem tempo de execução e espaço em memória (pilha de ativação para cada procedimento recursivo) e podem ser ineficientes para alguns casos. Por exemplo, o cálculo do número de Fibonacci iterativo gasta menos recursos computacionais do que o cálculo recursivo. Faça o programa fib(n) iterativo para comprovar a eficiência perante o recursivo.

Algoritmo Quicksort O algoritmo para executar esta tarefa é recursivo Program Quicksort; Início do Programa Quicksort variaveis int Tab[20]; {tabela a ser ordenada} int Ind; {marcador}

void Quick (int Inicio, int Fim); Int Antes, Depois; Int Mediana, Aux; Continuação do Programa Quicksort 1}; Antes= Inicio; Depois= Fim; Mediana= Tab[(Inicio + Fim) / 2]; do{ while Tab[Antes] < Mediana { Antes= Antes + while Tab[Depois] > Mediana { Depois= Depois 1}; if Antes <= Depois{ Aux := Tab[Antes]; Tab[Antes] := Tab[Depois]; Tab[Depois] := Aux; Antes := Antes + 1; Depois := Depois - 1; } while( Antes > Depois); If Inicio < Depois Quick(Inicio, Depois); if Antes < Fim Quick(Antes, Fim); } /*Quick

Int main(){ printf( Entre com os valores da tabela ); for (i=0;i<n;i++) scanf( %d, &Tab[I]); Quick(1,N); printf( O vetor ordenado e\n ); for (Ind1=0;Ind1<N;Ind1++){ printf( %d,tab[ind1]); Final do Programa Quicksort } {program quicksort}

Esforço Computacional Método do Quicksort N C = N (log N) N T = N (log N) 1 o passo: N comparações a cada passo: divide o vetor ao meio

EXEMPLO VET = [ 44 55 12 42 94 6 18 67 ] VET = [ 18 55 12 42 94 6 44 67 ] VET = [ 18 6 12 42 94 55 44 67 ] VET = [ (18 6 12) 42 (94 55 44 67) ]

VET = [ 18 6 12 42 (94 55 44 67) ] VET = [ 6 18 12 42 (94 55 44 67) ] VET = [ 6 12 18 42 94 55 44 67 ] VET = [ 6 12 18 42 44 55 94 67 ] VET = [ 6 12 18 42 44 55 94 67 ] VET = [ 6 12 18 42 44 55 67 94 ]

Recursão X Iteração Todo processo recursivo pode ser transformado em um processo iterativo, bastando simular a pilha de recursão, caso não se conheça outro tipo de definição não-recursiva. A versão não-recursiva é, em geral, mais eficiente do que a recursiva. A escolha por uma função recursiva é feita quando tempo/espaço não são problemáticos, ou se a versão recursiva for mais simples.

Material preparado por Prof a Roseli A. Francelin Romero e Valéria Feltrim (PAE) 1999 Revisado em 2008 por Roseli Romero Fim