Anda di halaman 1dari 6

2 Lista de Exerccios de Introduo Anlise de Algoritmos

Prof. Glauber Cintra Entrega: 15/abr/2015


Esta lista deve ser feita por grupos de no mnimo3 e no mximo 4 alunos.
1) (2 PONTOS) RESOLVA AS SEGUINTES FRMULAS DE RECORRNCIA:

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

a)

0
1
2

T (n)=2T (n 1)+n
2T (n1)=4T (n2)+2(n1)
4T (n2)=8T ( n3)+4(n2)

.
.
.
n2
n1
n2
2 T ( 2 ) =2 T (1)+2 (2)
2n1T (1)=2n11

(n2)
(n1)
n

k2nk =2n+12n

T(n) =

k=1

T ( n ) =T

b)

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

Suponha que n = 2k , o que aps um tempo se mostrar uma boa aproximao.


Podemos reescrever a frmula como
1
T (2k )=T (2 k1 )+2k

T (2k1)=T (2k2 )+ 2k1


T (2k2)=T (2k3 )+2k2

2
3
.
.
.

k 1T (2)=T (1)+2
k
T ( 1 )=2 kk

k(k1)

2k j=2k +11=22k 1=2n1


j=0

2)

CONSIDERE O ALGORITMO BUSCABINRIA DESCRITO A SEGUIR:


Algoritmo buscabinria
Entrada: um nmero x, um vetor v em ordem crescente e as posies inicio e fim
Sada: verdadeiro, se x ocorre entre as posies incio e fim de v;
falso, caso contrrio
se (inicio > fim) devolva falso /* devolva finaliza a execuo do algoritmo */
meio = (inicio + fim) / 2
/* diviso inteira */
se (x = v[meio]) devolva verdadeiro
se (x < v[meio]) devolva buscabinria(x, v, inicio, meio 1)
devolvabuscabinria(x, v, meio + 1, fim)

a) (0,5 pontos) Seja L = {2, 5, 5, 7, 8, 9, 10, 12, 15, 16, 18, 20, 21}. Simule o clculo de buscabinria(7,
L, 0, 12), exibindo os parmetros de entrada e o valor devolvido por cada chamada ao algoritmo
buscabinria.
Na primeira chamada do algoritmo:
Parmetros de Entrada L, x = 7, inicio = 0, fim = 12.
A verificao da base da recurso (inicio>fim) constatada como falso e a execuo segue.
Meio calculado com o valor 12/2 = 6
A primeira verificao do valor de x com o valor v[meio] falsa.
Observe que x menor que v[meio] que 10. Uma nova chamada ao algoritmo buscabinaria ser
efetuada.
Na segunda chamada
Parmetros de Entrada: L, x=7. Inicio = 0, Fim = 5.
A verificao da base falsa.
Meio calculado com o valor cho de 5/2 = 2
A primeira verificao do valor de x com o valor v[meio] falsa.
Observe que x maior que v[meio] que 5. Uma nova chamada ao algoritmo buscabinria ser
feita.
Na terceira chamada.
Parmetros de Entrada: L, x=7. Inicio = 3, Fim = 5.
A verificao da base falsa.
Meio calculado com o valor cho de 8/2 = 4
A primeira verificao do valor de x com o valor v[meio] falsa.
Observe que x menor que v[meio] que 8. Uma nova chamada ao algoritmo buscabinria ser
feita.
Na quarta chamada
Parmetros de Entrada: L, x=7, Inicio=3, Fim=3
A verificao da base falsa
Meio calculado como sendo 3.
A primeira verificao do valor de x com o valor v[meio] verdadeira, retorna verdadeiro.
b) (1 ponto) Determine a complexidade temporal e espacial do algoritmo buscabinria(mostre os
clculos realizados para determinar tais complexidades). O algoritmo buscabinria eficiente?
necessrio encontrar a relao de recorrncia associada busca binria. Podemos observar que o
algoritmo executa uma srie de instrues constantes at o momento em que a recurso ocorre.
No caso em que a recurso no ocorre, quando inicio>fim, o algoritmo executa apenas instrues de
tempo constante, ento a base da recurso ser T(1) = c,, pois o tempo para executar o algoritmo
em um array de 1 elemento constante . Em outros casos a recorrncia chamar a si mesma
sobre uma das metades do vetor. Como estamos tratando de termos assintticos, o vetor L pode ter
muitas posies e podemos pensar que o vetor dividido na metade para as outras iteraes:
Assim o algoritmo iria realizar aproximadamente o seguinte nmero de operaes:
T(n) = T(
Suponha que n = 2k
Utilizado o mtodo da substituio:

0
1
2
3
.

T(
T(
T(
T(

2k0
2k1
2k3
k4
2

) = T(
) = T(
) = T(
) = T(

2k1
2k2
2k4
k5
2

)+c
)+c
)+c
)+c

n
)+c
2

n
2

.
.
k

T( 2kk = C

Isso indica que T(n) = c* (k+1)


Para acharmos o valor de k utilizamos o fato de que:

n=2k logo k=log 2 n


Isso nos indica que
Logo T(n) = c* (log2(n)+1) o que simplifica para uma complexidade temporal de (

log ( n) ).

A complexidade temporal do algoritmo ( log ( n) ) no polinomial no tamanho da entrada (n),


logo o algoritmo no eficiente.
c) (1 ponto) Prove que o algoritmo correto.
Suponhamos que x no est no vetor. A cada chamada recursiva o valor de inicio ser incrementado
recursivamente (pois para a nova chamada o novo inicio ser meio+1) ou o valor de fim ser
decrementado recursivamente (pois para a nova chamada recursiva ser passado como novo valor
de fim, meio -1). Chegar um momento em que os valores passados a prxima chamada recursiva
sero tais que inicio>fim o que perfaz a primeira condio de parada do algoritmo. O algoritmo
retornar o desejado.
Para o caso de x est no vetor.
Provemos por induo forte em n, onde n o tamanho do vetor.
Observe que o tamanho do vetor passado para cada chamada se torna menor a cada chamada
recursiva do algoritmo.
Seja P(n) a afirmao que o algoritmo funciona para um vetor de tamanho n = Fim-Inicio+1
O caso base da induo quando n = 0, isso indica que Inicio = Fim+1, ou seja, Inicio>Fim. O
algoritmo retornar falso.
Passo indutivo: Para n>0
Assumamos primeiramente que o algoritmo retorna a resposta certa para qualquer k entre 0 e n-1.
Ou seja k = Fim Inicio+1
O algoritmo computa primeiro o valor de meio que a diviso inteira de (Inicio+Fim)/2. Por conta
disso, sabemos que inicio<= meio<=fim.
Se x = v[meio], o algoritmo retornar o valor correto.
Se x<v[meio], x est no subvetor v[inicio...meio-1]. Dessa forma k = meio inicio, ns sabemos pela
hiptese indutiva que o algoritmo funciona, pois 0<=meio-inicio<=n.
Se x>v[meio], x est no subvetorv[meio+1...fim]. Dessa forma k = fim meio, ns sabemos pela
hiptese indutiva que o algoritmo funciona, pois 0<=fim meio<=n.

3)

(2 pontos) Escreva um algoritmo recursivo que receba um nmero a e um nmero natural b e


devolva ab. Prove que seu algoritmo correto e determine a complexidade temporal e espacial do
algoritmo. Voc ganhar um bnus de 0,5 pontos se o seu algoritmo for eficiente.

Algoritmo Potencia
Entrada: Dois nmeros naturais a e b
Sada: ab

Se b = 0
Devolva 1
Se no

b
)
2

aux = Potencia(a,

Se b for par
Devolva aux*aux
Se no
Devolva aux*aux*a

PROVA
Provemos por induo:

Sabemos que

ab =

b
2

b
2

a a , se b par

aa

b1
2

Para o caso de b = 0, claro que

a
b

b1
2

, se b mpar

devolve 1, pois ele entra diretamente na instruo se do inicio.

b
b
a , ) devolve a 2 . Observe que se b
2
b
for par o algoritmo Potencia devolve aux*auxque o mesmo quePotencia( a , ) * Potencia(
2
b
b
b
a , ) = a 2 * a 2 = ab.
2

Utilizando uma induo forte, suponhamos que o Potencia(

De forma semelhante, suponhamos o caso em que b mpar, o Potencia devolver aux*aux*a = Potencia(
b1
b1
b
b
a , ) * Potencia( a , ) * a = aa 2 a 2
2
2

= ab

A complexidade temporal e espacial do algoritmo dada pela seguinte e frmula de recorrncia:


T(x) = T(

x
)+c
2

T(0) = c

2k , o que elimina o cho da equao.


Podemos reescrever a equao de recorrncia como:
k 1
2
0
T( k
)+c
2 =
2k2
1
T( k1
)+c
2 =
k3
2
2
T( k2
)+c
2 =
.
.
.
k 1T (2)=T ( 2kk )+c
k
T(1) = T(0) + c
k+1 T(0) = c
Faamos a suposio de que x =

C( K + 2)=log 2 x +2 , ou seja( log ( n) )


Como a entrada log 2 n e a complexidade temporal log(n), podemos dizer que este algoritmo
eficiente.
4)

(1 PONTO) O PROBLEMA DA MEDIANA CONSISTE EM, DADA UMA LISTA DE NMEROS,


DETERMINAR UM NMERO X TAL QUE PELO MENOS METADE DOS NMEROS DA LISTA SEJA
MENOR OU IGUAL A X E PELO MENOS METADE DOS NMEROS DA LISTA SEJA MAIOR OU
IGUAL A X. UMA FORMA DE CALCULAR A MEDIANA COLOCAR A LISTA EM ORDEM. SE A
LISTA TIVER UMA QUANTIDADE MPAR DE ELEMENTOS, A MEDIANA O ELEMENTO CENTRAL.
SE A LISTA TIVER UMA QUANTIDADE PAR DE ELEMENTOS, A MEDIANA A MDIA ARITMTICA
DOS DOIS ELEMENTOS CENTRAIS. POR EXEMPLO, A MEDIANA DA LISTA (2, 4, 4, 5, 7) 4 E A
MEDIANA DA LISTA (2, 4, 4, 6, 7, 8) 5. PESQUISE E INFORME A COTA INFERIOR DE
COMPLEXIDADE DO PROBLEMA DA MEDIANA.

De acordo com T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, ao fim do captulo 9 (Medianas e
Estatstica de Ordem) do seu livro Introduo Anlise de Algoritmos eles afirmam a existncia de diversos
algoritmos lineares para encontrar a mediana de uma lista de nmeros e que alguns indivduos como
Bentand John forneceram limites inferiores para o problema. Podemos ento afirmar que a cota inferior
desse problema linear.
5)

(1 PONTO) PESQUISE E INFORME UM ALGORITMO DE COTA SUPERIOR PARA O PROBLEMA DE


FLUXOS EM REDES (MAXIMUMFLOWPROBLEM).
O algoritmo sugerido por Jim Orlin's promete resolver o problema de MaxFlow em tempo O(VE), onde V o nmero
de vrtices e E o nmero de arestas, o que o melhor tempo j proposto, sendo assim no h necessidade de
execut-lo em tempo maior, o que o define com um algoritmo de cota superior.
Contudo existem alguns requisitos relativos a este algoritmo, ento resolvemos apresentar o segundo melhor
desempenho, o Push Relable que promete resolver o problema em tempo O(VE log(V2/E)).

6)

(2 PONTOS) ESCREVA UM ALGORITMO DE COTA INFERIOR PARA O PROBLEMA DA SOMA DE


MATRIZES. PROVE QUE SEU ALGORITMO CORRETO E QUE UM ALGORITMO DE COTA
INFERIOR.

Algoritmo Matriz
Entrada: Duas A e B matrizes de tamanho NxM
Sada: Matriz C de tamanho NxM com a soma das matrizes A e B.
para i de 0 at n-1
par j de 0 at m-1
C[i][j] = A[i][j]+B[i][j]
devolva C
Observando que o algoritmo executa loops finitos que no so alterados no decorrer da execuo simples
observar que no final de cada iterao do loop interno a i-sima,j-sima posio da matriz C conter o
resultado da soma das respectivas posies das matrizes A e B. Sabendo tambm que i varia de 0 at n-1
garante que todas as linhas de A e B sero percorridas, do mesmo modo com j variando de 0 a m-1 garante
que todas as colunas sero acessadas. Dessa forma todas as combinaes de colunas e linhas sero
acessadas igualmente nas 3 matrizes, pois as 3 possuem o mesmo ndice de acesso em cada iterao.
O tamanho da sada que o problema produz uma matriz com o resultado da soma de duas outras matrizes
nos d uma pista sobre a cota inferior. necessrio no mnimo o tempo de salvar, ou realizar a soma para
cada elemento da matriz resultado, ento podemos dizer que a complexidade intrnseca deste problema
(NM), assumindo uma matriz resultado de tamanho N por M.

Analisando o algoritmo sugerido vemos que a instruo de soma dentro do loop interno uma instruo
crtica e executada N*M vezes. A complexidade temporal desse algoritmo seria ento (N*M). A
complexidade temporal do algoritmo igual a complexidade intrnseca do problema, logo este algoritmo um
algoritmo de cota inferior.