Upload
vinicius-oliveira
View
122
Download
0
Embed Size (px)
Citation preview
Material Análise de Algoritmos
Aluno: Vinícius Ferreira de Oliveira
Professora: Márcia Aparecida Fernandes
Sumário:
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
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
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.
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
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.
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.
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 -
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 .
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:
Ω = { / 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, ,
}
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.
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.
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.
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
⁄
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: ∑ .
∑ = ∑ .
...
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
, e , .
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) .
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²).