Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Paradigma de Divisão e Conquista
II Trabalho Prático da Disciplina de ATP II Gustavo Eloi, Taygor Pradella
2
Introdução Através do estudo de algoritmos baseados no método de Divisão e Conquista pode-se notar a eficiência desta ideia em diversas aplicações. A multiplicação com números muito grandes, ao contrário do que se pressupõe, se torna mais eficiente a partir de números de grandes de dimensões. Tratando-se de algoritmos já existente, é possível a leitura e compreensão dos métodos em sites diversos, assim o método utilizado para o QuickSort difere do esquema padrão.
3
Divisão e Conquista Esta técnica consiste em dividir um problema maior recursivamente em problemas menores até que o problema possa ser resolvido diretamente. Então a solução do problema inicial é dada através da combinação dos resultados de todos os problemas menores computados. Vários problemas podem ser solucionados através desta técnica, como o de ordenação que trataremos neste trabalho.
4
Divisão e Conquista PROBLEMA SUBPROBLEMA SUB SOLUÇÃO SOLUÇÃO SOLUÇÃO
Conquistar: Combinar: PROBLEMA SUBPROBLEMA SUB SOLUÇÃO SOLUÇÃO SOLUÇÃO
5
Multiplicação de inteiros
Apresentação do Pseudocódigo: Karatsuba-Ofman (u, v, n) 1 se n ≤ 3 2 então devolva u · v 3 senão m ← ⌈n/2⌉ 4 p ← ⌊u/10m⌋ 5 q ← u mod 10m 6 r ← ⌊v/10m⌋ 7 s ← v mod 10m 8 pr ← Karatsuba-Ofman (p, r, m) 9 qs ← Karatsuba-Ofman (q, s, m) 10 y ← Karatsuba-Ofman (p+q, r+s, m+1) 11 x ← pr · 102m + (y − pr − qs) · 10m + qs 12 devolva x
6
Descrição detalhada Sejam u e v dois números com no máximo n dígitos cada. Suponha, por enquanto, que n é par. Seja p o número formado pelos n/2 primeiros dígitos (dígitos mais significativos) de ue seja q o número formado pelos n/2 últimos dígitos (dígitos menos significativos) de u. Assim, u = p 10n/2 + q . Defina r e s analogamente para v, de modo que v = r 10n/2 + s. Teremos então uv = pr 10n + (ps+qr) 10n/2 + qs .
7
Descrição detalhada Esta expressão reduz a multiplicação de dois números com no máximo n dígitos cada a quatro multiplicações (a saber, p por r, p por s, q por r e q por s) de números com no máximo n/2 dígitos cada. Infelizmente, essa redução não é suficiente para tornar a multiplicação mais eficiente. Agora observe que os três números de que precisamos do lado direito de (*) — a saber pr, (ps+qr) e qs — podem ser obtidos com apenas três multiplicações, pois ps + qr = y − pr − qs , sendo y = (p+q)(r+s), e portanto a equação (*) pode ser substituída por uv = pr 10n + ( y − pr − qs) 10n/2 + qs .
8
Conclusão do Método É bem verdade que esta equação envolve duas adições e duas subtrações adicionais, mas essas operações consomem muito menos tempo que as multiplicações. Se n não é par, basta trocar n/2 por k = ⌈n/2⌉. Teremos então u = p 10k + q e v = r 10k + s e portanto uv = pr 102k + ( y − pr − qs) 10k + qs . Esta é a base do algoritmo.
9
Algoritmo de QuickSort
Este método baseia-se na divisão da tabela em duas sub-tabelas, dependendo de um elemento chamado pivô, normalmente o 1º elemento da tabela. Uma das sub-tabelas contém os elementos menores que o pivô enquanto a outra contém os maiores. O pivô é colocado entre ambas, ficando na posição correcta. As duas sub-tabelas são ordenadas de forma idêntica, até que se chegue à tabela com um só elemento.
10
Descrição detalhada Quicksort (A, p, r) 1 se p < r
Apresentação do Pseudocódigo: O Quicksort é um algoritmo de ordenação: ele recebe um vetor A[p..r] e rearranja o vetor em ordem crescente. Quicksort (A, p, r) 1 se p < r 2 então q ← Separe (A, p, r) 3 Quicksort (A, p, q) 4 Quicksort (A, q+1, r) Obs: q ≥ p e q < r; portanto os vetores A[p..q] e A[q+1 .. r] são estritamente menores que o vetor original A[p..r]. Isso garante que a execução do algoritmo termina, mais cedo ou mais tarde.
11
Descrição detalhada O algoritmo Separe rearranja o vetor A[p..r] e determinar um índice q tal que p ≤ q e cada elemento de A[p..q] é menor ou igual a x , q < r e cada elemento de A[q+1 .. r] é maior ou igual a x para algum x. O número x é o pivô da separação. Separe (A, p, r) 1 x ← A[p] 2 i ← p−1 3 j ← r+1 4 enquanto 0 = 0 faça 5 repita j ← j−1 6 até que A[j] ≤ x 7 repita i ← i+1 8 até que A[i] ≥ x 9 se i < j 10 então troque A[i] ↔ A[j] 11 senão devolva j
12
Descrição detalhada p i j r ≤ x ≥ x
Para entender como e por que o algoritmo funciona como deveria, observe que no início de cada iteração do loop que começa na linha 4 temos as seguintes propriedades invariantes: A[p..i] ≤ x , i < j , A[j..r] ≥ x . Na última passagem pela linha 4, o vetor A[i+1 .. j−1] consiste em zero ou mais elementos < x seguidos de zero ou mais elementos > x ou zero ou mais elementos < x , seguidos de exatamente um elemento igual a x , seguido de zero ou mais elementos > x . p i j r ≤ x ≥ x
13
Descrição detalhada No primeiro caso, o algoritmo chega à linha 11 com j = i−1. No segundo caso, o algoritmo chega à linha 11 com j = i. Assim o algoritmo cumpre sua função; em particular, que p ≤ j <r na linha 11. p j i r ≤ x ≥ x p j=i r ≤ x = x ≥ x
14
Visualização do Método e comparação com Bubble
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.