15
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

6. Pesquisa e Ordenação Pesquisa de Informação

Embed Size (px)

Citation preview

Page 1: 6. Pesquisa e Ordenação Pesquisa de Informaçã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: registosordenados 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 usadaquando 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

Page 2: 6. Pesquisa e Ordenação Pesquisa de Informação

Pesquisa Sequencial

A pesquisa sequencial consiste em procurar um valor x numasequência de valores v [] com dimensão N.Vejamos a pesquisa com valores inteiros e strings (veremos mais tardecomo 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 xnuma 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]

I Se x==v[m] então encontrouI senão se x<v[m], procura x no

intervalo [e,m-1]I 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

Page 3: 6. Pesquisa e Ordenação Pesquisa de Informação

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

Page 4: 6. Pesquisa e Ordenação Pesquisa de Informação

Pesquisa Indirecta

Seja int o[] um vector que determina a ordem dos elementos de umasequência de nomes String nomes[]. Como pesquisar a string nome novector nomes[]?Efectuar pesquisa binária dos nomes através do vector auxiliar o[] quedefine 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

Page 5: 6. Pesquisa e Ordenação Pesquisa de Informação

Algoritmos de Ordenação

Em que é que a ordenação pode ajudar para resolver tarefas importantesde programação?

Verificar unicidade – Como verificar se os elementos de um conjuntoS são todos distintos?

I Ordenando S, os elementos repetidos ficam seguidos, pelo que bastaverificar se S[i ] = S[i + 1] para algum 1 ≤ i < n.

Remover repetições – Como remover todas as repetições de umdado elemento de S?

I Ordenar S e depois percorrer os seus elementos com 2 cursores.

Prioritizar eventos – Suponha que são dados um conjunto de tarefaspara fazer, cada uma com o seu prazo. Ordenar os eventos de acordocom a data de “deadline” permite colocar as tarefas na ordemcorrecta.

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 doconjunto S.

I 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 conjuntosestiverem ordenados.Procura eficiente – como verificar se um dado elemento x pertencea um conjunto S?

I Se esta for uma operação frequente, compensa ordenar primeiro paradepois usar pesquisa binária.

Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 10 / 30

Page 6: 6. Pesquisa e Ordenação Pesquisa de Informação

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 entreos 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 pessoacom nome, ano e local de nascimento, ordenados por ano de nascimento.Como obter esta informação ordenada, por ordem alfabética dos nomesdas 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

Page 7: 6. Pesquisa e Ordenação Pesquisa de Informação

Ordenação Indirecta (cont.)

Usando o método de ordenação por selecção de mínimo e admitindo que aclasse 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 cadapasso, procura inserir um novo elemento na posição correcta de umasequência já ordenada. Os passos associados ao método são:

Supor que o vector v[] está já parcialmente ordenado (posições 0 ap-1);adicionar um novo elemento não ordenado é simples:

I basta ir de v[p] até v[0] para determinar a posição k do novo valor;I deslocar os elementos entre v[k+1] e v[p];I adicionar o valor em v[k]

Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 14 / 30

Page 8: 6. Pesquisa e Ordenação Pesquisa de Informação

Método de ordenação: inserção

O algoritmo pode ser simplificado se usarmos a posição 0 do vector comum 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 etrocar os elementos que não estiverem na ordem desejada.O nome vem do facto de emcada iteração as comparaçõessucessivas de elementosdeslocarem o maior (ou menor)elemento para as últimasposições do vector como sefosse o deslizar de uma bolha.

Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 16 / 30

Page 9: 6. Pesquisa e Ordenação Pesquisa de Informação

Método de ordenação2: bolha (bubble-sort)

O algoritmo 1, faz sempre n(n − 1)/2 comparações. Se o vector ficarordenado a meio das iterações, faz comparações desnecessárias.Uma optimização consiste emusar uma flag que sinaliza aocorrência de trocas numaiteração. O algoritmo terminase não ocorrerem trocas naiteraçã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 ondese verificou a última troca efazer o ciclo-j ir só até essaposição na iteração seguinte:

As diferenças na eficiência destes 3 algoritmos de bubblesort só serãovisíveis para valores grandes de n.

Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 18 / 30

Page 10: 6. Pesquisa e Ordenação Pesquisa de Informação

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 quese 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:

S1 = {x ∈ S − {v} | x < v}, elementos menores que o pivotS2 = {x ∈ S − {v} | x ≥ v}, elementos maiores que o pivotNote-se que os elementos em S1 e S2 não estão necessariamenteordenados.

4 Aplicar recursivamente o algoritmo a S1 e S2

Neste algoritmo, o esforço está na partição do vector, sendo a estratégiade 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

Page 11: 6. Pesquisa e Ordenação Pesquisa de Informação

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 doiscursores a e b que inicialmente correspondem às extremidades do vector.Os cursores são deslocados em direcções opostas de forma a separarem oselementos menores que o pivot dos elementos maiores ou iguais. Asdecisões a tomar são:

Se v [a] < pivot então a = a + 1Se v [b] ≥ pivot então b = b − 1Troca 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

Page 12: 6. Pesquisa e Ordenação Pesquisa de Informação

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 valorespequenos de N (número de elementos no vector). Assim, uma estratégiapara melhorar ainda mais o desempenho do quicksort, é evitar que ele sejaaplicado quando os sub-intervalos atingem um valor relativamente baixo 10a 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

Page 13: 6. Pesquisa e Ordenação Pesquisa de Informação

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

24 283 13107 3022168 25125

3 6 7 10 13 24 28 5 8 12 16 22 25 30

separa em 2 vectores

junta as listas ja ordenadas.

6

3 6 7 10 13 24 28 5 8 12 16 22 25 30

mergesort de cada vector

A complexidade deste algoritmo é, em média, O(n log n).

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 maispequenos que sabemos resolver e depois juntamos os resultados dossub-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, podemosdepois 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

Page 14: 6. Pesquisa e Ordenação Pesquisa de Informação

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 paraordenar, 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 interfaceComparable:

public interface Comparable {int compareToObject(Object o);

}

Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 28 / 30

Page 15: 6. Pesquisa e Ordenação Pesquisa de Informação

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ívelordenar:

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