Buscar

AED Custo e Recursividade

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 4 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

ALGORITMOS E ESTRUTURAS DE DADOS 
EXERCÍCIOS RESOLVIDOS: CUSTO 
PROFESSOR: TIAGO A. E. FERREIRA 
ALUNA: ERICKA PRICILA DA SILVA 
BSI - 2016.2 
 
(1) SELECTION SORT 
 
*OBS 1: Na implementação do algoritmo abaixo, leve em conta que o índice do vetor começa 
em 1 e não em 0. 
 
Entrada:​ um vetor de tamanho (n) a ser ordenado. 
 
0 selectionSort​(​vetor ​) custos vezes 
1 n ​len​(​vetor ​)← c1 1 
2 for ​j 1 ​to​ ​n-1← c2 n 
3 menor j← c3 n-1 
4 for ​i j+1 to n← c4 n-j∑
n−1
j=1
 
5 if ​A[i] < A[menor] c5 n-j-1∑
n−1
j=1
 
6 menor i← c6 ∑
n−1
j=1
tj 
7 *​trocar(A[j],A[menor] c7 n-1 
 
Saída:​ o vetor ordenado. 
*OBS 2: esta linha representa uma função, a ​trocar()​. Ela recebe duas entradas que são posições 
de um determinado array a serem trocadas. 
 
ANALISANDO: ​Este código possui um ​loop invariante​(que é verdade sempre no ínicio, na 
manutenção e no final do código) no m ​que é o do subarranjo ​A[1…(j-1)] (que está ordenado 
de forma crescente) e ele vai consistir dos j-1 menores elementos do arranjo total ​A[1...n]​. Após 
as ​(n-1) ​iterações do laço ​for​(na linha 2), o subarranjo ​A[1…(n-1)] ​conterá os ​n-1 ​menores 
elementos do arranjo total que é o ​A[1…n], ​de forma ordenada e crescente. Isso implica que o 
elemento faltante, no caso o elemento ​A[n]​, terá que ser o maior elemento do arranjo. 
 
*OBS 3: ​existem alguns somatórios que são bastante utilizados, então é bom relembrar: 
 
 ​P. ARITMÉTICA P. GEOMÉTRICA QUADRADO INVERSOS 
 ∑
n
k=1
k = 2
n(n+1) ∑
n
k=0
x k = (x−1)
x −1 n +1 ∑
n
k=0
k 2 = 6
n(n+1)(2n+1) ln(n) O(1)∑
n
k=1
k
1 = + 
 
 
 
 
 
CALCULANDO OS CUSTOS: ​O​ ​Primeiro passo é abrir os somatórios que aparecerem: 
 
 (n ) n ) . . n ) ∑
n−1
j=1
n − j = − 1 + ( − 2 + . + ( − n + 1 = ∑
n−1
j=1
j = 2
n. (1 + (n−1)) = 2
 n 2 
 
 (n ) n ) . . n ) ∑
n−1
j=1
n − j − 1 = − 2 + ( − 3 + . + ( − n = ∑
n−2
j=0
j = 2
n. (0 + (n−2)) = 2
 n −2n 2 
 
Segundo passo é somar todos os custos: 
 
 
E por último realizar as análises de melhor e pior caso. Vamos primeiro ao ​melhor caso​, que 
seria pra = 0(em c6), ou seja, o arranjo já entrar ordenado: tj 
 
 
Como, de qualquer forma, teremos que percorrer o vetor exatamente ​(n) ​vezes (aqui, pra ser 
mais precisa, deveria ser ​(n+1)​, pois o laço vai até ​(n) e depois roda mais uma vez para 
confirmar a verificação, mas como é uma constante pequena, pude desprezar) ​para afirmar que 
a entrada está realmente ordenada, então no pior caso, temos que: 
 
MELHOR CASO:​ .(n) Θ (n )T = 2 
 
Vamos agora olha para o ​pior caso​, que aqui seria uma entrada ordenada de forma decrescente, 
ou seja, n j tj = − − 1 
 
Pelo mesmo motivo citado acima, temos o nosso pior caso com tempo: 
 
PIOR CASO:​ .(n) Θ (n )T = 2 
 
(2) FATORIAL 
Diferente do caso anterior, aqui vamos usar a abordagem dividir para conquistar e calcular o 
custo de um função que retorna o fatorial de um determinado número. 
 
Entrada​: número o qual, queremos saber o valor do fatorial 
 
0​ ​fatorial​( ​n​) 
1 if ​n == 0 (1), se n 0Θ = 
2 return ​1 (n) T 
3 else T( n-1) + , se n >0(1)Θ 
4 return ​n * ​fatorial​(n-1) 
 
Se seguirmos o raciocínio que a recursão nos acomete, teremos então, além do método da 
árvore: 
 
Logo, pelas regras do crescimento de funções assintóticas, temos que: 
 
 T(n) = (n+1). = ​ =​ (1)Θ ((n ) )Θ + 1 * 1 (n)Θ 
 
MAS essa não é uma prova formal! Sabemos que toda recursão tem seu caso base e sua regras 
para conduzir qualquer outro caso até seu caso base, então a relação de recursividade dessa 
função é dada por: 
 
T(0) = 1 
T(n) = T(n - 1) + 1 , ​Com isso, através da indução podemos supor que T(n) = n + 1 e começar a 
nossa prova. 
1)Passo Base: 
Para n = 0, chegamos ao resultado de T(0) = 1. OK! 
2)Passo Indutivo​: 
2.1) Hipótese Indutiva: ​Vamos supor que ​T(n) = n+1 ​seja verdade para qualquer 
constante positiva ​k ​. Desta forma, a nossa H.I fica sendo ​T(k) = k +1 
2.2) Tese Indutiva: ​Agora o ponto é prova que ​T(k+1) = k+2​. Utilizaremos a última 
relação indutiva que nos diz que: ​T(k+1) = T(k) + 1​, logo, substituindo ​k ​por ​k+1​, ficamos com: 
T(k+1) = ​k + 1 ​+ 1 = k + 2 como queríamos demonstrar(c.q.d).​ Sendo assim, conclui-se a→ 
prova indutiva de que T(n) = n + 1, portanto ​se​ T(n) = n + 1 ​então​ T(n) = .(n)Θ 
 
 
 
 
 
(3) INDUÇÃO E RECURSIVIDADE 
 
Enunciado: ​Use a indução matemática para mostrar que quando ​n ​é uma potência exata de 2 a 
solução da recorrência: 
 
é ​ ​T(n) = n.lg(n) 
 
 
Resposta: 
1) Passo Base: 
Antes de mais nada, é de extrema importância observar, que o caso base para o problema 
proposto, é ​n = 2​. Partindo daí, teremos então aplicando no que nos foi dado: 
n.lgn = (2). lg(2) 
= 2. 1 
 = 2 ​OK! 
2) Passo Indutivo: 
2.1)Hipótese Indutiva: ​Aqui teremos com hipótese: ( ) ).lg( ) T 2
n = ( 2
n
2
n 
2.2)Tese Indutiva: ​Aplicando a hipótese na relação de recorrência ​T(n) = 2.T + n​ ,)( 2
n 
conseguimos provar da seguinte forma: 
 
*OBS: ​É interessante ressaltar que a 
transformação da linha ​4 para ​5​, se dá 
devido a uma propriedade dos 
logaritmos que diz que: 
 
lg(a) lg(b) lg(b)
lg(a) = − 
 
Por isso que ​lg(n) /lg(2) ​se torna 
(lg(n) - lg(2))

Continue navegando