Você está na página 1de 35

Bibliografia

Matemtica Concreta
Fundamentos para
Cincia da Computao
2 Edio
Ronald L. Graham, Donald E.
Knuth, and Oren Patashnik
(Reading, Massachusetts:
Addison-Wesley, 1994)

Recurso
Aplicaes:
Lingstica
regras de gramtica por Panini Sec. 5 AC
Chomsky
Gramtica formais
Parsers de linguagens de programao
Matemtica:
Lgica:
Axiomatizao
Aritmtica de Peano
Provas Recursivas
Computao
Programao Recursiva
Em linguagens imperativas
Em linguagens funcionais
Estrutura de dados recursivas
Listas, rvores, grafos
Complexidade de Algoritmos
Computabilidade

Recurso

T(n) =

Recurso

T(n) = T(n-1) +

Recurso

T(n) = T(n-1) + 1 +

Recurso

T(n) = T(n-1) + 1 + T(n-1)

Recurso
T(1) = 1
T(n) = 2 T(n-1) + 1
T(1) + 1 = 2
T(n) + 1 = 2 T(n-1) + 2
Seja U(n) = T(n)+1
U(1) = 2
U(n) = 2 U(n-1)
U(n) = 2n

T(n) = 2n - 1

Recurso
Nova regra: no pode mover direto entre A e C

Quantos movimentos para transferir n peas entre do


pino A para o pino C?

Recurso
A

T(n) =

Recurso
A

T(n) = T(n-1) +

Recurso
A

T(n) = T(n-1) + 1 +

Recurso
A

T(n) = T(n-1) + 1 + T(n-1) +

Recurso
A

T(n) = T(n-1) + 1 + T(n-1) + 1

Recurso
A

T(n) = T(n-1) + 1 + T(n-1) + 1 + T(n-1)

Recurso
T(1) = 2
T(n) = 3 T(n-1) + 2
T(1) + 1 = 3
T(n) + 1 = 3 T(n-1) + 3
Seja U(n) = T(n)+1
U(1) = 3
U(n) = 3 U(n-1)
U(n) = 3n

T(n) = 3n - 1

Recurso
Em quantas regies (no mximo), pode-se dividir uma pizza (ou
o plano)com n retas?
L(0)=1
L(1)=2
L(2)=4
L(3)=7
L(4)=11

Recurso
L(0) = 1
L(n) = L(n-1) + n
Substituindo temos:
L(n) = 1 + 1 + 2 + 3 + 4 + ... + n
L(n) = 1 + n (n + 1)/2

Recurso
Em quantas regies fechadas, pode-se dividir o plano com n
retas?

Recurso
Durante a guerra entre judeus e romanos, 11 rebeldes judeus
foram encurralados em uma caverna. Preferindo se matar a
serem capturados. Decidiram formar um crculo e matar cada
terceira pessoa at no sobrar ningum. Mas Flavius Josefus no
queria saber do pacto suicida, ento calculou rapidamente onde
deveriar ficar.

Recurso

Recurso
Nova regra: eliminamos cada segunda pessoa.

Recurso
1

11

2
3

10
9

4
5

8
7

Recurso
Alguma idia para calcular o problema recursivamente?

Recurso
1

11

2
3

10
9

4
5

8
7

Recurso
3
Portanto:
J(2n+1) = 2 J(n) + 1
Isto :
J(2n+1) =
novoNumero( J(n) )
novoNumero(k) = 2k+1

11

Recurso
J(1) = 1
J(2n) = 2 J(n) -1, n1
J(2n+1) = 2 J(n) + 1 , n1

10 11 12 13 14 15

J(n)

Parece que se escrevemos n = 2m+k, onde 2m a maior potncia de 2 no


maior que n, temos:
J(n) = J(2m+k) = 2k +1, o que fcil provar por induo.

11 13 15

Recurso
n

10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

J(n)

J(n)

11

11 101 111

11

10 11 12 13 14 15

11 13 15

101 111 1001 1011 1101 1111

Uma vez que:


J(n) = J(2m+k) = 2k +1
O processo para obter-se J(n) a partir de n na base 2 consiste em retirar o 1 digito 1
da esquerda (2m) e coloc-lo direita (1), i.e, J(n) = 2(n 2m )+1
Portanto J(n) = 2m 1, onde m o nmero de bits ligados de n.

Combinatria
2n pessoas esto na fila de um circo, cujo ingresso custa R$5,00.
Sabe-se que n pessoas possuem apenas uma nota de R$5,00 e n
pessoas possuem apenas uma nota de R$10,00. De quantas
maneiras a fila pode ser organizada de forma que a bilheteria
sempre tenha troco?

Combinatria
De quantas formas ao todo as 2n pessoas (sendo n com notas de 5)
podem estar na fila?

Dessas, quantas formas no servem?

Combinatria
As formas que no servem so as que tocam a reta y=1 (nessa
interpretao diagonal.
Fazendo um reflexo do lado
esquerdo em relao a reta y=1
chegamos aos caminhos que
partem de (2,0), isto , que tm
n+1 pessoas com notas de 5 e n-1
com notas de 10 portanto
2
1

O nmero de caminhos que servem portanto:


=

{Cn} = nmeros de Catalan

rvores e Nmero de Catalan


Uma rvore com raiz ordenada um n que possui uma lista finita de
rvores filhas.

Uma rvore binria vazia ou um n que possui um par ordenado de


rvores binrias (arv esquerda e arv direita).

rvores binrias completas com 4 folhas.

Comportamento assinttico
de funes
Sejam g(n):

(*). Definimos:

O(g) = { f | c>0,n0 ,n>n0,f(n)cg(n)}


(g) = { f | c1,c2>0,n0 ,n>n0, c1g(n) f(n)c2g(n)}
o(g) = { f| c>0,n0 ,n>n0,f(n)cg(n)} = { f | lim

( )
( )

=0}

(g) = { f | g O(f) }
(g) = { f | g o(f) }
f g | lim

( )
=
( )

(*) Muitas vezes a definio inclui com adaptaes funes


(ou mesmo )

Quicksort
Na linguagem Haskell o algoritmo quicksort implementado como:
qsort s = case s of{[]->[];(x:xs)->qsort [y | y<-xs, y<x] ++ x : qsort [y | y<-xs, y>=x]}

A implementao acima escolhe x como pivot, o que no uma


boa heurstica.
Seja qn o nmero mdio de comparaes realizadas pelo algoritmo.
Suponto que existem k elementos menores que o Pivot (k = 0..n1),
existiro nk 1 elementos maiores que o Pivot, portanto:
=0
= 1+

= 1+

Quicksort
=1+

=2 +2

=2 +

+1

Multiplicando por n

+2

1 +

Substituindo n por n 1
1

+2

subtraindo

Quicksort
=0

=2 +

+1
=2

Substituindo:
Obtemos:

+ 1 2

=0
1

= +

Ou seja {hn} a srie harmnica. Como = (log n) temos:


= (n log n)