Você está na página 1de 30

SCC201/501 - Introduo Cincia de Computao II

Prof. Moacir Ponti Jr.

05  Anlise de Algoritmos (parte 4)

www.icmc.usp.br/~moacir
Instituto de Cincias Matemticas e de Computao  USP
2010/2

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

1/1

Sumrio

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

2/1

Analisando funes para exponenciao


Considere a funo abaixo que realiza exponenciao

ab

int exp1(int a, int b) { int res = 1; while (b > 0) { res *= a; b -= 1; } return res; }

Qual a complexidade dessa funo?

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

3/1

Analisando funes para exponenciao


Considere a funo abaixo que realiza exponenciao recursiva

ab

de maneira

int exp2(int a, int b) { if (b == 1) return a; else return a*exp2(a, b-1); }

Qual a complexidade dessa funo? Apesar de funcionar como uma repetio, a resoluo no to trivial assim!

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

4/1

Sumrio

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

5/1

Recorrncias
Para analisar o consumo de tempo de um algoritmo recursivo necessrio resolver uma recorrncia. Uma recorrncia uma expresso que d o valor de uma funo em termos dos valores anteriores da mesma funo. Exemplo:

F (n) = F (n 1) + 3n + 2
uma recorrncia que d o valor de

(1)

F (n) em termos de F (n 1).

Uma recorrncia pode ser vista como um algoritmo recursivo que calcula uma funo a partir de um valor inicial Mais quais os valores de

n? n = 2, 3, 4, 5, , e que F (1) = 1

Podemos supor, por exemplo, que como valor inicial.


(FEOFILOFF, 2010)
Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

6/1

Recorrncias
Uma recorrncia satisfeita por muitas funes diferentes  uma para cada valor inicial. As funes no entanto so, em geral, do mesmo tipo. Interessam geralmente funes denidas nos nmeros naturais, mas podem ser denidas em outros conjuntos: naturais maiores que 99, as 1 potncias inteiras de 2, potncias inteiras de 1 , etc. 2
Resolver uma recorrncia ...

...encontrar uma frmula fechada que d o valor diretamente em termos de seu parmetro.

Geralmente, uma combinao de polinmios, quocientes de polinmios, logaritmos, exponenciais, etc.


05Anlise de Algoritmos (p4) 2010/2 7/1

(FEOFILOFF, 2010)

Moacir Ponti Jr. (ICMCUSP)

Recorrncias
Considere:

F (n) = F (n 1) + 3n + 2

(2)

n {2, 3, 4, } H uma innidade de funes F que satisfazem a recorrncia com valor inicial F (1) diferentes (F (1) = 1, F (1) = 10 , etc.).
E suponha que

De modo mais geral, evidente que para cada nmero i existe uma (e apenas uma) funo F denida sobre {1, 2, 3, 4, } que tem valor inicial F (1) = i e satisfaz a recorrncia acima.

Gostaramos de obter uma frmula fechada para a recorrncia. Como fazer?


(FEOFILOFF, 2010)

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

8/1

Analisando funes para exponenciao


Considere (novamente) a funo abaixo que realiza exponenciao de maneira recursiva

ab

1 2 3

int exp2(int a, int b) { if (b == 1) return a; else return a*exp2(a, b-1); }

Seja

T (b) uma funo de complexidade onde b

o nmero de vezes

que termos que multiplicar a base para obter a exponenciao.

O custo das linhas 1 e 2 O (1). Quantas vezes a linha 3 ser executada?  quantas chamadas recursivas sero necessrias?
05Anlise de Algoritmos (p4) 2010/2 9/1

Moacir Ponti Jr. (ICMCUSP)

Analisando funes para exponenciao


int exp2(int a, int b) { if (b == 1) return a; else return a*exp2(a, b-1); }

1 2 3

Podemos encontrar uma relao de recorrncia para

T (b):

temos 1

comparao, 1 multiplicao e 1 subtrao e 1 retorno:

T (b) = 4 + T (b 1)
Isso signica que temos 3 operaes mais uma chamada recursiva que dever processar uma entrada de tamanho
Moacir Ponti Jr. (ICMCUSP) 05Anlise de Algoritmos (p4)

(3)

b 1.

2010/2

10 / 1

Analisando funes para exponenciao


T (b) = 4 + T (b 1) T (b) = 4 + (4 + T (b 2))

T (b) = 4k + T (b k )
Quando termina? Quando alcano o caso base, ou seja

b k = 1, ou k = b 1

Abusando da matemtica e substituindo:

T (b) = 4k + T (b k ) T (b) = 4(b 1) + T (1) T (b) = 4(b 1) + 2 T (b) = 4b 2


Moacir Ponti Jr. (ICMCUSP) 05Anlise de Algoritmos (p4) 2010/2 11 / 1

Analisando funes para exponenciao


int exp2(int a, int b) { if (b == 1) return a; else return a*exp2(a, b-1); } exp2?

1 2 3

Qual seria ento a complexidade de Como

T (b) = 4b 2, podemos dizer que O (b), ou seja, linear. Observao: aqui usamos b para facilitar o entendimento, mas quer
dizer tambm o tamanho da entrada, nesse caso relativo ao tamanho do expoente.

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

12 / 1

Uma funo para exponenciao que no linear


Podemos melhorar a performance do algoritmo que calcula utilizando propriedades matemticas:

ab

Se

b b

perceba que se b for par, reduzi o problema pela metade (b/2). perceba que mesmo no caso mpar, no prximo passo teremos b par, e podemos utilizar a mesma propriedade acima.
for mpar, ento

for par, ento

ab = (a a)b/2

Se

ab = a (ab1 )

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

13 / 1

Analisando funes para exponenciao


int exp3(int a, int b) { if (b == 1) return a; if ((b % 2) == 0) return exp3(a*a, b/2); else return a*exp3(a, b-1); }
Qual a ordem de crescimento de Para

1 2 3 4 5

exp3?

par, temos 1 comparao, 1 operao de resto, outra

comparao, 1 multiplicao, 1 diviso e o retorno = 6 operaes, mais a quantidade de operaes necessrias para resolver Ento no caso em que
Moacir Ponti Jr. (ICMCUSP)

par:

T (b) = 6 + T (b/2)

T (b/2).
2010/2

05Anlise de Algoritmos (p4)

14 / 1

Analisando funes para exponenciao


int exp3(int a, int b) { if (b == 1) return a; if ((b % 2) == 0) return exp3(a*a, b/2); else return a*exp3(a, b-1); }

1 2 3 4 5

Para

mpar, temos 1 comparao, 1 operao de resto, outra

comparao, 1 multiplicao, 1 subtrao e o retorno = 6 operaes, mais a quantidade de operaes necessrias para resolver Ento no caso em que

T (b 1).

mpar:

T (b) = 6 + T (b 1)
2010/2 15 / 1

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

Uma funo para exponenciao que no linear


Assim, temos, para

exp3:

b b b

T (b) = 6 + T (b/2) mpar: T (b ) = 6 + T (b 1)


par:

mas como no prximo passo do caso mpar, estaremos no caso par, ento: mpar:

T (b) = 6 + (6 + T

b 1 2

podemos aproximar

T (b) por um limite superior, T (b) = 12 + T


12 + T

b1
2

b
2
2010/2 16 / 1

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

Uma funo para exponenciao que no linear


a cada chamada recorrente, o problema dividido pela metade:

T (b) = 12 + T

b
2

= 12 + 12 + T

b
4

= 12 + 12 + 12 + T = 12k + T
o caso base ocorre quando: ou seja: 2k

b
8

b /2 k = 1 b = 2k k = log2 b

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

17 / 1

Analisando funes para exponenciao


int exp3(int a, int b) { if (b == 1) return a; if ((b % 2) == 0) return exp3(a*a, b/2); else return a*exp3(a, b-1); }
A complexidade de Em

1 2 3 4 5

exp3,

desconsiderando constantes,

O (log b)

exp1 exp3

exp2,

o problema era reduzido em 1 unidade a cada etapa

 um sinal de que eram lineares. Em o problema dividido por um fator (2) a cada etapa 

caracterstico de algoritmos de complexidade logaritmica.


Moacir Ponti Jr. (ICMCUSP) 05Anlise de Algoritmos (p4) 2010/2 18 / 1

Sumrio

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

19 / 1

Torres de Hani
Problema que consiste em trs postes e um nmero de discos de diferentes tamanhos que podem deslizar pelos postes. preciso mover os discos de um poste a outro seguindo as seguintes regras: a) mover um disco de cada vez e b) um disco maior no pode car sobre um disco menor.

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

20 / 1

Torres de Hani
Tentar resolver esse problema um bom exerccio de como pensar recursivamente preciso entender o caso base e como reduzir o problema a uma instncia menor. A estratgia bsica :
1 2 3

Mover n 1 discos do poste origem para o intermedirio Mover 1 disco (disco base) do poste origem para o destino Mover n 1 discos do poste intermedirio para o destino
05Anlise de Algoritmos (p4) 2010/2 21 / 1

Moacir Ponti Jr. (ICMCUSP)

Torres de Hani
void Hanoi(int tam, char ori, char des, char interm) { if (tam == 1) printf("Mova disco de %c para %c\n", ori, des); else { 3 Hanoi(tam-1, ori, interm, des); 4 Hanoi(1, ori, des, interm); 5 Hanoi(tam-1, interm, des, ori); } }
Qual a ordem de crescimento para esse algoritmo? (

1 2

T (1) = 2)

Para encontrar uma frmula temos: uma comparao, uma movimentao de 1 disco e duas movimentaes de

T (n) = 1 + T (1) + 2 T (n 1)
Moacir Ponti Jr. (ICMCUSP) 05Anlise de Algoritmos (p4)

n 1 discos.
2010/2 22 / 1

Torres de Hani
Frmula bsica

T (n) = 1 + T (1) + 2 T (n 1) = 3 + 2 T (n 1)
expandindo...

T (n) = 3 + 2 3 + 4 T (n 2) = 3 + 2 3 + 4 3 + 8 T (n 3)

T (n) = 3(1 + 2 + + 2k 1 ) + 2k T (n k )

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

23 / 1

Torres de Hani

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

24 / 1

Torres de Hani
T (n) = 3(1 + 2 + + 2k 1 ) + 2k T (n k ). Veja que, para n = 5, e desconsiderando o primero termo (soma
Considere constante), teremos:

T (5) = 2k (5 k )
= 24 (5 4) = 24
Podemos dizer que

T (n) 2n1 .

A complexidade do problema de ordem exponencial, mais especicamente

O (2n ).

Ao olharmos de forma supercial, pareceria linear. No entanto, a cada passo o problema dividido em duas partes menores, o que fez grande diferena.

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

25 / 1

Torres de Hani
Problema inventado por douard Lucas em 1883, com base em uma lenda (inventada por ele ou que o inspirou?). O criador do universo, no incio dos tempos criou em Hanoi uma grande sala com trs postes. Num dos postes colocou 64 discos dourados de tamanhos diferentes, do maior para o menor. Os sacerdotes de Hani, criados na mesma poca, de acordo com a lenda, realizam movimentos com os discos de um poste para outro seguindo as duas regras do problema. Segundo a estria, quando o ltimo movimento do quebra-cabeas for feito, o mundo chegara ao m.

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

26 / 1

Sumrio

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

27 / 1

Mtodo de substituio
Existem muitos mtodos para se obter uma frmula fechada para recorrncias. Um dos mais utilizados o mtodo de substituio. tambm conhecido como expandir, conjecturar e vericar. Consiste em duas etapas:
1 2

Pressupor a formula da soluo (expandir e conjecturar), Usar induo matemtica para mostrar que a soluo funciona.

O nome vem da substituio do palpite pela funo resposta. Pode-se ajustar o palpite para encontrar funes mais exatas. Pode ser usado para estabelecer limites superiores ou inferiores sobre uma recorrncia. As anlises que zemos at agora contemplam as partes de expandir e conjecturar. No entanto, ainda precisamos vericar por induo se o palpite est correto.

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

28 / 1

Mtodo de substituio
T (n) verdadeiro para n 1. Utilizamos para a induo o caso base, T (1), supomos T (n ) e provamos por hiptese que T (n 1) verdadeiro. Exemplo (exp2): tnhamos a frmula T (n ) = 4 + T (n 1) e chegamos frmula fechada T (n ) = 4n 2.
Queremos provar que um dado

Para n = 1 fcil ver que a frmula est correta, pois T (1) = 2. Agora, tome n > 1 e suponha que a frmula fechada acima vale com n 1 no lugar de n. T (n) = 4 + T (n 1) = 4 + [4(n 1) 2] = 4 + [4n 6] = 4n 2 dessa forma, provamos por induo que nosso palpite verdadeiro e, portanto, exp2 O (n).
05Anlise de Algoritmos (p4) 2010/2 29 / 1

Moacir Ponti Jr. (ICMCUSP)

Bibliograa
ZIVIANI, N. Projeto de algoritmos: com implementaes em Pascal e C. (seo 1.4). 2.ed. Thomson, 2004. CORMEN, T.H. et al. Algoritmos: Teoria e Prtica (Captulo 4). Campus. 2002. FEOFILOFF, P. Recorrncias. Disponvel em:

http://www.ime. usp.br/~pf/analise_de_algoritmos/aulas/recorrencias.html.

Moacir Ponti Jr. (ICMCUSP)

05Anlise de Algoritmos (p4)

2010/2

30 / 1

Você também pode gostar