Algoritmos e complexidade Notas de aula - Arquivo Escolar

Algoritmos e complexidade Notas de aula - Arquivo Escolar Algoritmos e complexidade Notas de aula - Arquivo Escolar

arquivoescolar.org
from arquivoescolar.org More from this publisher
13.04.2013 Views

2. Análise de complexidade • Uma definição alternativa é C ≤ p [A](n) = max{desemp[A](d) | d ∈ D, tam(d) ≤ n} • C ≤ p é monotônica e temos C = p [A](n) ≤ C ≤ p [A](n) • Caso C = p seja monotônica as definições são equivalentes C = p [A](n) = C ≤ p [A](n) C = p [A](n) ≤ C ≤ p [A](n) é uma consequência da observação que {desemp[A](d) | d ∈ D, tam(d) = n} ⊆ {desemp[A](d) | d ∈ D, tam(d) ≤ n} Analogamente, se A ⊆ B tem-se que max A ≤ max B. Exemplo 2.1 Vamos aplicar essas noções num exemplo de um algoritmo simples. Queremos é decidir se uma sequência de números naturais contém o número 1. Algoritmo 2.1 (Busca1) Entrada Uma sequência a1, . . . , an de números em N. Saída True, caso existe um i tal que ai = 1, false, caso contrário. 1 for i :=1 to n do 2 i f (ai = 1) then 3 return true 4 end i f 5 end for 6 return f a l s e Para analisar o algoritmo, podemos escolher, por exemplo, as operações básicas O = {for, if, return} e atribuir um custo constante de 1 para cada um delas. (Observe que como “operação básica” são consideradas as operações de atribuição, incremento e teste da expressão booleana i ≤ n.) Logo as execuções possíveis são E = O ∗ e temos a função de custos 34

custo : E → R + : e ↦→ |e|. 2.2. Complexidade pessimista Por exemplo custo((for, for, if, return)) = 4. As entradas desse algoritmo são sequências de números naturais, logo, D = N ∗ e como tamanho da entrada escolhemos tam : D → N : (a1, . . . , an) ↦→ n. A função de execução atribui a sequência de operações executadas a qualquer entrada. Temos exec[Busca1](d) : D → E : (for, if) (a1, . . . , an) ↦→ ireturn caso existe i = min{j | aj = 1} (for, if) nreturn caso contrário Com essas definições temos também a função de desempenho desemp[Busca1](n) = custo ◦ exec[Busca1] : (a1, . . . , an) ↦→ 2i + 1 2n + 1 caso existe i = min{j | aj = 1} caso contrário Agora podemos aplicar a definição da complexidade pessimista para obter C ≤ p [Busca1](n) = max{desemp[Busca1](d) | tam(d) = n} = 2n + 1 = O(n). Observe que C = p é monotônica, e portanto C = p = C ≤ p . Um caso que em geral é menos interessante podemos tratar nesse exemplo também: Qual é a complexidade otimista (complexidade no caso melhor)? Isso acontece quando 1 é o primeiro elemento da sequência, logo, Co[Busca1](n) = 2 = O(1). ♦ 2.2. Complexidade pessimista 2.2.1. Metodologia de análise de complexidade Uma linguagem simples • Queremos estudar como determinar a complexidade de algoritmos metodicamente. • Para este fim, vamos usar uma linguagem simples que tem as operações básicas de 35

2. Análise <strong>de</strong> <strong>complexida<strong>de</strong></strong><br />

• Uma <strong>de</strong>finição alternativa é<br />

C ≤ p [A](n) = max{<strong>de</strong>semp[A](d) | d ∈ D, tam(d) ≤ n}<br />

• C ≤ p é monotônica e temos<br />

C = p [A](n) ≤ C ≤ p [A](n)<br />

• Caso C = p seja monotônica as <strong>de</strong>finições são equivalentes<br />

C = p [A](n) = C ≤ p [A](n)<br />

C = p [A](n) ≤ C ≤ p [A](n) é uma consequência da observação que<br />

{<strong>de</strong>semp[A](d) | d ∈ D, tam(d) = n} ⊆ {<strong>de</strong>semp[A](d) | d ∈ D, tam(d) ≤ n}<br />

Analogamente, se A ⊆ B tem-se que max A ≤ max B.<br />

Exemplo 2.1<br />

Vamos aplicar essas noções num exemplo <strong>de</strong> um algoritmo simples. Queremos<br />

é <strong>de</strong>cidir se uma sequência <strong>de</strong> números naturais contém o número 1.<br />

Algoritmo 2.1 (Busca1)<br />

Entrada Uma sequência a1, . . . , an <strong>de</strong> números em N.<br />

Saída True, caso existe um i tal que ai = 1, false, caso contrário.<br />

1 for i :=1 to n do<br />

2 i f (ai = 1) then<br />

3 return true<br />

4 end i f<br />

5 end for<br />

6 return f a l s e<br />

Para analisar o algoritmo, po<strong>de</strong>mos escolher, por exemplo, as operações básicas<br />

O = {for, if, return} e atribuir um custo constante <strong>de</strong> 1 para cada um <strong>de</strong>las.<br />

(Observe que como “operação básica” são consi<strong>de</strong>radas as operações <strong>de</strong> atribuição,<br />

incremento e teste da expressão booleana i ≤ n.) Logo as execuções<br />

possíveis são E = O ∗ e temos a função <strong>de</strong> custos<br />

34

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!