Você está na página 1de 7

Projeto e Anlise de Algoritmos

Exerccios
1) Prove que o seguinte algoritmo est correto:
function power(y, z)
x=1
while z > 0 do
x = x.y
z=z-1
return(x)

Verificao por mtodos invariantes:


propriedade invariante:
A varivel x corresponde ao valor da exponencial a i, em que i o nmero
de iteraes do loop while (0 antes do loop).
Inicializao:
A varivel x inicializada com 1 = a 0, sendo vlido a propriedade acima.
Manuteno:
No final de cada loop x = x 0 * a = a (i0+ 1) = a i sendo i0 o nmero de iteraes do
loop sem contar com a corrente (ou o nmero de multiplicaes anteriores por a) e x0 o
valor de x antes do loop.
Trmino:
O processo finaliza quando b , que decrementado em cada iterao, chega em 0. Em
outras palavras, o processo encerra depois de b iteraes, e de acordo com a propriedade, x
encerra com o valor de a b , o que o esperado para a exponenciao natural.
2) Prove que o seguinte algoritmo que computa o quadrado de um nmero est correto.
Int SQR(Int n)
S=0
I=0
while i < n do
S=S+n
i=i+1
return S

Verificao por mtodos invariantes:


propriedade invariante:
A varivel x corresponde ao valor do produto x * i, em que i o nmero de iteraes
do loop while (0 antes do loop).
Inicializao:
A varivel x inicializada com 0 = x * 0 , sendo vlido a propriedade
acima.
Manuteno:

A cada iterao, x somado ao argumento a uma vez, ou seja , sendo i0 o nmero


de iteraes do loop sem contar com a corrente (ou somas anteriores de a), e modo que a
propriedade mantida.
No final de cada loop x = x 0 + a = a * (i0 + 1) = a * i sendo i 0 o nmero de
iteraes do loop sem contar com a corrente (ou o nmero de soma anteriores com a ) e x 0 o
valor de x antes do loop.
Trmino:
O processo finaliza quando i, que incrementado em cada iterao, chega em a . Em
outras palavras, o processo encerra depois de a iteraes, e de acordo com a propriedade, x
encerra com o valor de a * a = a 2, o que o esperado.
3) Prove que o seguinte algoritmo que computa o fatorial de um nmero est correto.
Int fatorial(Int n)
F=1
i=1
while i <= n do
F=F*i
i=i+1
return F

Verificao por mtodos invariantes: propriedade


invariante:
A varivel x corresponde ao valor do fatorial i!, em que i o nmero da atual
iterao do loop while (comeando em 1).
Inicializao:
A varivel x inicializada 1 = 0 !, sendo vlido a propriedade acima.
Manuteno:
A cada iterao, x multiplicado por i, ou seja x = x * i = i0 !* i = i!, sendo i0 o
nmero de iteraes passadas do loop, sem contar a presente, de modo que a propriedade
mantida.
Trmino:
O processo finaliza quando i, que incrementado em cada iterao, chega em a . Em
outras palavras, o processo encerra depois de a iteraes, e de acordo com a propriedade, x
encerra com o valor de a !, o que o esperado.
4) O algoritmo a seguir calcula a multiplicao de dois nmeros naturais. Prove sua corretude.
Int multiplica(y, z)
x=0
while z > 0 do
if z impar then
x=x+y
y = 2.y
z =z/2
return x

Algoritmo correto:
unsigned produto_corrigido(unsigned a, unsigned b)

{
if (b == 0)
return 0
x = a
resto = 0
while (b > 1)
{
if (b%2) resto = resto + x
x = x * 2
b = b / 2
}
return x+resto
}
ou alternativamente na forma recursiva:

unsigned produto_recursivo( unsigned a, unsigned b)


{
if ( b == 0 )
return 0
if ( b == 1 )
return a
if ( b % 2 )
return a + produto_corrigido ( 2*a,b/2 )
else
return produto_corrigido ( 2*a, b/2 )
}
A anlise ser feita a partir da forma direta, embora ambas formas so equivalentes,
com a diferena que na forma direta a pilha (vide implementao da recurso em
compiladores) gerenciada manualmente usando a varivel resto.
Explicao do algoritmo:
Esse algoritmo parte do pressuposto que multiplicar uma parcela por 2 e dividir a
outra por 2 mantm o resultado na multiplicao. Por exemplo 2 * 12 = 4 * 6 = 8 * 3 ou
genericamente a * b = (a * 2)(b = 2)
Para o caso de b mpar (no divisvel por 2), para manter o valor do produto
constante, necessrio acrescentar o resto da diviso ao total (que segundo a conta abaixo
equivale constante a , ou o nmero sendo multiplicado por 2 pelo algoritmo):
a * b = (a * 2)(b = 2) = (a * 2)[(b 1)= 2 + 1 = 2 ] = (a * 2 )* (b 1)= 2 + a
em que (b-1)/2 = diviso inteira de um nmero mpar (como ocorre em diviso de int em
linguagem C).
Exemplo:
3*5=6*2+3
Exemplo completo:
3 * 15 = 6 * 7 + 3 = 12 * 3 + 6 + 3 = 24 * 1 + 12 + 6 + 3 = 24 + 21 = 45
propriedade invariante:
Como explicado acima, a propriedade invariante que o produto x*b+resto sempre

constante no final do loop e igual ao resultado correto da multiplicao.


Inicializao:
A varivel b = 0 considerada um caso especial, e o resultado correto retornado
imediatamente. Para o caso de b > 0 , x inicializado como a e o resto como 0, de modo
que a propriedade invariante x * b + resto = a * b + 0 = a * b que no viola a
propriedade invariante.
Manuteno:
A cada iterao, 2 situaes podem ocorrer como visto na explicao:
b par: b = b = 2 ; x = x * 2 ; resto = re sto: mantm x * b + re sto constante, j
que como visto x * b = (x * 2 )(b = 2 ), e logicamente x * b + resto = (x * 2 )(b = 2 ) +
resto
b mpar: b = (b 1)= 2; x = x * 2; resto = resto + x (nota: ver sobre diviso
inteira em C acima): mantm x * b + resto constante, j que como visto
x * b = (x * 2)* (b 1)= 2 + x, e logicamente
x * b + re sto = (x * 2 )(b = 2 ) + (resto +x)
Trmino:
O algoritmo encerra quando b = 1 (nota: sempre atravs de divises inteiras
sucessivas o nmero chega a 1, a menos que b seja 0, o que tratado de forma especial, ou b
j seja 1, de modo que o loop encerra antes da primeira iterao).
Nessa situao, x * b + resto = x * 1 + resto = x + resto = a * b , de modo que
o resultado correto da multiplicao retornado.
5) Hoje, dos algoritmo de ordenao mais utilizados, o que possui menor complexidade o
insero, considerando o seu melhor caso, O(n). Podemos dizer que nenhum outro algoritmo
poder atingir uma complexidade melhor do que esta? Justifique.
Sim. Para resolver o problema necessrio que todos os valores
pertencentes a entrada sejam avaliados, ou seja, podemos dizer que
qualquer algoritmo proposto ser no mnimo (n).

6) Dois algoritmos A e B possuem complexidade n5 e 2n, respectivamente. Voc utilizaria o


algoritmo B ao invs do A. Em qual caso? Exemplifique.
Sim. Apesar do algoritmo ser exponencial, quando o valor de n
pequeno, esta funo produz um tempo de complexidade menor do que a
funo do algoritmo A. Por exemplo para valores de n iguais 2 ... 10
....20

7) Considerando, que as chaves inseridas em um Hashing no provocaram coliso.


Independente do algoritmo, podemos dizer que a pesquisa por uma chave na tabela ser de
ordem de complexidade constante, ou seja, O(1)?
Sim. O algoritmo timo, pois o acesso chave direto.

8) Para duas funes g(n) e f(n) temos que f(n)=(n) se somente se f(n)= (g(n)) e
f(n)=O(g(n)). Explique o teorema acima.

A notao teta indica que a funo f(n) est entre um limite superior e
um limite inferior. Se f(n) teta de g(n) que dizer que f(n) tem
limite superior em g(n) se somente se f(n)<= g(n)* c1, onde c1 uma
constante qualquer para n>m, ou seja f(n)= O(g(n)). O mesmo vlido
para notao .

9) Uma outra mtrica muito utilizada para avaliar algoritmos e a Mtrica Emprica. Essa
consiste em escolher uma mtrica (tempo, nmero de instrues executadas, etc), propor
entradas diferenciadas (geralmente com alguma caracterstica pr-definida), ou seja,
amostras. Finalmente executar o algoritmo com as entradas e analisar os resultados. Esta
medida e muito utilizada para comparar dois algoritmos. Critique a mtrica.
O problema desta medida a definio da amostra e como sero avaliados
os parmetros. Por exemplo, se utilizarmos a funo time para calcular
o tempo, podemos obter valores diferentes para sistemas operacionais
diferentes. Ainda, deve-se pensar que o clculo do tempo no pode incluir
o tempo em que o processo no esteve escalonado. Porm, este mtodo
muito interessante quando se deseja comparar dois ou mais algoritmo,
quando se deseja saber o comportamento do algoritmo para determinadas
bases de dados.

10) Por muitas vezes damos ateno apenas ao pior caso dos algoritmos. Explique o porque.
Porque normalmente desejamos saber qual o limite mximo gasto para
executar o um determinado algoritmo.

11) Analise a complexidade do algoritmo abaixo


Leia(n);
x 0
Para i 1 at n faa
Para j i+1 at n faa
Para k 1 at j-i faa
xx + 1

12) Projete o algoritmo mais eficiente que voc conseguir para encontrar a mediana de um
vetor de n elementos. Anlise sua complexidade.
Ordene os elementos e retorne o elemento n/2 da lista ordenada
Complexidade: O(n log n)

13) Indique se as afirmativas a seguir so verdadeiras e justifique sua resposta:


a) 2n+1 = O(2n)
verdade. Para que 2n+1 pertena a (2n), preciso achar uma
constante c tal que, para algum valor de m, a seguinte
desigualdade seja verdadeira:
2n+1 c.2n , para n m
Notamos que a potncia 2n+1 equivalente a 2.2n, fornecendo c=2
b) 22n = O(2n)
Falso. Para que 22n pertena a (2n), preciso achar uma
constante c tal que, para algum valor de m, a seguinte
desigualdade seja verdadeira:
22n c.2n , para n m
Uma vez que 22n equivale a 2n.2n, sempre haver um valor de n
maior do que qualquer constante c que possamos escolher. Assim,
2n no um limite assinttico superior para 22n.

14 ) Um problema que est relacionado com o problema de ordenao o de encontrar o k-simo


menor elemento de uma lista no ordenada.
a. Escreva um algoritmo que encontra o k-simo menor elemento.
b. Argumente que seu algoritmo est correto.
c. Efetue a anlise de complexidade de sua soluo para melhor caso e pior caso.
15) Joo era um aluno de GCC111 que gostava de implementar e testar os algoritmos vistos
em aula. Ele percebeu que o algoritmo InsertionSort (Ordena-Por-Insero) era bem
eficiente para vetores com poucos elementos. Ele implementou ento o seguinte algoritmo:
Algoritmo-do-Joo(A,n)
se n =< 100
ento InsertSort(A,n)
seno Mergesort(A,n)
Pedro, um colega de Joo sabia que o InsertionSort tinha complexidade de pior caso (n2) e
concluiu que o algoritmo do Joo tinha complexidade (n2). Joo, por outro lado, afirmou
que seu algoritmo tinha complexidade (n lg n). Quem est certo? Por qu?
16) Mostre que a soluo da recorrncia T(n) = T(n/2) + 1 pertence a O(lg n).
17) Mostre que a soluo de T(n) = 2T(n/2) + n (n lg n).

18) Mostre que a soluo de T(n) = T(n/2) + T(n/2) + n (n lg n)


19) Resolva a recorrncia T(n) = T(n/3) + T(2n/3) + 1 pelo mtodo de substituio.
20) Determine um bom limite assinttico (O) da recorrncia T(n) = 3T(n/2)+n
21) Argumente que a soluo da recorrncia T(n) = T(n/3) + T(2n/3) + n (n lg n) usando o
mtodo da rvore de recorrncia.
22) Use a rvore de recorrncia para T(n) = 4T(n/2) + n e obtenha a classe a qual a soluo
pertence.

23) Use o Teorema Master para resolver as recorrncias abaixo.


(a) T(n) = 4T(n/2) + n
Para saber se o Teorema Mestre pode ser aplicado ou no, temos que ter
as constantes a _ 1 e b > 1 e a funo f(n) assintoticamente positiva.
Temos a = 4; b = 2; f(n) = n e as trs condies so satisfeitas.
Deve-se analisar se a equao de recorrncia cai em um dos trs casos
previstos do teorema ou no. Para isso, devemos comparar a funo f(n)
com a funo nlogb a, ou seja:

f(n) : nlogb
n : nlog2 4
n : n2:

A funo nlogb a domina a funo f(n) por um fator polinomial n1. Assim,
o caso 1 do Teorema Mestre se aplica e temos que T(n) = _(n2).
(b) T(n) = 4T(n/2) + n2
Para saber se o Teorema Mestre pode ser aplicado ou no, temos que ter
as constantes a _ 1 e b > 1 e a funo f(n) assintoticamente positiva.
Temos a = 4; b = 2; f(n) = n2 e as trs condies so satisfeitas.

Deve-se analisar se a equao de recorrncia cai em um dos trs casos


previstos do teorema ou no. Para isso, devemos comparar a funo f(n)
com a funo nlogb a, ou seja:

f(n) : nlogb
n2 : nlog2 4
n2 : n2:

As duas funes f(n) e nlogb a tm a mesma taxa de crescimento. Assim, o


caso 2 do Teorema Mestre se aplica e temos que T(n) = _(n2 log n).
(c) T(n) = 4T(n/2) + n3
Para saber se o Teorema Mestre pode ser aplicado ou no, temos que ter
as constantes a >= 1 e b > 1 e a funo f(n) assintoticamente positiva.
Temos a = 4; b = 2; f(n) = n3 e as trs condies so satisfeitas.
Deve-se analisar se a equao de recorrncia cai em um dos trs casos
previstos do teorema ou no. Para isso, devemos comparar a funo f(n)
com a funo nlogb a, ou seja:

f(n) : nlogb a
n3 : nlog2 4
n3 : n2:
A funo f(n) domina a funo nlogb a por um fator polinomial n1. Assim,
o caso 3 do Teorema Mestre pode ser aplicado se a condio de
regularidade for satisfeita, ou seja, af(nb )
cf(n) para uma
constante c < 1.

af(n/b )
4(n/2 )
4n/8 <=
1/2n <=

<= cf(n)
<= cn
cn
cn:

A inequao satisfeita para c = 1/2 . Portanto, o caso 3 do Teorema


Mestre se aplica e T(n) = Teta(n).

24) Determine o limite assinttico de:


a) T(n) = 3T(n/2)+n
b) T(n) = 3T(n/3)+n log n
c) T(n) = 2T(n/5)+n
d) T(n) = 2T(n/2)-n