análise de algoritmos

26
Material Análise de Algoritmos Aluno: Vinícius Ferreira de Oliveira Professora: Márcia Aparecida Fernandes

Upload: vinicius-oliveira

Post on 24-Jul-2015

123 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Análise de algoritmos

Material Análise de Algoritmos

Aluno: Vinícius Ferreira de Oliveira

Professora: Márcia Aparecida Fernandes

Page 2: Análise de algoritmos

Sumário:

Page 3: Análise de algoritmos

Ementa:

1 – Conceitos básicosModelo de computação, algoritmo, instância, análise de algoritmo, tamanho de entrada e tempo de execução.

2 – Fundamentos matemáticos- Somas e recorrências;- Notação assintótica;- Indução matemática;- Fórmula fechada.

3 – Técnica Divide-and-Conquer (Decomposição)- Mergesort;- Quicksort;- Heapsort.

4 – Programação dinâmica - Produto de n matrizes;- Árvore de busca ótima;- Maior subsequência comum;

5 – Algoritmos gulosos (Greedy)- Seleção de atividades;- Problema da mochila.

6 – Algoritmos aproximados- Razão de aproximação;Caixeiro viajante.

7 – Algoritmos em grafos- Buscas;- Árvores geradoras de custo mínimo.

8 – Estatísticas ordenadas

Page 4: Análise de algoritmos

Cronograma

Data Valor Conteúdo

Prova 1 16/04 25,00 Tópicos 1, 2 e 3

Prova 2 31/05 30,00 Tópicos 4 e 5

Prova 3 02/07 30,00 Tópicos 6, 7 e 8

Trabalho 25 e 28/06 15,00 -

Vista final 04/07 - -

Referências:

Jon Kleinberg e Éva Tardos - Algorithm Design

Thomas H. Cormen e Charles E. Leiserson - Algoritmos Teoria e Pratica

Laira Vieira Toscani e Paulo A. S. Veloso - Complexidade de Algoritmos

Page 5: Análise de algoritmos

Introdução

1 - Conceitos básicos

Algoritmo

Definição:

É um procedimento computacional bem definido que toma um valor (conjunto de valores) como entrada e produz um conjunto de valores como saída.

Ferramenta computacional para resolver um problema bem especificado. Em geral, o enunciado do problema especifica, de maneira geral, a relação entre a entrada e saída.

Exemplo 1:Problema: Somar uma sequência de n valores inteiros. - Entrada: Uma sequência de n valores inteiros. - Saída: A soma dos valores da sequência.

Exemplo 2:Problema: Ordenar uma sequência de n elementos inteiros não negativos em ordem não decrescente.- Entrada: Uma sequência de n inteiros não negativos. a1, a2, ... , an.- Saída: Uma permutação (reordenação) dos n elementos. a1’, a2’, ... , an’ tal que a1’ <= a2’ <= ... <= an’.A sequência 1, 2, 3, 4, 5, 6, 7, 8, 9 e 10 é uma entrada para um possível algoritmo do exemplo anterior.

Uma instância de um problema é uma entrada que satisfaz todas as restrições impostas no problema.

Um algoritmo é correto se, para toda instância, ele para com a saída correta.

Análise de Algoritmos: Descreve os recursos exigidos para a execução do algoritmo.

1 - Tempo de execução. 2 - Espaço ocupado.

Deve-se definir um modelo de computação, desde que os algoritmos devem ser implementados em um computador, que estabelece as operações envolvidas e seus custos. Os mais importantes recursos são:

1) Um processador genérico e as instruções são executadas sequencialmente. 2) Operações tais como aritmética e atribuições são consideradas de tempo constante.

Page 6: Análise de algoritmos

Na prática, o custo destas operações não é relevante (estas operações são ignoradas), ou seja, considerando-se que devem existir apenas operações mais significativas para encontrar a solução do problema.

Tempo de execução: É o tempo do algoritmo em função do tamanho da entrada n.Desde que o tempo de execução cresce à medida que cresce o tamanho da entrada, o tempo de execução é uma função de acordo com o tamanho da entrada.

O tamanho da entrada é o número de itens na entrada e, em geral, é denotado por n. Este valor (tamanho) depende do problema.

Exemplo 1: Em um problema envolvendo grafos, o tamanho da entrada pode ser o número de vértices (n) e o número de arestas (m).

Exemplo 2: Em um problema de ordenação, a operação significativa é a comparação.

Assim, o tempo de execução é uma função f(n) também conhecida como função custo ou complexidade de tempo.

Função Custo, Função Complexidade, Complexidade de Tempo e Eficiência são denominações para expressar a função que diz como o tempo de execução cresce à medida que cresce o tamanho da entrada. Notação: f(n).

Exemplo de funções: f(n) = an + b f(n) = 2n²+3n+1 f(n)=2n

f(n) = n + nlogn f(n) = n! f(n) = logn f(n) = c

Exemplo: Seja um jogo de cartas. As cartas são distribuídas e cada jogador toma cada carta da mesa com a mão direita e a coloca na mão esquerda, de forma ordenada, da seguinte maneira: - Toma a carta e procura sua posição ordenada, da direita para a esquerda, entre as cartas que estão na mão esquerda. Algoritmo Ordena-Inserção

A sequência de entrada é dada por um vetor A[1 ... n ], onde n é o número de cartas, ou seja, o tamanho da entrada.

Numeração Pseudo-Código Tempo de Exec. Qtd. De Exec.1. for j ← 2 to n C1 n2. do chave ← A[j] C2 n-13. “Insira chave na sequência ordenada A[1 ... j]” 0 n-14. i ← j-1 C4 n-15. while i > 0 && A[i] > chave C5 (Sum[2,n] Tj)6. do A[i+1] ← A[i] C6 (Sum[2,n] Tj-1)7. i ← i-1 C7 (Sum[2,n] Tj-1)8. A[i+1] ← chave C8 n-1

Page 7: Análise de algoritmos

Análise do Algoritmo Ordena-Inserção

Supondo que análise considere um passo do algoritmo como sendo cada linha do pseudocódigo, tem-se que o custo de cada linha i é relativo ao tempo constante. Assim, o tempo de execução é dado pela soma do custo total de cada linha, que é dado pelo produto do tempo de execução da linha e o número de vezes que a linha é executada.

Assuma que T(n) é o tempo de execução do algoritmo, onde n é o comprimento da sequência de cartas, representada pelo vetor A.

Seja Tj o numero de vezes que o teste da linha 5 é executado para cada carta j, com j=2, ..., n . Assim, o número de vezes que a linha 5 é executada para toda carta j é a

∑j=2

n

Tj.

Desta maneira, o número de vezes que as linha 6 e 7 são executadas é ∑j=2

n

Tj−1.

Portanto, T(n) = C1 * n + C2 * (n-1) + C4 * (n-1) + C5 * ∑j=2

n

Tj + (C6 + C7) * ∑j=2

n

(Tj−1) +

C8 * (n-1).

Como o valor de Tj depende da ordem em que se encontram as cartas na sequência A, analisam-se casos para este valor. Desta maneira, a análise do algoritmo é feita por casos.

Pior caso: A sequência de entrada é dada na ordem inversa à ordem desejada. Neste caso, são feitos j - 1 testes, um para cada carta da mão esquerda e mais um teste para deixar o laço quando i = 0.

Daí, Tj = j, tal que ∑j=2

n

Tj= ∑j=2

n

j = (n*(n+1)/2) - 1 e ∑j=2

n

Tj−1 = ∑j=2

n

j−1 = ∑j=2

n

j - ∑j=2

n

1 =

(n*(n+1)/2) – 1 – (n-1) = (n*(n-1))/2.

Portanto, T(n) = C1 * n + C2 * (n-1) + C4 * (n-1) + C5 * [((n*(n+1))/2) – 1] + (C6+C7) * [(n*(n-1))/2] + C8 * (n-1). T (n) = ( (C5 + C6 + C7)/2) * n² + (C1 + C2 + C4 + C5/2 (-C6-C7)/2 + C8) – (C2+C4+C5+C8)

Mas, como as somas de Ci’s são constantes tem-se que T(n) = an² + bn - c, onde a, b e c são constantes que representam as somas de Ci’s, ou seja, o tempo de execução, neste caso, é uma função quadrática.

Melhor caso: A sequência de entrada se encontra ordenada na ordem desejada.

Page 8: Análise de algoritmos

Neste caso, a linha 5 é executada apenas uma vez e as linhas 6 e 7 não executadas.

Assim, Tj = 1, ∑j=2

n

Tj=∑j=2

n

1= n – 1 e ∑j=2

n

Tj−1 = 0.

Portanto: T(n) = C1 * n + C2 * (n-1) + C4 * (n-1) + C5 * (n-1) + C8 * (n-1)T(n) = (C1 + C2 + C4 + C5 + C8) * n – (C2 + C4 + C5 + C8)T(n) = a * n – b onde a e b são constantes. Caso Médio: Considera-se a metade dos testes feitos no pior caso, ou seja, T = j/2. Neste caso, T(n) = a’ * n² + b’ * n + c’, onde a’, b’ e c’ são constantes resultantes das somas das constantes Ci’s.

Page 9: Análise de algoritmos

Exercícios

1. Considere o pseudocódigo alternativo.maior_ou_igual(x,y)1. i ← 02. while (1 = 1) do3. if ((x-i) = y) retorne “sim”4. If ((y-i) = x) retorne “não”5. i ← i + 1

Isto é um algoritmo? Justifique sua resposta.

2. Considere o pseudocódigo abaixo, que decide se a universidade estará fechada em algum dia.fechada_universidade(x)1. y ← random()2. if (y>0.5) return “sim”3. else return “no”

Isto é um algoritmo? Justifique.

3. Dado o código abaixo e T(n) o número de vezes que “Olá” é impresso. Expresse T(n) como um somatório e avalie este somatório.1. for i ← 1 to n do2. for j ← 1 to 3*i + 1 do3. Imprima “Olá”

2.1.1 - Usando a Figura 2.2 como modelo, ilustre a operação de INSERTION-SORT no arranjo A = { 31, 41, 59, 26, 41, 58}.

Figura 2.2

2.1.2 - Inverter sinal linha 5.

2.1.3 -

Page 10: Análise de algoritmos

2 – Fundamentos matemáticos

Recorrências Exemplo: Torre de Hanói: n é o número de discos e T(n) é o número de movimentos para transferir os discos. T(1) = 1 T(n) = 2T(n-1) + 1, se n > 1

Avaliar recorrências : significa encontrar a fórmula fechada.

Ex1: Fórmula fechada do Torre de Hanói.T(n) = T(n-1)+T(n-2).

Formas de avaliar: 1 - Método da Expansão 2 - Árvores de Recursão 3 - Teorema Master4 - Indução Matemática

Notação Assintótica

Definição:

Uma função f(n) domina assintoticamente uma função g(n) se existem constantes positivas c e n0, tais que para todo n >= n0, g(n) <= f(n).

Notação O

Dadas g(n) e f(n) duas funções, esta notação define um limite superior assintótico superior assintótica para g(n) em f(n).

Em outras palavras:

O (f(n)) = {g(n)/ constantes positivas c e n0 tais que 0 <= g(n) <= cf(n), n >= n0}

Neste caso, diz-se que g(n) = O(f(n)), por abuso de linguagem.

Graficamente:

Exemplo:

Seja , onde , , e são constantes positivas.

Suponha e mostre que .

Page 11: Análise de algoritmos

Deve-se mostrar que existem constantes positivas e tais que, para todo

, .

----------------------- Page 8-----------------------

P á g i n a | 8

Mas, , para . Então

.

Portanto, para e , .

Exemplo:

Seja e , mostre que .

Deve-se mostrar que existem constantes positivas e tais que para

todo , .

Como para todo , tomando , a desigualdade

acima é verdadeira. Para e , .

Notação Ω

Esta notação define um limite assintótico inferior para uma dada função .

Em outras palavras:

Page 12: Análise de algoritmos

Ω = { / constantes positivas e tais que, ,

}

Neste caso, diz-se que Ω , por abuso de linguagem.

Graficamente:

Exemplo:

Sejam e , mostrar que Ω .

----------------------- Page 9-----------------------

P á g i n a | 9

Deve-se mostrar que existem constantes positivas e tais que, para todo

, .

Para todo , . Então para e ,

Ω .

Notação ���

Esta notação define um limite assintótico inferior e superior para uma função

.

Assim:

= { / constantes positivas , , e tais que, ,

Page 13: Análise de algoritmos

}

Neste caso, diz-se que , por abuso de linguagem.

Graficamente:

Tal definição constitui um limite apertado.

Exemplo:

e . Mostrar que .

----------------------- Page 10-----------------------

P á g i n a | 10

Sabe-se que , então deve-se mostrar que .

Ou seja, provar que existem constantes positivas e tais que para todo

, , ou seja, .

Assim, , daí .

Para , o lado esquerdo da inequação é menor ou igual a zero para todo

.

Para , o lado direito é maior ou igual a zero.

Page 14: Análise de algoritmos

Assim, para e , .

Logo, como e , .

Exemplo:

e . Mostrar que .

Deve-se mostrar que existem constantes positivas , , e tais que, para

todo , , ou seja, ⁄

.

Dividindo os três lados da inequação por , tem-se que e ⁄

⁄ .

De ⁄ ⁄ tem-se ⁄ , quando e então .

Daí, para e ⁄ , a equação é verdadeira.

Page 15: Análise de algoritmos

De ⁄ ⁄ tem-se ⁄ ⁄ . Então para todo , o lado

esquerdo é sempre negativo e para ⁄ o lado direito é sempre maior ou igual a

zero.

⁄ ⁄

Para , , e , temos que .

Classes de Comportamento

O algoritmo independe do tamanho da entrada.

Supõe-se a divisão do problema em subproblemas, não havendo, em

geral, a combinação das soluções.

----------------------- Page 11-----------------------

P á g i n a | 11

Para cada elemento na entrada realizou-se um trabalho de tempo

constante.

Divisão do problema em subproblemas, havendo a combinação das

soluções.

Os elementos da entrada foram analisados aos pares.

Há, por exemplo, três laços aninhados.

Page 16: Análise de algoritmos

Utilizou-se a força bruta.

Definição: Um algoritmo é dito eficiente se o tempo de execução é polinomial.

Operações com Notação Assintótica

( ) ( ), se c for uma constante.

( ) ( ), se c for uma constante.

( )

( ) ( )

( ( ))

∑ ∑

Resolvendo Somas com Notação Assintótica

Exemplo:

a

1 Opção: Resolução Direta

Page 17: Análise de algoritmos

2a Opção: Utilizando a Indução Matemática

Dada a soma, para mostrar o limite superior, toma-se uma função f(n) como

palpite e prova-se este limite através de indução matemática.

.

Mostrar que por indução matemática é mostrar que existem

e tais que .

Caso Base: Para um pequeno, mostrar ∑ .

----------------------- Page 12-----------------------

P á g i n a | 12

Hipótese de Indução: ∑ .

Tese de Indução: ∑ .

∑ = ∑ .

...

Page 18: Análise de algoritmos

Exemplo:

Mostrar que .

o

1 Palpite: e então mostrar que , ou seja, .

2o Palpite: e então mostrar que , ou seja, .

Caso Base: Para n = 1, ∑ é verdade para todo .

Hipótese de Indução: Suponha a afirmação verdadeira para , isto é,

∑ .

Tese de Indução: Mostrar que .

∑ ∑ .

Se , daí e ⁄ .

Como e são positivos, e ⁄ . Assim, para

Page 19: Análise de algoritmos

, e , .

Page 20: Análise de algoritmos

Método da Expansão

Dadas as equações da recorrência, expande-se a equação geral até que seja possível obter uma soma. Através desta, ou de sua fórmula fechada, pode-se determinar um limite assintótico (em geral, superior) para o comportamento da recorrência.

Exemplo: T(1) = 1 T(n) = T(n - 1) + n, se n > 1

T(n) = T(n - 2) + (n - 1) + n = T(n - 3) + (n - 2) + (n - 1) + n ... = T(n - i) + (n - (i - 1)) + (n - (i - 2)) + ... + (n - 0) = 1 + 2 + 3 + ... + n

Então, se n - i = 1, então i = n – 1 e T(n) = ∑i=1

n

i = n (n+1)/2 = θ(n²).

Método da Substituição

Para mostrar que T(n) = O(f(n)) para alguma função, utiliza-se a definição de notação assintótica e indução matemática.

O objetivo é mostrar que T(n) <= c*f(n), para c > 0 e n0 >= 0.

Caso Base: Em geral, utiliza-se o caso base da recorrência, ou seja, se este caso é dado por T(a) = b, deve-se verificar se T(a) = b <= c*f(a) é verdade para c>0.

Hipótese de Indução: Assuma que a afirmação é verdadeira para qualquer valor de n expresso no termo recorrente T(n - 1) <= c*f(a) é verdade para c>0 .

Tese de Indução: Mostrar que T(n) <= c*f(n) para algum c>0, utilizando a hipótese de indução.

Exemplo: T(1) = 1 T(n) = T(n - 1) + n, se n > 1

Supondo f(n) = n² .

Caso Base: Para n = 1, T(1) = 1 <= c*f(1), ou seja, 1 <= c*1². Então para c >= 1, a afirmação é verdadeira para n = 1.

Hipótese de Indução: Suponha que para n 1, T(n 1) .

Page 21: Análise de algoritmos

Tese de Indução: Deve-se mostrar que T(n) <= c*f(n) para c > 0. Mas T(n) = T(n-1) + n e pela hipótese de indução tem-se que T(n) <= c*(n - 1)² + n.

T(n) = T(n - 1) + n <= c*(n - 1)² + n = cn² - 2cn + c + n <= cn², se 2cn >= c + n (2c-1)n>=c, então n >= c/(2c-1). Mas 2c - 1 > 0 e c > ½.

Para c = 1 e no = 1, T(N) = O(N²).