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
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
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 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
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
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
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
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
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
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
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
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
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
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
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
Top Related