Você está na página 1de 13

AULA

Algoritmos
META Introduzir e medir ecincia de algoritmos. OBJETIVOS Ao nal da aula o aluno dever ser capaz de: Criar pequenos algoritmos; Medir a ecincia de algoritmos simples. PR-REQUISITOS Relao de recorrncia (aula 1);

AULA

Algoritmos

6.1

Introduo

Prezado aluno, passamos da metade de nosso curso, e nesta aula estudaremos uma idia que talvez tenha sido a chave do desenvolvimento do mundo: os algoritmos. Apesar deles terem tido uma exploso de crescimento com o advento dos computadores, veremos que os algoritmos foram introduzidos na Europa pelo trabalho de Al Khwarizmi, um matemtico rabe do sculo IX, que inuenciou Fibonacci, matemtico italiano do sculo XV. Neste famoso trabalho, Al Khwarizmi utilizou o sistema posicional decimal, j conhecido na ndia desde o sculo VI, que s na poca de Fibonacci passou a ser adotado em substituio aos algarismos romanos. Foi nesse sistema posicional decimal que surgiram os primeiros algarismos para adio, multiplicao e diviso de nmeros. Aprenderemos ainda que sempre que temos um algoritmo devemos responder a trs perguntas: ele correto? eciente? Pode ser melhorado? Para nalizar, estudaremos a notao O que medir a ecincia de um algoritmo.

6.2

Livros e Algoritmos

Duas idias mudaram o mundo. Em 1448 Johann Gutenberg descobriu uma forma de imprimir livros colocando peas metlicas mveis juntas. A literatura se expandiu, a Idade das Trevas terminou, o intelecto humano foi liberado, cincia e tecnologia triunfaram, a Revoluo Industrial aconteceu. Muitos historiadores dizem que devemos tudo isso tipograa. Mas outros insistem que a chave do desenvolvimento no foi a tipograa, mas os algoritmos. Hoje estamos to acostumados a escrever os nmeros usando

102

AULA
Matemtica Discreta o sistema decimal que esquecemos que na poca de Gutenberg ele escreveu 1448 em numerais romanos. Mas como os romanos (ou europeus do sculo XV) somavam dois nmeros? Quanto

MCDXLVIII + DCCCXII? Provavelmente s conseguiam adicionar e subtrair pequenos nmeros com o auxlio dos dedos; para coisas mais complicadas tinham que consultar algum especialista em bacos. O sistema decimal, inventado na ndia cerca de 600 D.C., foi uma revoluo por razes quantitativas: usando apenas 10 smbolos, mesmo nmeros muito grandes podiam ser escritos compactamente e a aritmtica podia ser feita ecientemente seguindo passos elementares. Todavia, estas idias levaram muito tempo para se espalhar, por dicultadas como as barreiras tradicionais do idioma, distncia e ignorncia. O meio de transmisso mais inuente foi um livro texto, escrito em rabe no sculo IX por um homem que viveu em Bagd. Al Khwarizmi ensinou os mtodos bsicos para adio, multiplicao e diviso de nmeros - e at mesmo a extrao de razes quadradas e o clculo de dgitos de . Esses procedimentos eram precisos, claros, mecnicos, ecientes e corretos - em resumo, eram algoritmos, um termo em homenagem a este sbio depois que o sistema decimal foi nalmente adotado na Europa, muitos sculos depois. Desde ento, esse sistema posicional decimal e seus algoritmos numricos tm sido de importncia fundamental para as civilizaes ocidentais. Eles habilitaram a cincia e a tecnologia; aceleraram a indstria e o comrcio. E quando, muito depois, o computador foi nalmente criado, ele encorporou explicitamente o sistema posicional em seus bits. Os cientistas de todo mundo caram

103

AULA

Algoritmos ocupados em desenvolver algoritmos cada vez mais complexos para todo tipo de aplicao em problemas e inovaes que acabaram mudando o mundo.

6.3

Fibonacci

O trabalho de Al Khwarizmi no teria conseguido uma posio to segura no ocidente se no fossem os esforos de um homem: o matemtico italiano do sculo XV Leonardo Fibonacci, que viu o potencial do sistema posicional e trabalhou nele para o desenvolver e propagar. Hoje, Fibonacci mais conhecido devido sua famosa sequncia de nmeros 0, 1, 1, 2, 3, 5, 8, 13, 21, . . . que a soma de seus dois ltimos predecessores imediatos. Mais formalmente, os nmeros de Fibonacci Fn so gerados por uma regra simples Fn2 + Fn1 , se n > 1

Fn =

1, se n = 1

0, se n = 0

Nenhuma outra sequncia de nmeros foi to estudada ou aplicada em mais campos: biologia, demograa, artes, arquitetura, msica, para citar apenas alguns. Mas qual o valor preciso de F100 ou F200 ? O prprio Fibonacci queria saber tais coisas. Para responder, precisamos de um algoritmo para calcular o n-simo nmero de Fibonacci.

104

AULA
Matemtica Discreta
funo fib1(n) se n=0: se n=1: retorne 0 retorne 1

retorne fib1(n-1)+fib1(n-2)

Sempre que temos um algoritmo, existem trs perguntas que devem ser feitas: 1. Ele correto? 2. Ele eciente? Isto , quanto tempo ele leva, como funo de n? 3. Podemos fazer melhor? A resposta primeira pergunta sim, desde que esse algoritmo precisamente a denio de Fibonacci de Fn . J a segunda requer um raciocnio mais elaborado. Seja T (n) o nmero de passos computacionais necessrios para calcular f ib1(n); o que podemos dizer sobre essa funo? Para iniciar, se n 1, o procedimento para quase que imediatamente, depois de no mximo dois passos. Ento T (n) 2 se n 2. Para valores maiores de n, existem duas invocaes recursivas de fib1, levando T (n 1) e T (n 2) passos, mais trs passos (clculo de n 1 e n 2 e a soma nal f ib1(n 1) + f ib1(n 2)). Ento, T (n) = T (n 1) + T (n 2) + 3, para n > 1 Comparando essa relao de recorrncia Fn vemos imediatamente que T (n) Fn . Essa uma notcia muito ruim: o tempo de execuo do algoritmo cresce to rapidamente quanto os nmeros de Fibonacci. T (n) exponencial em n, o que signica que o algoritmo impraticvel para valores grandes de n. Em resumo, nosso

105

AULA

Algoritmos ingnuo algoritmo recursivo correto mas incrivelmente ineciente. O que nos leva terceira pergunta: podemos fazer melhor? Um esquema mais sensvel poderia estocar os resultados intermedirios, F0 , F1 , . . . , Fn1 , assim que eles se tornassem conhecidos.
funo fib2(n) se n=0: retorne 0

crie um vetor f [0 . . . n] f[0]=0,f[1]=1 para i=2...n f[i]=f[i-1]+f[i-2] retorne f[n]

Assim como fib1, a correo desse algoritmo evidente porque usa diretamente a denio de Fn . Quanto tempo ele leva? O loop interno consiste de um passo computacional simples que executado n 1 vezes. Ento o nmero de passos computacionais usado por fib2 linear em n.

6.4

Algoritmos Numricos

Veremos como um algoritmo adequado faz toda diferena. Exemplo 6.1 (Avaliao de Polinmios). Determinar p(5) para o polinmio p(x) = 2x3 7x2 + 4x 15. Soluo: Faremos a avaliao por dois algoritmos distintos: mtodo direto e mtodo de Horner (diviso sinttica). (a) (Mtodo direto) Ao escrever p(x) = 2x3 7x2 + 4x 15, entende-se p(x) = 2.x.x.x 7.x.x + 4.x 15 ento:

106

AULA
Matemtica Discreta = = = 2.5.5.5 7.5.5 + 4.5 15 250 175 + 20 15 80

p(5) p(5) p(5)

(substituindo x por 5) (aps 6 multiplicaes) (aps 3 adies)

Total de operaes: 9 (6 multiplicaes e 3 adies). Em geral, para avaliar um polinmio p(x) de grau n pelo mtodo direto sero necessrias
n(n+1) 2

multiplicaes e n adies.

(b) (Mtodo de Horner) Se reescrevermos p(x) = 2x3 7x2 + 4x 15 como p(x) = ((2.x 7).x + 4).x 15 ento: p(5) p(5) p(5) p(5) = = = = ((2.5 7).5 + 4).5 15 (3.5 + 4).5 15 19.5 15 80 (substituindo x por 5) (aps 1 multiplicao e 1 adio) (aps 1 multiplicao e 1 adio) (aps 1 multiplicao e 1 adio)

Total de operaes: 6 (3 multiplicaes e 3 adies). Em geral, para avaliar um polinmio p(x) de grau n pelo mtodo de Horner sero necessrias n multiplicaes e n adies. Este mtodo conhecido como diviso sinttica, cujo algoritmo est exemplicado abaixo:

-7 10

4 15 19

-15 95 80

Exemplo 6.2 (Mximo Divisor Comum). Sejam a, b N com b < a. Determine o mximo divisor comum de a e b, d = M DC(a, b). Soluo: Podemos fazer isso de duas maneiras diferentes: pelo mtodo direto e pelo algoritmo da diviso de Euclides.

107

AULA

Algoritmos (a) (Mtodo direto) Testamos todos os nmeros de 2 at a/2 para acharmos os divisores de a; fazemos o mesmo teste para acharmos os divisores de b; ento escolhemos o maior divisor comum. Por exemplo, suponha a = 258, b = 60, ento denotando Dn o conjunto dos divisores de n temos: D258 = {1, 2, 3, 6, 43, 86, 129, 258} D60 = {1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60} D258 D60 = {1, 2, 3, 6}(divisores comuns) M DC(258, 60) = 6(mximo divisor comum)

(b) (Algoritmo de Euclides) Dividimos a por b e obtemos o resto r1 < b; ento dividimos b por r1 e obtemos o resto r2 < r1 ; depois dividimos r1 por r2 e obtemos r3 < r2 ; prosseguimos dividindo rn2 por rn1 para obtermos o resto rn < rn1 . Esse processo tem m quando obtemos o resto rk = 0, que sempre ocorre, uma vez que 0 < rn < rn1 < < r1 < b < a; a teremos rk1 = M DC(a, b). Vejamos o exemplo a = 258, b = 60. Dividindo 258 por 60, obtemos resto 18; dividindo 60 por 18, obtemos resto 6; dividindo 18 por 6, obtemos resto 0. Portanto, M DC(258, 60) = 6. comum utilizarmos a tabela seguinte quando aplicamos o algoritmo de Euclides:

258 60

60 18

18 6 0

108

AULA
Matemtica Discreta

6.5

Notao O

Suponha que M um algoritmo e que n seja o tamanho do dado de entrada. A complexidade f (n) de M aumenta quando n aumenta. Normalmente queremos examinar a razo de crescimento de f (n). Em geral, para isso, comparamos f (n) com funes padro tais como ln n, n, n ln n, n2 , n3 , 2n . A maneira pela qual comparamos a funo complexidade f (n) com uma das funes padro utiliza a notao O, denida a seguir. Denio 6.1. Sejam f (x), g(x) funes arbitrrias denidas em U R. Dizemos que f (x) da ordem de g(x), e denotamos isso por f (x) = O(g(x)) se existem um nmero real k e uma constante positiva C tais que: x > k, |f (x)| C|g(x)| Exemplo 6.3 (Polinmio). Suponha que P (n) = a0 +a1 n+a2 n2 + + am nm tem grau m. Prove que P (n) = O(nm ). Soluo: Seja bi = |ai |, para i = 0, 1, . . . , m. Ento, para n 1, temos P (n) = a0 + a1 n + a2 n2 + + am nm b0 + b1 n + b 2 n 2 + + b m n m b0 b1 = + m1 + + bm nm m n n (b0 + b1 + + bm )nm = Cnm Portanto, P (n) = O(nm ).

109

AULA

Algoritmos

6.6

Concluso

Nesta aula, vimos que um algoritmo um procedimento preciso, claro, mecnico, eciente e correto. Aprendemos que de posse de um algoritmo, devemos responder a trs perguntas: ele correto? Ele eciente? Pode ser melhorado? Para nalizar, introduzimos a notao O que compara a complexidade entre algoritmos. ... ...

RESUMO
... Um algoritmo um procedimento preciso, claro, mecnico, eciente e correto. Sempre que temos um algoritmo, devemos fazer trs perguntas: 1. correto? 2. eciente? 3. Pode ser melhorado? Para medir a complexidade de um algoritmo, utilizamos a notao O. Dizemos que f (x) = O(g(x)), se existem um nmero real k e uma constante positiva C tais que: x > k, |f (x)| C|g(x)|. ... ...

PRXIMA AULA
...

110

AULA
Matemtica Discreta Na prxima aula partiremos a uma segunda etapa deste curso. Nela, deniremos alguns conceitos elementares da teoria dos grafos e apresentaremos alguns problemas famosos desta teoria. Preparemse para uma prazerosa sequncia de tpicos que vm sendo alvo de estudo de muitos matemticos. ... ...

ATIVIDADES
... ATIVIDADE 6.1. Existe uma maneira mais rpida para calcular o n-simo nmero de Fibonacci do que por b2? Uma idia envolve matrizes. Iniciamos escrevendo as equaes F1 = F1 e F2 = F0 +F1 que em notao matricial ca: F1 0 = 1 F2 Similarmente, F 0 2 = F3 1 Em geral, Fn Fn+1 1 1 0 1 1 1 . F1 F2 1 1 0 1 n . F0 F1 1 1 . F0 F1 2 . F0 F1

Ento, querendo calcular Fn suciente calcular a n-sima potncia da matriz 2 2. 1. Mostre que matrizes 22 podem ser multiplicadas usando-se 4 adies e 8 multiplicaes. Mas se X uma matriz 2 2, quantas multiplicaes so necessrias para calcular X n ?

111

AULA

Algoritmos 2. Mostre que a multiplicao matricial de X n da ordem de O(log n). ATIVIDADE 6.2. Todo nmero natural n pode ser escrito na base 2 como segue n =
k i i=0 ji 2 ,

denotamos ento n = (ik , ik1 , . . . , i1 , i0 ).

1. Faa um algoritmo que transforma um nmero natural em binrio e vice-versa. 2. Faa um algoritmo que adiciona dois nmeros binrios. ATIVIDADE 6.3. Escreva um algoritmo que dados dois nmeros inteiros a, b determina d = mdc(a, b) e dois inteiros x, y tais que d = x.a + y.b. ATIVIDADE 6.4. Escreva um algoritmo que ordena uma lista com n nmeros inteiros. ATIVIDADE 6.5. Escreva um algoritmo que, dados dois polinmios p(x) =
n i i=0 ai x , q(x)

m i i=0 bi x ,

determina o produto p(x).q(x).

ATIVIDADE 6.6. Em cada umas das situaes abaixo, indique se f (n) = O(g(n)), ou g(n) = O(f (n)) ou ambos. 1. f (n) = n 100, g(n) = n 200 2. f (n) = n log n, g(n) = 10n log 10n 3. f (n) = 10 log n, g(n) = log(n2 )

112

AULA
Matemtica Discreta ... ...

REFERNCIAS
... DASGUPTA, S., et al. Algorithms. MaGraw-Hill: New York, 2006. LIPSCHUTZ,S. LIPSON, M. Matemtica Discreta. Coleo Schaum. Bookman: So Paulo, 2004.

113

Você também pode gostar