semana10-ordenacao-pesquisa-vetores

29
Pedro Valente | Sónia Sobral [pvalente|scrls]@upt.pt 26/11/2015 Algoritmia e Programação Ordenação e Pesquisa IMP.GE.87.0 Licenciatura em Informática 1º Ano, 1º Semestre Licenciatura em Tecnologias e Sistemas de Informação 1º Ano, 1º Semestre

Upload: pedro-valente

Post on 27-Jan-2017

548 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Semana10-ordenacao-pesquisa-vetores

Pedro Valente | Sónia Sobral

[pvalente|scrls]@upt.pt 26/11/2015

Algoritmia e Programação

Ordenação e Pesquisa

IMP.GE.87.0

Licenciatura em Informática 1º Ano, 1º Semestre

Licenciatura em Tecnologias e Sistemas de Informação 1º Ano, 1º Semestre

Page 2: Semana10-ordenacao-pesquisa-vetores

Agenda

Ordenação de vetores

• Ordenação por troca

• Ordenação Seleção

• Ordenação por partição (QuickSort)

• Ordenação por Inserção

Pesquisa

• Pesquisa Sequencial

• Pesquisa Binária

2

Page 3: Semana10-ordenacao-pesquisa-vetores

Objetivos

Contextualizar ordenação e pesquisa

Explorar os algoritmos de pesquisa Sequencial e Binária

Apresentar os algoritmos de ordenação por Troca, Seleção e por Inserção

3

Page 4: Semana10-ordenacao-pesquisa-vetores

introdução

Um vetor (também vulgarmente conhecido por Array), tem a capacidade em armazenar um conjunto de elementos consecutivos

Podem ser acedidos individualmente a partir de um único nome (conceito de variável).

Todos os valores do Vetor estão armazenados em memória (no formato lista).

E em alguns casos, é necessário ordenar para posterior pesquisa.

4

Page 5: Semana10-ordenacao-pesquisa-vetores

Introdução

Ordenação

• Operação realizada sobre registros

• Objetivo: organizar sobre determinada ordem

Pesquisa

• Operação realizada sobre registros

• Objetivo: localizar um registro

• Chave: campo ou chave presente em todos os registros

5

Page 6: Semana10-ordenacao-pesquisa-vetores

MÉTODOS DE ORDENAÇÃO

Quando trabalhamos com vetores (mais especificamente matrizes), existem ocasiões em que necessitamos ordena-los para facilitar as pesquisas.

• Podemos ordenar os valores de uma matriz do mais baixo para o mais alto (ordem crescente) ou ainda mais alto para o mais baixo (ordem crescente).

Sem esse tipo de ordenação toda e qualquer pesquisa numa matriz seria muito difícil e demorada.

Basicamente o que teria de se fazer é posicionar o “indice” no topo da matriz e ir comparando cada um dos elementos da matriz com o valor procurado.

Para uma matriz pequena, esse "método" não é algo tão complexo e talvez seja o mais utilizado.

• Mas para matrizes um pouco maiores, esse método consome muito tempo de processamento, tempo este que muitas vezes o sistema não dispões.

Nestes casos o melhor é ordenar a matriz para somente então começar as pesquisas.

6

Page 7: Semana10-ordenacao-pesquisa-vetores

MÉTODOS DE ORDENAÇÃO

Mas a ordenação, não irá também consumir tempo de processamento?!?

• Vai, mas apenas é realizada uma só vez!

• Durante a inicialização, ou quando o vetor sofre modificações e/ou atualizações

O tempo de processamento realizado numa ordenação é muito menor que o tempo de duas pesquisas feitas em uma base de dados desordenada.

• Sendo assim, vale a pena “ordenar”!

7

Page 8: Semana10-ordenacao-pesquisa-vetores

Ordenação de Vetores

Problema (ordenação de vetor)

Dado um vetor (𝑣) com N elementos, rearranjar esses elementos por ordem crescente. ou melhor, por ordem não decrescente, porque podem

existir valores repetidos.

Ideias base:

Existem diversos algoritmos de ordenação que são muito simples, mas com processamento mais demorado (ex: ordenação por Inserção, BubbleSort)

Existem algoritmos de ordenação mais difíceis de codificar que tem processamento menor.

8

Page 9: Semana10-ordenacao-pesquisa-vetores

Algoritmos de Ordenação de Vetores

Ordenação por Troca (BubbleSort)

Ordenação por Seleção

Ordenação por Inserção

Ordenação por Partição (QuickSort)

Outros algoritmos:

ShellSort – variante mais popular

MergeSort

HeapSort

9

Page 10: Semana10-ordenacao-pesquisa-vetores

Ordenação por Troca (BubbleSort)

Características:

O mais simples

O mais lento

Algoritmo: Bolha (bubble Sort)

Compara dois elementos

Se o elemento da esquerda for maior, troca-os

Mover uma posição à direita

Nota: acumula os elementos ordenados no

final do vetor

10

Page 11: Semana10-ordenacao-pesquisa-vetores

Ordenação por Troca (BubbleSort)

Fluxograma algoritmo

11

Page 12: Semana10-ordenacao-pesquisa-vetores

Ordenação por Troca (BubbleSort)

Código C

12

Output:

Ver demos 1 e 2

Page 13: Semana10-ordenacao-pesquisa-vetores

Ordenação por Seleção

Características Relativamente simples

Mais rápido que a ordenação por troca Mesmo número de comparações

Número menos de trocas

Mais indicado quando o tempo de troca for significativo

Método: Percorre o vetor e seleciona o menor elemento

Realiza a troca: transfere o menor elemento para o início

Nota: acumula os elementos ordenados no inicio do vetor

13

Page 14: Semana10-ordenacao-pesquisa-vetores

Ordenação por Seleção

14 More info: https://pt.wikipedia.org/wiki/Selection_sort

demo2

Page 15: Semana10-ordenacao-pesquisa-vetores

Ordenação por seleção

Código em C

15

Output:

Ver demo

Page 16: Semana10-ordenacao-pesquisa-vetores

Ordenação por Inserção

Algoritmo iterativo de N-1 passos

Em cada passo 𝑝: Coloca-se um elemento na ordem, sabendo que elementos

dos índices inferiores(entre 0 e 𝑝-1) já estão ordenados.

Algoritmo: 1. Considera-se o vetor dividido em dois sub-vetores

(esquerdo e direito), com o da esquerda ordenado e o da direita desordenado

2. Começa-se com um elemento apenas no sub-vetor da esquerda

3. Move-se um elemento de cada vez do sub-vetor da direita para o sub-vetor da esquerda, inserindo-o na posição correta por forma a manter o sub-vetor da esquerda ordenando.

4. Termina-se quando o sub-vetor da direita fica vazio

16 Mais info: https://web.fe.up.pt/~prog2/docs/vectorPesqOrd.pdf

Page 17: Semana10-ordenacao-pesquisa-vetores

Ordenação por Inserção

17

Page 18: Semana10-ordenacao-pesquisa-vetores

Ordenação por Inserção – código C

18

Output: Ver demo

Page 19: Semana10-ordenacao-pesquisa-vetores

Ordenação por Partição (QuickSort)

Algoritmo (ordenação por partição):

• Caso básico: Se o número (𝑛) de elementos do vetor (𝑣) a ordenar for 0 ou 1, não é preciso fazer nada.

• Passo de partição:

• Escolher um elemento arbitrário (𝑥) do vetor (chamado pivot)

• Partir o vetor inicial em dois sub-vetores (esquerdo e direito), com valores ≤ 𝑥 no sub-vetor esquerdo e valores ≥ 𝑥 no sub-vetor direito

Algoritmo recursivo baseado na técnica divisão e conquista

• quando parte do vetor a ordenar é de dimensão reduzida, usa um método de ordenação mais simples (ex. ‘insertionSort’ )

19 Mais info: https://web.fe.up.pt/~prog2/docs/vectorPesqOrd.pdf

Page 20: Semana10-ordenacao-pesquisa-vetores

Ordenação por Partição (QuickSort)

20

i j

≤ 𝒙 ≥ 𝒙

Page 21: Semana10-ordenacao-pesquisa-vetores

Ordenação por Partição (QuickSort)

21

Escolha pivot determina eficiência

Pior caso: pivot é o elemento mais pequeno

Melhor caso: pivot é o elemento médio

Caso médio: pivot corta vetor arbitrariamente.

Escolha do pivot:

Um dos elementos extremos do vetor

• Má escolha, se o vetor estiver ordenado

Elemento aleatório

• Envolve uso de mais uma função pesada

Mediana de três elementos (extremos do vetor e ponto médio)

• Recomendado!

Page 22: Semana10-ordenacao-pesquisa-vetores

Ordenação por Partição (QuickSort)

22

Output:

Ver demos 1 e 2

Nota: Uma forma de se fazer o quickSort é considerar o primeiro elemento como pivô

Page 23: Semana10-ordenacao-pesquisa-vetores

PESQUISA

Pesquisa sequencial e pesquisa binária

23

Page 24: Semana10-ordenacao-pesquisa-vetores

Pesquisa Sequencial

Problema (pesquisa de valor em vetor):

• Verificar se um valor existe no vetor e, no caso de existir, indicar a sua posição.

• Possíveis variantes para o caso de vetores com valores repetidos:

• A) indicar a posição da primeira ocorrência

• B) indicar a posição da última ocorrência

• C) indicar a posição de uma ocorrência qualquer

Algoritmo (pesquisa sequencial):

• Percorre sequencialmente todas as posições o vetor, da primeira para a última(a), ou da última para a primeira(b), até encontrar o valor pretendido ou chegar ao fim do vetor:

• A) caso de pretenda saber a posição da primeira ocorrência

• B) caso se pretenda saber a posição da última ocorrência

Adequado para vetores não ordenados ou pequenos

24

Page 25: Semana10-ordenacao-pesquisa-vetores

Pesquisa binária

Problema (pesquisa de valor em vetor

ordenado):

Verifica se um valor(x) existe num vetor (v)

previamente ordenado e, no caso de existir,

indicar a sua posição

No caso de vetores com valores repetidos,

consideramos a variante em que basta indicar a

posição de uma ocorrência qualquer

25

Page 26: Semana10-ordenacao-pesquisa-vetores

Pesquisa binária - algoritmo

Comparar o valor que se encontra a meio do vetor com o valor procurado, podendo acontecer 3 cenários:

• É igual ao valor procurado -> esta encontrado

• É maior do que o valor procurado ->continuar a procura (mesmo modo) no sub-vetor à esquerda da posição inspecionada

• É menor que o valor procurado -> continuar a procura (mesmo modo) no sub-vetor à direita da posição inspecionada

Se o vetor a inspecionar se reduzir a um vetor vazio, conclui-se que o valor procurado não existe.

26

Page 27: Semana10-ordenacao-pesquisa-vetores

Pesquisa binária - exemplo

27

Page 29: Semana10-ordenacao-pesquisa-vetores

IMP.GE.87.0