Marco Antonio Montebello Júnior

Slides:



Advertisements
Apresentações semelhantes
LISTAS Dilvan Moreira, parcialmente baseado em material do prof. Ricardo Campello.
Advertisements

Ordenação de Dados em Memória
Programação em Java Prof. Maurício Braga
Checkpoint SGBD com alta demanda de transações Checkpoint
Katia S. Guimarães QUICKSORT Katia S. Guimarães
Marco Antonio Montebello Júnior
Linguagem de Programação IX Métodos de Ordenação
Pesquisa de Informação
Exercício Exercício. Considere um algoritmo sequencial que busca um elemento em uma lista não ordenada a) Qual é a complexidade de tempo deste algoritmo.
Algoritmos de Busca CONTEÚDO (1) Motivação (2) Busca Linear
2 de Junho de 2005Conclusão1 Pedro Barahona DI/FCT/UNL Junho 2005.
1 Conclusão DI/FCT/UNL 1º Semestre 2004/ Ciclos de Simulação A técnica usada no exemplo da queda livre pode ser utilizada para trajectórias a duas.
Estruturas de repetição
Arquivos Seqüenciais Inhaúma Neves Ferraz
Pesquisa em Memória Primária
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária – Árvores de Busca
Pesquisa em Memória Primária – Árvores de Busca
Pesquisa em Memória Primária
David Menotti Estruturas de Dados I DECOM – UFOP
Pesquisa Algoritmos de pesquisa recebem um alvo e tentam encontrá-lo dentro de um conjunto de elementos. Recuperação (ou hit): quando o algoritmo encontra.
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Introdução a Programação
Métodos de Pesquisa: Seqüencial e Binária
Algoritmos Escher.
THOBER CORADI DETOFENO, MSC. Aula 07
Sincronização de Processos (2)
Instrutor: Nilo Menezes
Lógica de Programação Módulo II
6.3 – Estruturas Repetitivas
O Portal do Estudante de Computação
Algoritmos de Ordenação
Informática Teórica Engenharia da Computação
Algoritmos e Estruturas de Dados I – Estruturas de Dados
Algoritmos e Estruturas de Dados I – Estruturas de Controle de Fluxo
O Portal do Estudante de Computação
Algoritmos de Busca Parte II
Linguagem de Programação II Parte V
Estruturas de Repetição
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Estrutura de Dados Unidade 6 Simulação do exercício 6.2 Elaborada por Mauricio Falvo.
Interpretador Python.
Aula prática 6 Vetores e Matrizes
Algoritmos 1º Semestre Materia: Informática Profº: Cristiano.
Prof: Luiz Carlos Zancanella :: INE / UFSC-SC 1 INE 5201 – Aula 002 Algoritmo Um conjunto de ações, com propriedades especiais e específicas e com algumas.
Sistema de equações lineares
Listas, Filas e Pilhas Katia Guimarães.
Aula 3 Listas, pilhas, filas.
Fundamentos de Programação
Estrutura de Decisão Multipla
Introdução à Linguagem C
Igor Steinmacher, MSc. O maravilhoso mundo da Lógica de Programação.
Algoritmos e Estruturas de Dados I – Estruturas de Controle de Fluxo
Introdução à complexidade de algoritmos Luiz Gonzaga da Silveira Junior.
Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações.
Tabela Hash Alunos : Gustavo Jorge Zanin nºUSP
Prof. Hilton Cardoso Marins Junior
CLASSIFICAÇÃO DE DADOS
ALGORITMOS Profº Antonio Carlos Marcelino de Paula.
Informática e Computação Aula Estrutura de Repetição
Linguagem de Programação I Parte IV
Andréa Iabrudi 1 Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I.
Classificação Ordenação de Dados
Algoritmos – Aula 04 Comandos de repetição.
Métodos de Pesquisa: Sequencial e Binária
Arrays Outline 7.1 Introdução 7.2 Arrays 7.3 Declarando e Criando Arrays 7.4 Exemplos usando arrays 7.5 Ordenando arrays 7.6 Procurando em.
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
Classificação (Ordenação) de dados. Roteiro Contextualização e definições sobre Classificação Métodos de Classificação de Dados.
Algoritmos com matrizes e vetores
Transcrição da apresentação:

Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Pesquisa Ordenação e Pesquisa de Dados Marco Antonio Montebello Júnior marco.antonio@aes.edu.br

Pesquisa Seqüencial ou Linear Varredura serial da tabela Pode ser aplicada em tabelas representadas por arrays, arquivos ou listas ligadas Desempenho do algoritmo de pesquisa seqüencial é sofrível NC = (n+1)/2 NC: número de comparações n: número de elementos da tabela

Obtenção da fórmula NC = 1 * p1 + 2 * p2 + 3 * p3 + 4 * p4 + ... + n-1 * pn-1 + n * pn NC = 1 * 1/n + 2 * 1/n + 3 * 1/n + 4 * 1/n + ....+ n * 1/n NC = 1/n * (1+2+3+4+5+...+n) NC = 1/n * (n * (n+1) / 2) NC = (n2 + n) / 2n NC = (n + 1) / 2 p1, p2, p3, ..., pn = probabilidade de se encontrar o elemento

Técnicas para se melhorar o desempenho do algoritmo de pesquisa seqüencial Melhorias por sofisticação no algoritmo Melhorias baseadas nos dados a serem pesquisados Sentinela: sentinela nada mais é do que a agregação do dado que se deseja procurar ao final da tabela sobre qual se vai executar a pesquisa Número total de comparações para o pior caso é 2n+1 Uso da sentinela permite fazer uma única comparação em cada ciclo, reduzindo em 50% o número de comparações para o pior caso, que passa a ser n+1

As principais desvantagens do uso de sentinelas são: Técnicas para se melhorar o desempenho do algoritmo de pesquisa seqüencial As principais desvantagens do uso de sentinelas são: A necessidade de se alterar a tabela, adicionando um elemento "estrangeiro" a ela. A eliminação de uma comparação permite um ganho muito pequeno de velocidade no programa O programador deve garantir a presença de uma posição vazia no final da tabela, não devendo utilizá-la para nenhum outro propósito (deve-se redobrar a atenção em operações de inserção).

Algoritmos Busca em tabela Busca em tabela melhorado Busca com sentinela Pesquisa binária

Algoritmo 1: Busca em tabela Uma forma intuitiva é construir um algoritmo que pesquise em todas posições de uma tabela a ocorrência de um certo elemento procurado. Isso pode ser realizado por uma estrutura de repetição do tipo “para até” Nesse algoritmo percebemos que são executadas n comparações porque existe comparação até o final, mesmo o elemento tendo sido encontrado na primeira posição. 40 1 22 88 13 65

Algoritmo 1: Busca em tabela Início achou  false para aux  1 até n se tab[aux] = dado então achou  true ind aux fim_se fim_para se achou = true então escreva “Dado na posição”, ind senão escreva “Dado não achado!” fim.

Algoritmo 2: Busca em tabela melhorado Uma evolução do algoritmo anterior poderia contemplar a interrupção da pesquisa, tão logo o elemento procurado seja encontrado na tabela. O número de comparações que será realizado depende da distribuição dos dados na tabela. Se esta distribuição for aleatória, podemos esperar que na melhor situação, encontraremos o dado na primeira posição e na pior situação, teremos que percorrer toda a tabela, e assim por diante. Dessa forma, na média o algoritmo executa n/2 repetições da estrutura do tipo “enquanto” 40 1 22 88 13 65

Algoritmo 2: Busca em tabela melhorado Início Achou  false Procura  true Ind  0 Enquanto (procura = true) faça Ind  Ind + 1 Se Ind > n então Procura  false Senão Procura  (tab[ind] <> dado) Fim_se Fim_enquanto Se Ind < = n então Achou  true Se (achou = true) então Escreva “Dado na posição”, Ind Escreva “Dado não achado” Fim.

Algoritmo 3: Busca com sentinela O algoritmo tem o seguinte inconveniente: Para cada valor de “ind” a rotina deve fazer duas comparações, a primeira para saber se “procura” é true (verdadeira) e a segunda para testar o valor de “ind” (ind > n). Podemos apresentar um algoritmo que realiza a busca somente com uma única comparação.

Algoritmo 3: Busca com sentinela Se soubéssemos que o elemento a ser procurado se encontra na tabela, não teríamos necessidade de fazer o teste de fim de tabela, pois, o dado seria encontrado antes do final. Uma solução é colocar “dado” no final da tabela, que deve ser acrescida de uma posição para este fim. Dessa forma, temos a necessidade de um único teste: o de comparação com “dado”. Caso o valor de “ind” seja igual a “n” saberemos que o elemento procurado não se encontra na tabela. 40 01 22 88 13 65 Dado Procurado

Algoritmo 3: Busca com sentinela Início achou  false ind  1 tab[n]dado enquanto (tab[ind] <> dado) faça Ind  Ind +1 fim_enquanto achou  (ind <> n) se (achou = true) então escreva “Dado na posição”, ind senão escreva “Dado não achado!” fim_se Fim.

Algoritmo 3: Busca com sentinela Agora temos um algoritmo mais eficiente, pois, com as últimas modificações, o algoritmo encontra um elemento, na média n/2 pesquisas e em cada uma delas, executa apenas uma comparação.

Algoritmo 4: Pesquisa Binária Os algoritmos 1, 2 e 3 consideram que a pesquisa será feita na forma seqüencial e têm a característica de serem simples, porém, podem exigir a inspeção de todos os elementos no caso do elemento procurado não existir na tabela. A procura binária é uma alternativa, mais eficiente em relação a procura seqüencial, exigindo, contudo, que os elementos sobre os quais a procura será realizada se encontrem ordenados.

Algoritmo 4: Pesquisa Binária Utilizando a procura binária, consideramos em primeiro lugar o elemento que se encontra no meio da tabela. Se este elemento é maior que o elemento que estamos procurando (por “maior”, entenda-se “aparece depois”), então podemos garantir que o elemento que estamos procurando não se encontra na segunda metade da tabela.

Algoritmo 4: Pesquisa Binária Repetimos então o processo da procura binária para a primeira metade da tabela. Se o elemento no meio da tabela é menor do que o elemento que estamos procurando (por “menor”, entenda-se “aparece antes”), então podemos garantir que o elemento que estamos procurando não se encontra na primeira metade da tabela. Se o elemento no meio da tabela for igual ao elemento que estamos procurando, então a procura termina. Notamos que em cada passo a procura binária reduz o número de elementos a considerar para a metade (e daí o seu nome)

Algoritmo 4: Pesquisa Binária Início Achou  false Inicio  1 Fim  n Meio  (1+n) div 2 Enquanto (dado <> tab[Meio] e (Inicio <> Fim) faça Se (dado > tab[Meio]) então Inicio  Meio +1 Senão Fim  Meio Fim_se Meio  (Inicio + Fim) div 2 Fim_enquanto Achou  (dado = tab[meio]) Se (achou = true) então Escreva “Dado na posição”,meio Escreva “Dado não achado!” Fim

Algoritmo 4: Pesquisa Binária Na procura binária somos capazes de reduzir pela metade o número de elementos a considerar sempre que efetuamos uma comparação. Assim, se começarmos com “maxelementos”, o número de elementos depois de uma passagem é maxelementos/2, depois, maxelementos/4 e assim, sucessivamente. No caso geral, o número de elementos depois de n passagens é maxelementos/2n. O algoritmo termina quando o número de elementos é menor do que 1, ou seja, terminamos depois de n passagens se: Maxelementos/2n < 1 Maxelementos < 2n log2 maxelementos < n Dessa forma, para uma tabela com maxelementos, a procura binária não exige mais do que 1 + log2 maxelementos passagens.

Algoritmo 4: Pesquisa Binária