You are on page 1of 69

Projeto e Anlise de Algoritmos

Paradigmas de Projeto de
Algoritmos
Antonio Alfredo Ferreira Loureiro
loureiro@dcc.ufmg.br
http://www.dcc.ufmg.br/~loureiro

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Paradigmas de projeto de algoritmos


Induo
Recursividade
Tentativa e erro
Diviso e conquista
Balanceamento
Programao dinmica
Algoritmos gulosos
Algoritmos aproximados

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica (fraca)


Seja P (n) um predicado definido para os inteiros n, e seja n0 um inteiro fixo.
Suponha que as duas afirmaes abaixo sejam verdadeiras:
1. P (n0) V.
2. Para todos inteiros k n0,
se P (k) V ento P (k + 1) V.
Logo, a afirmao
para todos inteiros n
V.

n0, P (n)

P(n)

n0
UFMG/ICEx/DCC

Inteiros
PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica


Tcnica aparece pela primeira vez no trabalho do italiano Francesco Maurolico em 1575.
No sculo XVII, Pierre de Fermat e Blaise Pascal usam essa tcnica em seus
trabalhos. Fermat d o nome de mtodo do descendente infinito.
Em 1883, Augustus De Morgan descreve o processo cuidadosamente e d o
nome de induo matemtica.
Tcnica extremamente importante para a Cincia da Computao.
Para visualizar a idia da induo matemtica, imagine uma coleo de domins colocados numa seqncia (formao) de tal forma que a queda do
primeiro domin fora a queda do segundo, que fora a queda do terceiro, e
assim sucessivamente, at todos os domins carem.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica (fraca)


A prova de uma afirmao por induo matemtica feita em dois passos:
1. Passo base: provado que P (n0) V para um dado n0 especfico.
2. Passo indutivo: provado que para todos inteiros k n0,
se P (k) V ento P (k + 1) V.
O passo indutivo pode ser escrito formalmente como:
8 inteiros k

n0, se P (k) ento P (k + 1)

Para provar o passo indutivo deve-se:


supor que P (k) V, onde k um elemento especfico mas escolhido arbitrariamente de tal forma que seja maior ou igual a n0.
provar que P (k + 1) V.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica (fraca)


Este princpio pode ser expresso pela seguinte regra de inferncia:
[P (n0) ^ 8k(P (k) ! P (k + 1))] ! 8nP (n).

P(n)

...
P (n 0)

P (n 1) P (n 2)

P (k )

P (k+1)

Inteiros

Numa prova por induo matemtica no assumido que P (k) verdadeiro


para todos os inteiros! mostrado que se for assumido que P (k) verdadeiro, ento P (k + 1) tambm verdadeiro.

Os prximos 10 exemplos ilustram o uso do Princpio da Induo Matemtica e esto apresentados aqui para
estudo e referncia.
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica


Exemplo 1
Prove que para todos inteiros n

1,

1 + 2 + ... + n =

n(n + 1)
2

Prova (por induo matemtica):


1. Passo base: P (n0) = P (1): Para n0 = 1, 1 = 1(1+1)
= 1 e a frmula
2
verdadeira para n0 = 1.
2. Passo indutivo: se a frmula verdadeira para n = k ento deve ser verdadeira para n = k + 1, i.e., P (k) ! P (k + 1).
Suponha que a frmula seja verdadeira para n = k, i.e.,
k(k + 1)
P (k) : 1 + 2 + . . . + k =
2
para algum inteiro k 1. [hiptese indutiva]
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica


Exemplo 1
Deve-se mostrar que
P (k + 1) : 1 + 2 + . . . + (k + 1) =

(k + 1)(k + 2)
2

Sabe-se que
k(k + 1)
+ (k + 1)
2
k(k + 1)
2(k + 1)
=
+
2
2
k2 + 3k + 2
=
2
(k + 1)(k + 2)
=
2

1 + 2 + . . . + k + (k + 1) =

[Isto era o que devia ser provado.]

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica


Exemplo 2
Prove que para todos inteiros n

0,

0 + 1 + 2 + ... + n =

n(n + 2)
2

E RRADO !

Prova (por induo matemtica):


1. Passo base: P (n0) = P (0): Para n0 = 0, 0 = 0(0+2)
= 0 e a frmula
2
verdadeira para n0 = 0.
2. Passo indutivo: se a frmula verdadeira para n = k ento deve ser verdadeira para n = k + 1, i.e., P (k) ! P (k + 1).
Suponha que a frmula seja verdadeira para n = k, i.e.,
k(k + 2)
k2 + 2k
P (k) : 0 + 1 + 2 + . . . + k =
=
2
2
para algum inteiro k 0. [hiptese indutiva]
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

Princpio da induo matemtica


Exemplo 2
Deve-se mostrar que
(k + 1)(k + 3)
k2 + 4k + 3
P (k + 1) : 0 + 1 + 2 + . . . + (k + 1) =
=
2
2
Sabe-se que
k2 + 2k
0 + 1 + 2 + . . . + k + (k + 1) =
+ (k + 1)
2
k2 + 2k + 2(k + 1)
=
2
k2 + 4k + 2
=
2
[Assim, no foi possvel derivar a concluso a partir da hiptese. Isto significa que o predicado
original falso.]

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

10

Princpio da induo matemtica


Exemplo 10
Seja o inteiro n 1. Mostre que qualquer regio quadrada de tamanho 2n 2n,
com um quadrado removido, a regio restante pode ser preenchida com peas
no formato L, como mostrado abaixo.

Nota: A pea no formato L constituda por trs quadrados de tamanho 1 1.

Prove que para todos os inteiros n


1, P (n): Qualquer regio quadrada
de tamanho 2n 2n, com um quadrado removido, a regio restante pode ser
preenchida com peas no formato L.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

25

Princpio da induo matemtica


Exemplo 10
Prova (por induo matemtica):
1. Passo base: P (n0) = P (1). P(1) V j que uma regio quadrada de
tamanho 2 2, com um quadrado removido, a regio restante pode se
preenchida com peas no formato L, como mostrado abaixo.

2. Passo indutivo: se a frmula verdadeira para n = k ento deve ser verdadeira para n = k + 1, i.e., P (k) ! P (k + 1).

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

26

Princpio da induo matemtica


Exemplo 10
P (k): Qualquer regio quadrada de tamanho 2k 2k , com um quadrado removido, a regio
restante pode ser preenchida com peas no formato L. [hiptese indutiva]
Deve-se mostrar P (k + 1): Qualquer regio quadrada de tamanho 2k+1 2k+1 , com um
quadrado removido, a regio restante pode ser preenchida com peas no formato L.
Considere uma regio quadrada de tamanho 2k+1 2k+1 , com um quadrado removido. Divida
essa regio em quatro regies de tamanho 2k 2k como mostrado abaixo.
Temos trs regies 2k 2k com nenhum quadrado removido e uma regio 2k 2k com um quadrado removido.
Ou seja, a regio 2k+1 2k+1 possui apenas um quadrado
removido.
Pela hiptese indutiva, a regio 2k 2k , com um quadrado
removido, pode ser preenchida com peas no formato L.
O problema passa a ser como a mesma hiptese indutiva
pode ser aplicada s outras trs regies.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

27

Princpio da induo matemtica


Exemplo 10
Temporariamente remova um quadrado de cada regio 2k 2k que est completa como
mostrado na figura abaixo esquerda.
Pela hiptese indutiva cada uma dessas trs regies 2k 2k pode ser preenchida com peas no
formato L. No entanto, para resolvermos o problema da pea removida em cada uma dessas trs
regies basta colocarmos uma pea L exatamente sobre esses trs buracos como mostrado
na figura abaixo direita.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

28

Princpio da induo matemtica


Exemplo 10
Assim, uma regio quadrada de tamanho 2k+1 2k+1 , com um quadrado removido, a regio
restante pode ser preenchida com peas no formato L, como mostrado na figura abaixo.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

29

Princpio da induo matemtica (forte)


Seja P (n) um predicado que definido para inteiros n, e seja a e b inteiros fixos,
sendo a b. Suponha que as duas afirmaes seguintes sejam verdadeiras:
1. P (a), P (a + 1), . . . , P (b) so V. (Passo base)
2. Para qualquer inteiro k b,
se P (i) V para a i < k ento P (k) V, i.e., P (i) ! P (k).
Logo, a afirmao para todos inteiros n
a, P (n) V. (A suposio
que P (i) V para a i < k chamada de hiptese indutiva.)
Passo Base

Inteiros

P (i )
Hipotese Indutiva
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

30

Princpio da induo matemtica (forte):


Exemplo 11
Seja a sequncia a1, a2, a3, . . . definida como
a1 = 0
a2 = 2
ak = 3 abk/2c + 2, k

Prove que an par, para n

1.

Prova (por induo matemtica):


1. Passo base: Para n = 1 e n = 2 a propriedade vlida j que a1 = 0 e
a2 = 2.
2. Passo indutivo: Vamos supor que ai par para todos inteiros i, 1 i < k.
[hiptese indutiva]

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

31

Princpio da induo matemtica (forte):


Exemplo 11
Se a propriedade vlida para 1 i < k, ento vlida para k, ou seja, ak
par [o que deve ser mostrado].
Pela definio de a1, a2, a3, . . .
ak = 3 abk/2c + 2, k

O termo abk/2c par pela hiptese indutiva j que k


3 e 1 bk/2c < k.
Desta forma, 3 abk/2c par e 3 abk/2c + 2 tambm par, o que mostra que
ak par.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

32

Induo matemtica e algoritmos


til para provar asseres sobre a correo e a eficincia de algoritmos.
Consiste em inferir uma lei geral a partir de instncias particulares.
Seja T um teorema que tenha como parmetro um nmero natural n. Para
provar que T vlido para todos os valores de n, provamos que:
1. T vlido para n = 1;
[PASSO BASE ]
2. Para todo n > 1,
[PASSO INDUTIVO ]
se T vlido para n,
ento T vlido para n + 1.
Provar a condio 2 geralmente mais fcil que provar o teorema diretamente
(podemos usar a assero de que T vlido para n).
As condies 1 e 2 implicam T vlido para n = 2, o que junto com a condio
2 implica T tambm vlido para n = 3, e assim por diante.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

33

Limite superior de equaes de recorrncia


A soluo de uma equao de recorrncia pode ser difcil de ser obtida.
Nesses casos, pode ser mais fcil tentar advinhar a soluo ou obter um limite
superior para a ordem de complexidade.
Advinhar a soluo funciona bem quando estamos interessados apenas em
um limite superior, ao invs da soluo exata.
Mostrar que um certo limite existe mais fcil do que obter o limite.
Por exemplo:

T (2n) 2T (n) + 2n
T (2) = 1,

1,

definida para valores de n que so potncias de 2.


O objetivo encontrar um limite superior na notao O, onde o lado direito
da desigualdade representa o pior caso.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

34

Induo matemtica para resolver equao de


recorrncia
T (2) = 1,
T (2n) 2T (n) + 2n

1,

definida para valores de n que so potncias de 2.


Procuramos f (n) tal que T (n) = O(f (n)), mas fazendo com que f (n) seja
o mais prximo possvel da soluo real para T (n) (limite assinttico firme).
Vamos considerar o palpite f (n) = n2.
Queremos provar que
T (n) f (n) = O(f (n))
utilizando induo matemtica em n.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

35

Induo matemtica para resolver equao de


recorrncia
Prove que T (n) f (n) = O(f (n)), para f (n) = n2 , sendo
T (2) = 1,
T (2n) 2T (n) + 2n

1,

definida para valores de n que so potncias de 2.

Prova (por induo matemtica):


1. Passo base:
T (n0 ) = T (2): Para n0 = 2, T (2) = 1 f (2) = 4, e o passo base V.
2. Passo indutivo: se a recorrncia verdadeira para n ento deve ser verdadeira para 2n,
i.e., T (n) ! T (2n) (lembre-se que n uma potncia de 2; conseqentemente o nmero
seguinte a n 2n).
Reescrevendo o passo indutivo temos:
Predicado(n) ! Predicado(2n)
(T (n) f (n)) ! (T (2n) f (2n))
T (2n) 2T (n) + 2n 1
2n2 + 2n 1
2n2

+ 2n
2
2n + 2n

[Definio da recorrncia]
[Pela hiptese indutiva podemos substituir T (n)]

1 < (2n)2 [A concluso verdadeira?]


1 < 4n2
[Sim!]

Essa ltima inequao o que queremos provar. Logo, T (n) = O(n2 ).


UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

36

Induo matemtica para resolver equao de


recorrncia
Vamos tentar um palpite menor, f (n) = cn, para alguma constante c.
Queremos provar que
T (n) f (n) = cn = O(f (n))
utilizando induo matemtica em n.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

37

Induo matemtica para resolver equao de


recorrncia
Prove que T (n) f (n) = O(f (n)), para f (n) = cn, sendo
T (2) = 1,
T (2n) 2T (n) + 2n

1,

definida para valores de n que so potncias de 2.

Prova (por induo matemtica):


1. Passo base:
T (n0 ) = T (2): Para n0 = 2, T (2) = 1 f (2) = 2c, e o passo base V.
2. Passo indutivo: se a recorrncia verdadeira para n ento deve ser verdadeira para 2n,
i.e., T (n) ! T (2n).
Reescrevendo o passo indutivo temos:

Predicado(n) ! Predicado(2n)
(T (n) f (n)) ! (T (2n) f (2n))
(T (n) cn)) ! (T (2n) 2cn)
T (2n)

UFMG/ICEx/DCC

2T (n) + 2n 1
[Definio da recorrncia]
2cn + 2n 1
[Pela hiptese indutiva podemos substituir T (n)]
2cn + (2n 1)
2cn + 2n 1 > 2cn [A concluso (T (2n) 2cn) no vlida]
PAA

Paradigmas de Projeto de Algoritmos

38

Induo matemtica para resolver equao de


recorrncia
Logo:
a funo f (n) = cn cresce mais lentamente que T (n);
T (n) est entre cn e n2, mais especifamente;
e T (n) 6 f (n) = cn.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

39

Induo matemtica para resolver equao de


recorrncia
Vamos tentar uma funo entre n e n2, como, por exemplo, f (n) = n log n.
Queremos provar que
T (n) f (n) = n log n = O(f (n))
utilizando induo matemtica em n.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

40

Induo matemtica para resolver equao de


recorrncia
Prove que T (n) f (n) = O(f (n)), para f (n) = n log n, sendo
T (2) = 1,
T (2n) 2T (n) + 2n

1,

definida para valores de n que so potncias de 2.

Prova (por induo matemtica):


1. Passo base:
T (n0 ) = T (2): Para n0 = 2, T (2) = 1 f (2) = 2 log 2, e o passo base V.
2. Passo indutivo: se a recorrncia verdadeira para n ento deve ser verdadeira para 2n,
i.e., T (n) ! T (2n).
Reescrevendo o passo indutivo temos:
Predicado(n) ! Predicado(2n)
(T (n) f (n)) ! (T (2n) f (2n))
(T (n) n log n)) ! (T (2n) 2n log 2n)
T (2n) 2T (n) + 2n 1
2n log n + 2n 1

PAA

1 < 2n log 2n
[A concluso verdadeira?]
1 < 2n log n + 2n [Sim!]

2n log n + 2n
2n log n + 2n

UFMG/ICEx/DCC

[Definio da recorrncia]
[Podemos substituir T (n)]

Paradigmas de Projeto de Algoritmos

41

Induo matemtica para resolver equao de


recorrncia
Para o valor de f (n) = n log n, a diferena entre as frmulas de apenas 1.
De fato, T (n) = n log n

n + 1 a soluo exata de
T (n) = 2T ( n
2) + n
T (1) = 0

que descreve o comportamento do algoritmo de ordenao Mergesort.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

42

Induo matemtica e algoritmos


Comentrios finais
Induo uma das tcnicas mais poderosas da Matemtica que pode ser
aplicada para provar asseres sobre a correo e a eficincia de algoritmos.
No caso de correo de algoritmos, comum tentarmos identificar invariantes
para laos.
Induo pode ser usada para derivar um limite superior para uma equao de
recorrncia.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

43

Recursividade
Um procedimento que chama a si mesmo, direta ou indiretamente, dito ser
recursivo.
Recursividade permite descrever algoritmos de forma mais clara e concisa,
especialmente problemas recursivos por natureza ou que utilizam estruturas
recursivas.
Por exemplo, rvore binria de pesquisa:
Todos os registros com chaves menores esto na sub-rvore esquerda;
Todos os registros com chaves maiores esto na sub-rvore direita.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

44

Recursividade
Algoritmo para percorrer todos os registros em ordem de caminhamento
central:
1. Caminha na sub-rvore esquerda na ordem central;
2. Visita a raiz;
3. Caminha na sub-rvore direita na ordem central.
No caminhamento central, os ns so visitados em ordem lexicogrfica das
chaves.
C ENTRAL(p)
1 if p 6= nil
2
then C ENTRAL(p".esq)
3
Visita n
4
C ENTRAL(p".dir )

UFMG/ICEx/DCC

Faz algum processamento

PAA

Paradigmas de Projeto de Algoritmos

45

Implementao de recursividade
Usa-se uma pilha para armazenar os dados usados em cada chamada de
um procedimento que ainda no terminou.
Todos os dados no globais vo para a pilha, registrando o estado corrente
da computao.
Quando uma ativao anterior prossegue, os dados da pilha so recuperados.
No caso do caminhamento central:
Para cada chamada recursiva, o valor de p e o endereo de retorno da
chamada recursiva so armazenados na pilha.
Quando encontra p=nil o procedimento retorna para quem chamou utilizando o endereo de retorno que est no topo da pilha.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

46

Problema de terminao em procedimentos


recursivos
Procedimentos recursivos introduzem a possibilidade de iteraes que podem
no terminar:
Existe a necessidade de considerar o problema de terminao.
fundamental que a chamada recursiva a um procedimento P esteja sujeita
a uma condio B, a qual se torna no-satisfeita em algum momento da computao.
Esquema para procedimentos recursivos: composio C de comandos Si e
P.
P if B then C[Si, P ]
Para demonstrar que uma repetio termina, define-se uma funo f (x),
sendo x o conjunto de variveis do programa, tal que:
1. f (x) 0 implica na condio de terminao;
2. f (x) decrementada a cada iterao.
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

47

Problema de terminao em procedimentos


recursivos
Uma forma simples de garantir terminao associar um parmetro n para
P (no caso por valor) e chamar P recursivamente com n 1.
A substituio da condio B por n > 0 garante terminao.
P if n > 0 then P[Si, P (n

1)]

necessrio mostrar que o nvel mais profundo de recurso finito, e tambm


possa ser mantido pequeno, pois cada ativao recursiva usa uma parcela de
memria para acomodar as variveis.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

48

Quando no usar recursividade


Nem todo problema de natureza recursiva deve ser resolvido com um algoritmo recursivo.
Estes podem ser caracterizados pelo esquema P if B then (S, P ).
Tais programas so facilmente transformveis em uma verso no recursiva
P (x := x0; while B do S).

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

49

Exemplo de quando no usar recursividade


Clculo dos nmeros de Fibonacci
f0 = 0,
f1 = 1,
fn = fn 1 + fn 2 ,
Soluo:

onde

1
fn = p [ n
5

8n

2.

) n],

5+1
1, 618 a razo de ouro.
2

O procedimento recursivo (F IBONACCI R EC) obtido diretamente da equao o


seguinte:
F IBONACCI R EC(n)
1 if n < 2
2
then F IBONACCI R EC
3
else F IBONACCI R EC
UFMG/ICEx/DCC

n
F IBONACCI R EC(n
PAA

1) + F IBONACCI R EC(n

Paradigmas de Projeto de Algoritmos

2)
50

Exemplo de quando no usar recursividade


O programa extremamente ineficiente porque recalcula o mesmo valor
vrias vezes.
A complexidade de espao para calcular fn O( n).
A complexidade de tempo para calcular fn, considerando como medida de
complexidade o nmero de adies, tambm O( n).

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

51

Verso iterativa do clculo de Fibonacci


F IBONACCI I TER(n)
1
2
3
4
5
6
7

Variveis auxiliares: Aux, k, Fant, F


Fant
0
F
1
for k
2 to n
do Aux
F + Fant
Fant
F
F
Aux
F IBONACCI I TER
F

O programa tem complexidades de tempo O(n) e de espao O(1).


Deve-se evitar recursividade quando existe uma soluo iterativa.
Comparao das verses recursiva e iterativa:
n
Recursiva
Iterativa
UFMG/ICEx/DCC

20
1s
1/3 ms

PAA

30
2 min
1/2 ms

50
21 dias
3/4 ms

Paradigmas de Projeto de Algoritmos

100
109 anos
1,5 ms
52

Funo definida recursivamente (1)


Uma funo dita ser definida recursivamente se ela refere-se a si mesma.
Funes recursivas tm um papel fundamental em teoria da computao.
Exemplo: Funo 91 de McCarthy.

M (n) =

n 10
se n > 100
M (M (n + 11)) se n 100

M (99) = M (M (110))
= M (100)
= M (M (111))
= M (101)
= 91

UFMG/ICEx/DCC

PAA

A funo 91 de
McCarthy uma
funo recursiva
que retorna 91
para todos os inteiros n 100 e retorna n
10
para n > 100. Essa funo foi proposta pelo cientista da computao
John McCarthy, ganhador do ACM
Turing Award de 1971, responsvel
por cunhar o termo Inteligncia Artificial.

Paradigmas de Projeto de Algoritmos

56

Funo definida recursivamente (2)


Funo de Ackermann

A(0, n) = n + 1
A(m, 0) = A(m

1, 1)

A(m, n) = A(m

1, A(m, n

A(1, 2) = A(0, A(1, 1))


= A(0, A(0, A(1, 0)))

1))

Matemtico e lgico alemo (18961962), principal formulador do desenvolvimento do sistema


lgico conhecido como o
clculo de epsilon, originalmente devido a David
Hilbert (18621943), que
se tornaria a base da lgica de Bourbaki e
da teoria dos jogos.

= A(0, A(0, A(0, 1)))


= A(0, A(0, 2))
= A(0, 3)
= 4

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

57

Funo definida recursivamente (3)


Funo de Ackermann
Essa funo possui uma taxa de crescimento impressionante:
A(4, 3) = A(3, 265536

3)

Funo importante em Cincia da Computao que est relacionada com computabilidade.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

58

Funo definida recursivamente (4)


Funo de Ackermann
A funo de Ackermann pode ser representada por uma tabela infinita.
(m, n)

A(m, n)

n+1

n+2

11

2n + 3

13

29

61

125

13

65533

65533

A(4, 65533)

A(4, A(5, 1))

A(4, A(5, 2))

A(4, A(5, 3))

A(5, 1)

A(5, A(5, 1))

A(5, A(6, 1))

A(5, A(6, 2))

A(5, A(6, 3))

265536

A(3, 265536

3)

A(3, A(4, 3))

8 2n

Os valores da funo de Ackermann crescem muito rapidamente:


A(4, 2) maior que o nmero de partculas do universo elevado a potncia
200.
A(5, 2) no pode ser escrito como uma expanso decimal no universo fsico.
Alm da linha 4 e coluna 1, os valores s podem ser expressos usando a
prpria notao da funo.
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

59

Funo recursiva que no bem definida


Seja a funo G : Z+ ! Z. Para todos inteiros n
G(n) =

8
>
>
1
>
>
<

1:

se n = 1,

n)
1
+
G(
se n par,
2
>
>
>
>
: G(3n 1) se n mpar e n > 1.

A funo G bem definida? No!


G(1) = 1

G(2) = 1 + G(1) = 1 + 1 = 2
G(3) = G(8) = 1 + G(4) = 1 + (1 + G(2))
= 1 + (1 + 2) = 4
G(4) = 1 + G(2) = 1 + 2 = 3
G(5) = G(14) = 1 + G(7) = 1 + G(20)
= 1 + (1 + G(10))
= 1 + (1 + (1 + G(5))) = 3 + G(5)
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

60

Funo recursiva que no sabe se bem definida


Seja a funo H : Z+ ! Z. Para todos inteiros n
H(n) =

8
>
>
1
>
>
<

1:

se n = 1,

n)
1
+
H(
se n par,
2
>
>
>
>
: H(3n + 1) se n mpar e n > 1.

A funo H bem definida? No se sabe!


A funo computvel para todos inteiros n, 1 n < 109.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

61

Recursividade
Comentrios finais
Tcnica bastante adequada para expressar algoritmos que so definidos recursivamente.
No entanto, deve ser usada com muito cuidado.
Na maior parte dos casos funciona como uma tcnica conceitual ao invs de
uma tcnica computacional.
Algoritmos recursivos so normalmente modelados por uma equao de
recorrncia.
Ao se fazer a anlise de um algoritmo recursivo, deve-se tambm analisar o
crescimento da pilha.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

62

Algoritmos tentativa e erro (Backtracking)


Tentativa e erro: decompor o processo em um nmero finito de sub-tarefas parciais que devem ser exploradas exaustivamente.
O processo de tentativa gradualmente constri e percorre uma rvore de sub-tarefas.
Algoritmos tentativa e erro no seguem uma regra fixa
de computao:
Passos em direo soluo final so tentados e
registrados.
Caso esses passos tomados no levem soluo
final, eles podem ser retirados e apagados do registro.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

63

Algoritmos tentativa e erro (Backtracking)


Quando a pesquisa na rvore de solues cresce rapidamente necessrio
usar algoritmos aproximados ou heursticas que no garantem a soluo
tima mas so rpidas.
Algoritmos aproximados:
Algoritmos usados normalmente para resolver problemas para os quais no
se conhece uma soluo polinomial.
Devem executar em tempo polinomial dentro de limites provveis de qualidade absoluta ou assinttica.
Heurstica:
Algoritmo que tem como objetivo fornecer solues sem um limite formal de
qualidade, em geral avaliado empiricamente em termos de complexidade
(mdia) e qualidade das solues.
projetada para obter ganho computacional ou simplicidade conceitual,
possivelmente ao custo de preciso.
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

64

Tentativa e erro: Passeio do cavalo


Tabuleiro com n n posies: cavalo se movimenta segundo regras do xadrez.
Problema: partindo da posio (x0 , y0 ), encontrar, se existir, um passeio do cavalo que visita
todos os pontos do tabuleiro uma nica vez.
Tenta um prximo movimento:
T ENTA
1 Inicializa seleo de movimentos
2 repeat
3
Seleciona prximo candidato ao movimento
4
if aceitvel
5
then Registra movimento
6
if tabuleiro no est cheio
7
then Tenta novo movimento
8
if no bem sucedido
9
then Apaga registro anterior
10 until (movimento bem sucedido) _ (acabaram-se candidatos ao movimento)

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

65

Tentativa e erro: Passeio do cavalo


O tabuleiro pode ser representado por uma matriz n n.
A situao de cada posio pode ser representada por um inteiro para recordar o histrico das ocupaes:
t[x, y] = 0, campo hx, yi no visitado;
t[x, y] = i, campo hx, yi visitado no i-simo movimento, 1 i n2.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

66

Tentativa e erro: Passeio do cavalo


Regras do xadrez para o movimento do cavalo
2

2Dir e 1Cima

1Dir e 2Cima

1Esq e 2Cima

2Esq e 1Cima

8
6

2Esq e 1Baixo

UFMG/ICEx/DCC

1Esq e 2Baixo

PAA

1Dir e 2Baixo

Paradigmas de Projeto de Algoritmos

2Dir e 1Baixo

67

Implementao do passeio do cavalo


PASSEIO D O C AVALO(n)

1
2
3
4
5
6
7
8
9
10
11

Parmetro: n (tamanho do lado do tabuleiro)


Variveis auxiliares:
i, j
t[1. .n, 1. .n]
q
s
h[1. .8], v[1. .8]
s
{1, 2, 3, 4, 5, 6, 7, 8}
h[1. .8]
[2, 1, 1, 2, 2, 1, 1, 2]
v[1. .8]
[1, 2, 2, 1, 1, 2, 2, 1]
for i
1 to n
do for j
1 to n
do t[i, j]
0
t[1, 1]
1
T ENTA (2, 1, 1, q)
if q
then print Soluo
else print No h soluo

UFMG/ICEx/DCC

PAA

Contadores
Tabuleiro de n n
Indica se achou uma soluo
Movimentos identificados por um n
Existem oito movimentos possveis
Conjunto de movimentos
Movimentos na horizontal
Movimentos na vertical
Inicializa tabuleiro

Escolhe uma casa inicial do tabuleiro


Tenta o passeio usando backtracking
Achou uma soluo?

Paradigmas de Projeto de Algoritmos

68

Implementao do passeio do cavalo


T ENTA(i, x, y, q)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Parmetros: i (i-sima casa); x, y (posio no tabuleiro); q (achou soluo?)


Variveis auxiliares: xn, yn, m, q1
m
0
repeat
m
m+1
q1
false
xn
x + h[m]
yn
y + v[m]
if (xn 2 s) ^ (yn 2 s)
then if t[xn, yn] = 0
then t[xn, yn]
i
if i < n2
then T ENTA(i + 1, xn, yn, q1)
if q1
then t[xn, yn]
0
else q1
true
until q1 _ (m = 8)
q
q1

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

69

Algoritmos tentativa e erro (Backtracking)


Comentrios finais
Tcnica usada quando no se sabe exatamente que caminho seguir para
encontrar uma soluo.
No garante a soluo tima.
Essa tcnica pode ser vista ainda como uma variante da recursividade
Ao se fazer a anlise de um algoritmo que usa backtracking, deve-se tambm
analisar o crescimento do espao de solues.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

70

Diviso e conquista (1)


Consiste em dividir o problema em partes menores, encontrar solues para
essas partes (supostamente mais fcil), e combin-las em uma soluo
global.
Geralmente leva a solues eficientes e elegantes, principalmente se
forem recursivas.
Basicamente essa tcnica consiste das seguintes fases (executadas nesta
ordem):
1. Diviso (particionamento) do problema original em sub-problemas similares ao original mas que so menores em tamanho;
2. Resoluo de cada sub-problema sucessivamente e independentemente
(em geral de forma recursiva);
3. Combinao das solues individuais em uma soluo global para todo o
problema.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

71

Diviso e conquista (2)


Um algoritmo de diviso e conquista normalmente relacionado a uma
equao de recorrncia que contm termos referentes ao prprio problema.
T (n) = aT ( nb ) + f (n),
onde a indica o nmero de sub-problemas gerados, b o tamanho de cada um
deles e f (n) o custo para fazer a diviso.
Paradigma bastante usado em Cincia da Computao em problemas
como:
Ordenao: Mergesort, Quicksort (Tecnicamente falando, o Quicksort poderia ser
chamado de um algoritmo conquista e diviso);
Pesquisa: Pesquisa Binria;
Algoritmos aritmticos: multiplicao de inteiros, multiplicao de matrizes,
FFT (Fast Fourier Transform);
Algoritmos geomtricos: Convex Hull, Par mais prximo;
...
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

72

Diviso e conquista: Exemplo 1


Seja A um vetor de inteiros, A[1..n], n

1 que no est ordenado.

Pede-se:
Determine o maior e o menor elementos desse vetor usando diviso e conquista;
Determine o custo (nmero de comparaes) para achar esses dois elementos supondo que A possui n elementos.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

73

Diviso e conquista: Exemplo 1


Cada chamada de MaxMin4 atribui s variveis Max e Min o maior e o menor
elementos em A[Linf ]. .A[Lsup].
M AX M IN 4(Linf , Lsup, Max, Min)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Variveis auxiliares: Max1, Max2, Min1, Min2, Meio


if (Lsup Linf ) 1
Condio da parada recursiva
then if A[Linf ] < A[Lsup]
then Max
A[Lsup]
Min
A[Linf ]
else Max
A[Linf ]
Min
A[Lsup]
else Meio
b Linf +Lsup
c
Acha o menor e maior elementos de cada partio
2
M AX M IN 4(Linf , Meio, Max1, Min1)
M AX M IN 4(Meio+1, Lsup, Max2, Min2)
if Max1 > Max2
then Max
Max1
else Max
Max2
if Min1 < Min2
then Min
Min1
else Min
Min2
UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

74

Diviso e conquista: Exemplo 1 (Anlise)


Seja f (n) o nmero de comparaes entre os elementos de A, que possui n
elementos.
f (n) = 1,
para n 2,
f (n) = f (bn/2c) + f (dn/2e) + 2, para n > 2.
Quando n = 2i para algum inteiro positivo i, temos que:
f (n) = 2f ( n
2) + 2

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

75

Diviso e conquista: Exemplo 1 (Anlise)


Resolvendo esta equao de recorrncia (em funo de n e i), temos:
f (n) = 2f ( n2 ) + 2
2f ( n2 ) = 22 f ( 2n2 ) + 22
22 f ( 2n2 ) = 23 f ( 2n3 ) + 23
...
2i 3 f ( 2ni 3 ) = 2i 2 f ( 2ni 2 ) + 2i
2i 2 f ( 2ni 2 ) = 2i 1 f ( 2ni 1 ) + 2i
= 2i 1 f (2) + 2i 1
= 2 i 1 + 2i 1

f (2i) = 2f (2i 1 ) + 2
2f (2i 1 ) = 22 f (2i 2 ) + 22
22 f (2i 2 ) = 23 f (2i 3 ) + 23
...
2i 3 f (23 ) = 2i 2 f (22 ) + 2i 2
2i 2 f (22 ) = 2i 1 f (21 ) + 2i 1
= 2i 1 f (2) + 2i 1
= 2 i 1 + 2i 1

2
1

Fazendo a expanso desta equao temos:


2i
2i

2 f (22 )
3 f (23 )

22 f (2i 2 ) + 22
2f (2i 1 ) + 2
f (2i)
f (n)

Logo, f (n) = 3n/2


UFMG/ICEx/DCC

=
=
...
=
=
=
=
=

2i
2i

+ 2i
1 + 2i

1
1

+ 2i

2 i 1 + 2i 1 + 2 i 2 + . . . + 23
2 i 1 + 2i 1 + 2 i 2 + . . . + 23 + 22
2i 1 + 2 i 1 + 2 i 2 + . . . + 2 3 + 2 2 + 2
Pi 1 k
i
1
2
+ k=1 2 = 2i 1 + 2i 2
n
+ n 2 = 3n
2.
2
2

2 para o melhor caso, pior caso e caso mdio.


PAA

Paradigmas de Projeto de Algoritmos

76

Diviso e conquista: Exemplo 1 (Anlise)


Conforme mostrado anteriormente, o algoritmo apresentado neste exemplo
timo.
Entretanto, ele pode ser pior do que os j apresentados, pois, a cada
chamada recursiva, salva Linf , Lsup, Max e Min, alm do endereo de retorno da chamada para o procedimento.
Alm disso, uma comparao adicional necessria a cada chamada recursiva para verificar se Lsup Linf 1 (condio de parada).
O valor de n + 1 deve ser menor do que a metade do maior inteiro que pode
ser representado pelo compilador, para no provocar overflow na operao
Linf + Lsup.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

77

Diviso-e-conquista:
Alguns comentrios
Este paradigma no aplicado apenas a problemas recursivos.
Existem pelo menos trs cenrios onde diviso e conquista aplicado:
1. Processar independentemente partes do conjunto de dados.
Exemplo: Mergesort.
2. Eliminar partes do conjunto de dados a serem examinados.
Exemplo: Pesquisa binria.
3. Processar separadamente partes do conjunto de dados mas onde a soluo de uma parte influencia no resultado da outra.
Exemplo: Somador apresentado.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

97

Balanceamento
No projeto de algoritmos, importante procurar sempre manter o balanceamento na sub-diviso de um problema em partes menores.
Diviso e conquista no a nica tcnica em que balanceamento til.
Considere o seguinte exemplo de ordenao:
E XEMPLO D E O RDENAO(n)
1 for i = 1. .n 1 do
2
Selecione o menor elemento de A[i. .n] e troque-o com o elemento A[i].

Inicialmente o menor elemento de A[1. .n] trocado com o elemento A[1].


O processo repetido para as seqncias n 1, n 2, . . ., 2, com os
n 1, n 2, . . ., 2 elementos, respectivamente, sendo que em cada passo
o menor elemento trocado com o elemento A[i].

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

98

Balanceamento: Anlise do exemplo


O algoritmo leva equao de recorrncia:
T (n) = T (n
T (1) = 0

1) + n

para o nmero de comparaes entre elementos.


Substituindo:
T (n) = T (n 1) + n
T (n 1) = T (n 2) + n
...
T (2) = T (1) + 1

1
2

e adicionando lado a lado, obtemos:


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

1=

1)

n(n
2

Logo, o algoritmo O(n2).


UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

99

Balanceamento: Anlise do exemplo


Embora o algoritmo possa ser visto como uma aplicao recursiva de diviso
e conquista, ele no eficiente para valores grandes de n.
Para obter eficincia assinttica necessrio fazer um balanceamento:
Dividir o problema original em dois sub-problemas de tamanhos aproximadamente iguais, ao invs de um de tamanho 1 e o outro de tamanho
n 1.
Comentrio:
A anlise da equao de recorrncia nos mostra a razo do comportamento
quadrtico desse algoritmo.
essa equao tambm que sugere como o algoritmo pode ter um desempenho bem melhor, se um balanceamento for usado.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

100

Exemplo de balanceamento: Mergesort


Intercalao:
Unir dois arquivos ordenados gerando um terceiro arquivo ordenado
(merge).
Colocar no terceiro arquivo o menor elemento entre os menores dos dois
arquivos iniciais, desconsiderando este mesmo elemento nos passos posteriores.
Este processo deve ser repetido at que todos os elementos dos arquivos de
entrada sejam escolhidos.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

101

Algoritmo de ordenao: Mergesort


1. Divida recursivamente o vetor a ser ordenado em dois, at obter n vetores
de um nico elemento.
2. Aplique a intercalao tendo como entrada dois vetores de um elemento,
formando um vetor ordenado de dois elementos.
3. Repita este processo formando vetores ordenados cada vez maiores at
que todo o vetor esteja ordenado.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

102

Exemplo de balanceamento:
Implementao do Mergesort
M ERGESORT(A, i, j)

1
2
3
4
5

Parmetros: A (vetor); i, j (limites inferior e superior da partio)


Varivel auxiliar: m (meio da partio)
if i < j
then m
b (i+j)
c
2
M ERGESORT(A, i, m)
M ERGESORT(A, m + 1, j)
M ERGE(A, i, m, j)

Considere n como sendo uma potncia de 2.


Merge(A, i, m, j) recebe duas seqncias ordenadas A[i..m] e A[(m + 1)..j] e produz uma
outra seqncia ordenada dos elementos de A[i..m] e A[m + 1..j].
Como A[i..m] e A[m + 1..j] esto ordenados, Merge requer no mximo n

1 comparaes.

Merge seleciona repetidamente o menor dentre os menores elementos restantes em A[i..m] e


A[m + 1..j]. Caso empate, retira de qualquer uma delas.

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

103

Anlise do Mergesort
Na contagem de comparaes, o comportamento do Mergesort pode ser representado por:
T (n) = 2T ( n
2) + n
T (1) = 0.

1,

No caso dessa equao de recorrncia sabemos que o custo (veja a resoluo


desta equao na parte de induo ou usando o Teorema Mestre):
T (n) = n log n

n + 1.

Logo, o algoritmo O(n log n).

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

104

Balanceamento:
Alguns comentrios
Para o problema de ordenao, o balanceamento levou a um resultado muito
superior:
O custo passou de O(n2) para O(n log n).
Balanceamento uma tcnica presente em diferentes aspectos algortmicos
de Cincia da Computao como Sistemas Operacionais.
Tambm uma tcnica importante quando o modelo computacional usado
o PRAM (Parallel Random Access Machine).

UFMG/ICEx/DCC

PAA

Paradigmas de Projeto de Algoritmos

105

You might also like