6. Pesquisa e Ordenação

Documentos relacionados
Ordenação e Pesquisa

Algoritmos de ordenação Ordenação rápida ( Quicksort )

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

ALGORITMOS DE ORDENAÇÃO

Algoritmos de Ordenação

Algoritmos de pesquisa

Pedro Ribeiro 2014/2015

BCC202 - Estrutura de Dados I

Collections Framework

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

Algoritmos de Ordenação

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI2

Algoritmos e Estruturas de Dados. Décima sexta aula: Quicksort

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

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)

Divisão e conquista. Eficiência de divisão e conquista

Algoritmos de Ordenação. Profº Carlos Alberto T. Batista

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

Análise e Complexidade de Algoritmos

Capítulo 14. Ordenação e pesquisa. Bubblesort. Alguns algoritmos de ordenação e pesquisa Medição do tempo de execução de um programa

Ordenação de Vectores

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

BCC202 - Estrutura de Dados I

Algoritmos de Pesquisa e Ordenação em Vectores

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

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

Métodos de Ordenação Parte I

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

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

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

Estruturas de Dados 2

Ordenação de Dados. Ordenação de Dados

Métodos de ordenação. Bubble sort:

Métodos de Classificação

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

Bubble Sort. Tempo total O(n 2 )

Algoritmos Paralelos - ordenação

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

Interfaces POO. Prof. Marcio Delamaro

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

Algoritmos de Ordenação: QuickSort

Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

Introdução à Computação II (Noturno) BCC Unesp Rio Claro/SP 2015 em PDF via Moodle: Escolha apenas 5 exercícios para entrega Exercício 01 (Pilhas)

Pesquisa sequencial e pesquisa binária

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

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

Métodos de Ordenação Parte 2

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

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

8. Árvores. Fernando Silva DCC-FCUP. Estruturas de Dados. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

8. Árvores. Fernando Silva. Estruturas de Dados DCC-FCUP. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

Algoritmos de Ordenação: MergeSort

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Algoritmos de Ordenação

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

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

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

5. Algoritmos de Ordenação

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - II

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

Algoritmos de Ordenação em LISP

Existem duas categorias de algoritmos de ordenação: Os algoritmos de ordenação são avaliados de acordo com os seguintes critérios:

Classificação e Pesquisa Aula 6 Métodos de Ordenação: ShellSort e QuickSort. Prof. Esp. Pedro Luís Antonelli Anhanguera Educacional

Transcrição:

6. Pesquisa e Ordenação Fernando Silva DCC-FCUP Estruturas de Dados Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 1 / 30 Pesquisa de Informação A pesquisa eficiente de informação é extremamente relevante, seja: pesquisa num catálogo indexado por uma relação de ordem, e.g. alfabética, como seja uma lista telefónica; pesquisa interna nos registos de uma base de dados: registos ordenados ou não ordenados; pesquisa de informação em páginas Web (pesquisa de texto); pesquisa de informação em dados binários, normalmente imagens, etc. A pesquisa sequencial é dos casos mais simples e é normalmente usada quando não se tem uma relação de ordem na informação a pesquisar. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 2 / 30

Pesquisa Sequencial A pesquisa sequencial consiste em procurar um valor x numa sequência de valores v[] com dimensão N. Vejamos a pesquisa com valores inteiros e strings (veremos mais tarde como fazer o mesmo com apenas um método): Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 3 / 30 Pesquisa Binária A pesquisa binária é uma estratégia eficiente de pesquisa de um valor x numa sequência ordenada de valores v[] indexado no intervalo (e, d): Ideia do algoritmo: Seja m a posição média de v[] Comparar x com v[m] Se x==v[m] então encontrou senão se x<v[m], procura x no intervalo [e,m-1] senão (x>v[m]), procura x no intervalo [m+1,d] Um exemplo: Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 4 / 30

Pesquisa Binária: versão recursiva Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 5 / 30 Pesquisa Binária: versão não recursiva Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 6 / 30

Pesquisa Indirecta Seja int o[] um vector que determina a ordem dos elementos de uma sequência de nomes String nomes[]. Como pesquisar a string nome no vector nomes[]? Efectuar pesquisa binária dos nomes através do vector auxiliar o[] que define a ordem dentro de nomes[]. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 7 / 30 Pesquisa Indirecta Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 8 / 30

Algoritmos de Ordenação Em que é que a ordenação pode ajudar para resolver tarefas importantes de programação? Verificar unicidade Como verificar se os elementos de um conjunto S são todos distintos? Ordenando S, os elementos repetidos ficam seguidos, pelo que basta verificar se S[i] = S[i + 1] para algum 1 i < n. Remover repetições Como remover todas as repetições de um dado elemento de S? Ordenar S e depois percorrer os seus elementos com 2 cursores. Prioritizar eventos Suponha que são dados um conjunto de tarefas para fazer, cada uma com o seu prazo. Ordenar os eventos de acordo com a data de deadline permite colocar as tarefas na ordem correcta. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 9 / 30 Algoritmos de Ordenação (cont.) Média/Selecção suponha-se que se pretende o k-ésimo item do conjunto S. Ordenar por ordem crescente. O valor procurado está em S[k]. Contagem/frequência Qual é o elemento mais frequente de S. Intersecção/Reunião a operação é trivial se os conjuntos estiverem ordenados. Procura eficiente como verificar se um dado elemento x pertence a um conjunto S? Se esta for uma operação frequente, compensa ordenar primeiro para depois usar pesquisa binária. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 10 / 30

Método de ordenação: selecção de máximo/mínimo Na posição i do vector v[], coloca-se o maior (ou menor) elemento entre os ainda não ordenados, i.e. que se encontram entre i + 1 e n 1 Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 11 / 30 Ordenação Indirecta Considere um vector com 4 objectos, cada um representando uma pessoa com nome, ano e local de nascimento, ordenados por ano de nascimento. Como obter esta informação ordenada, por ordem alfabética dos nomes das pessoas, sem alterar o vector original? Usar um vector auxiliar O[] que contenha a ordenação do vector original? Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 12 / 30

Ordenação Indirecta (cont.) Usando o método de ordenação por selecção de mínimo e admitindo que a classe Pessoa tem atributos nome, anonasc e concelho. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 13 / 30 Método de ordenação: inserção Este método de ordenação é designado de inserção porque, em cada passo, procura inserir um novo elemento na posição correcta de uma sequência já ordenada. Os passos associados ao método são: Supor que o vector v[] está já parcialmente ordenado (posições 0 a p-1); adicionar um novo elemento não ordenado é simples: basta ir de v[p] até v[0] para determinar a posição k do novo valor; deslocar os elementos entre v[k+1] e v[p]; adicionar o valor em v[k] Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 14 / 30

Método de ordenação: inserção O algoritmo pode ser simplificado se usarmos a posição 0 do vector com um valor de paragem (mais pequeno que qualquer outro do vector; supondo ordenação crescente): Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 15 / 30 Método de ordenação1: bolha (bubble-sort) Este método consiste em comparar os elementos do vector dois a dois e trocar os elementos que não estiverem na ordem desejada. O nome vem do facto de em cada iteração as comparações sucessivas de elementos deslocarem o maior (ou menor) elemento para as últimas posições do vector como se fosse o deslizar de uma bolha. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 16 / 30

Método de ordenação2: bolha (bubble-sort) O algoritmo 1, faz sempre n(n 1)/2 comparações. Se o vector ficar ordenado a meio das iterações, faz comparações desnecessárias. Uma optimização consiste em usar uma flag que sinaliza a ocorrência de trocas numa iteração. O algoritmo termina se não ocorrerem trocas na iteração anterior. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 17 / 30 Método de ordenação3: bolha (bubble-sort) Uma melhoria adicional é recordar em cada iteração onde se verificou a última troca e fazer o ciclo-j ir só até essa posição na iteração seguinte: As diferenças na eficiência destes 3 algoritmos de bubblesort só serão visíveis para valores grandes de n. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 18 / 30

Ordenação: Método Quick-Sort O quicksort é um dos algoritmos de ordenação mais eficiente (O(n log n)). Baseia-se numa estratégia recursiva dividir-para-conquistar. Supondo que se pretende ordenar um vector S, consiste em: 1 Se o número de elementos em S é 0 ou 1, S está ordenado; 2 Escolher um elemento v S. Chamamos-lhe pivot. 3 Dividir S v em dois vectores: S 1 = {x S {v} x < v}, elementos menores que o pivot S 2 = {x S {v} x v}, elementos maiores que o pivot Note-se que os elementos em S 1 e S 2 não estão necessariamente ordenados. 4 Aplicar recursivamente o algoritmo a S 1 e S 2 Neste algoritmo, o esforço está na partição do vector, sendo a estratégia de escolha do pivot importante. A junção dos sub-vectores já ordenados é uma simples colagem. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 19 / 30 Ilustração do Algoritmo Quicksort Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 20 / 30

Implementação do quick-sort Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 21 / 30 Implementação do quick-sort (cont.) Um método para concretizar a partição do vector, consiste em usar dois cursores a e b que inicialmente correspondem às extremidades do vector. Os cursores são deslocados em direcções opostas de forma a separarem os elementos menores que o pivot dos elementos maiores ou iguais. As decisões a tomar são: Se v[a] < pivot então a = a + 1 Se v[b] pivot então b = b 1 Troca v[a] com v[b] e incrementa a e b A partição está completa quando b < a. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 22 / 30

Implementação do quick-sort (cont.) Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 23 / 30 Optimização do Algoritmo Quicksort O quicksort é menos eficiente do que outros métodos para valores pequenos de N (número de elementos no vector). Assim, uma estratégia para melhorar ainda mais o desempenho do quicksort, é evitar que ele seja aplicado quando os sub-intervalos atingem um valor relativamente baixo 10 a 15 elementos, e nesses casos usar outro método. Teríamos algo como: Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 24 / 30

Ordenação: Método Mergesort A ideia base do algoritmo consiste em: subdivide o vector em duas partes, aplicar o algoritmo a cada parte, quando as duas partes estiverem ordenadas (2 vectores ordenados), faz-se a junção para produzir um vector final ordenado. 6 24 28 3 13 10 7 30 22 16 8 25 12 5 separa em 2 vectores 3 6 7 10 13 24 28 5 8 12 16 22 25 30 mergesort de cada vector 3 6 7 10 13 24 28 5 8 12 16 22 25 30 junta as listas ja ordenadas. 3 5 6 7 8 10 12 13 16 22 24 25 28 30 Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 25 / 30 Algoritmo mergesort - exemplo divide-and-conquer Exemplo típico da técnica de programação dividir-para-conquistar. procuramos dividir o nosso problema em sub-problemas mais pequenos que sabemos resolver e depois juntamos os resultados dos sub-problemas para obter o resultado final. subdividir o vector inicial em sub-vectores até termos dimensão 1. Juntar ordenadamente dois vectores de dimensão 1 é fácil, podemos depois juntar dois vectores de dimensão 2, etc. O método principal consiste em: Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 26 / 30

Mergesort - junção das partes Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 27 / 30 Funções de ordenação do Java Usar a class java.util.arrays que contém vários métodos para ordenar, e.g. static void sort(object[] a) static void sort(object[] a, Comparator c) Existem outros métodos específicos para inteiros ou strings. Em Java, a classe Arrays permite a invocação do método sort() para ordenar não apenas inteiros mas outro tipo de objectos. Para tal, os objectos têm de pertencer a classes que implementem a interface Comparable: public interface Comparable { int comparetoobject(object o); } Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 28 / 30

Funções de ordenação do Java (cont.) Como exemplo, suponhamos que temos a seguinte classe: class Pessoa implements Comparable { String nome; int idade;... public int compareto(object o) { Pessoa outra= (Pessoa) o; if (idade < outra.idade) return -1; if (idade > outra.idade) return 1; return 0; } } Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 29 / 30 Funções de ordenação do Java Deste modo, se tivermos um vector de objectos do tipo Pessoa é possível ordenar: Pessoa p[]= new Pessoa[N];... Arrays.sort(p); //ordena o vector de objectos Pessoa por idade É ainda possível melhorar este código com os genéricos do Java. Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 30 / 30