Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Análise de Algoritmos: Recorrências e Complexidade, Exercícios de Análise de Algoritmos Design e Mircoprocessador

Várias recorrências de algoritmos, suas soluções e análises de complexidade. Além disso, discute a complexidade de algoritmos como counting sort, quick sort, merge sort e outros. O documento também aborda conceitos como inversas composicionais de funções, sequências e recorrências, além de discutir a prova por indução em n.

Tipologia: Exercícios

2024

Compartilhado em 24/03/2024

larissa-brasil-2
larissa-brasil-2 🇧🇷

1 documento

1 / 113

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
ANÁLISE DE ALGORITMOS
REPOSITÓRIO DE EXERCÍCIOS
www.ime.usp.br/~pf/analise_de_algoritmos/
Paulo Feofiloff
Departamento de Ciência da Computação
Instituto de Matemática e Estatística
Universidade de São Paulo
7 de novembro de 2018
Este é o meu repositório de exercícios Análise de Algoritmos. A maioria dos exercícios foi ex-
traída da primeira e segunda edições do livro de Cormen, Leiserson, Rivest & Stein. Alguns exer-
cícios vieram dos livros de Parberry, Kleinberg & Tardos, Aho & Ullman, Manber, Aho, Hopcroft
& Ullman, Brassard & Bratley, Bentley. Alguns poucos exercícios foram extraídos da competição
Programming Challenges. Seguem as siglas que usaremos para identificar os livros:
CLR Cormen, Leiserson & Rivest, primeira edição [CLR91]
CLRS Cormen, Leiserson, Rivest & Stein, segunda edição [CLRS01]
Par Parberry [Par95]
KT Kleinberg & Tardos [KT05]
Mnb Manber [Man89]
AU Aho & Ullman [AU95]
AHU Aho, Hopcroft & Ullman [AHU74,AHU87]
PC Programming Challenges [Pro,SR03]
BB Brassard & Bratley [BB96]
Bent1988 Bentley [Ben00]
Bent2000 Bentley [Ben88]
Sed Sedgewick [Sed98]
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Análise de Algoritmos: Recorrências e Complexidade e outras Exercícios em PDF para Análise de Algoritmos Design e Mircoprocessador, somente na Docsity!

ANÁLISE DE ALGORITMOS

REPOSITÓRIO DE EXERCÍCIOS

www.ime.usp.br/~pf/analise_de_algoritmos/

Paulo Feofiloff

Departamento de Ciência da Computação Instituto de Matemática e Estatística Universidade de São Paulo

7 de novembro de 2018

Este é o meu repositório de exercícios Análise de Algoritmos. A maioria dos exercícios foi ex- traída da primeira e segunda edições do livro de Cormen, Leiserson, Rivest & Stein. Alguns exer- cícios vieram dos livros de Parberry, Kleinberg & Tardos, Aho & Ullman, Manber, Aho, Hopcroft & Ullman, Brassard & Bratley, Bentley. Alguns poucos exercícios foram extraídos da competição Programming Challenges. Seguem as siglas que usaremos para identificar os livros:

CLR Cormen, Leiserson & Rivest, primeira edição [CLR91] CLRS Cormen, Leiserson, Rivest & Stein, segunda edição [CLRS01] Par Parberry [Par95] KT Kleinberg & Tardos [KT05] Mnb Manber [Man89] AU Aho & Ullman [AU95] AHU Aho, Hopcroft & Ullman [AHU74, AHU87] PC Programming Challenges [Pro, SR03] BB Brassard & Bratley [BB96] Bent1988 Bentley [Ben00] Bent2000 Bentley [Ben88] Sed Sedgewick [Sed98]

Sumário

  • 1 Preliminares e ferramentas
    • 1.1 Pseudocódigo
    • 1.2 Somatórios, potências e logaritmos
    • 1.3 Inversas composicionais
    • 1.4 Provas por indução matemática
    • 1.5 Valor absoluto e módulo
    • 1.6 Piso e teto
    • 1.7 Ordens assintóticas: O, Ômega e Teta
    • 1.8 Uso avançado da notação O
    • 1.9 Probabilidades
  • 2 Recursão
    • 2.1 Algorimos recursivos
  • 3 Recorrências
    • 3.1 Solução exata de recorrências
    • 3.2 Recorrências “sem base”
    • 3.3 Recorrências assintóticas
  • 4 Medida de desempenho de algoritmos
    • 4.1 Algoritmos iterativos
    • 4.2 Algoritmos recursivos
    • 4.3 Generalidades
  • 5 Alguns problemas simples
  • 6 Dividir para conquistar
    • 6.1 Busca binária
    • 6.2 Mergesort
    • 6.3 Quicksort
    • 6.4 Mediana generalizada
  • SUMÁRIO
  • 7 Heap
    • 7.1 Construção de um heap
    • 7.2 Heapsort
    • 7.3 Filas de prioridades
  • 8 Árvores binárias
    • 8.1 Árvores binárias de busca
    • 8.2 Árvores rubro-negras
  • 9 Análise probabilística e algoritmos aleatorizados
  • 10 Programação dinâmica
    • 10.1 Generalidades
    • 10.2 Multiplicação de cadeias de matrizes
    • 10.3 Problema da mochila
    • 10.4 Subsequência comum máxima
    • 10.5 Mais programação dinâmica
  • 11 Estratégia gulosa
    • 11.1 Instâncias especiais do problema da mochila
    • 11.2 Intervalos disjuntos
    • 11.3 Códigos de Huffman
    • 11.4 Outros problemas
  • 12 Análise amortizada
    • 12.1 Função potencial
  • 13 Conjuntos disjuntos dinâmicos
    • 13.1 Union by rank
    • 13.2 Path compression
    • 13.3 Union by rank & path compression
  • 14 Grafos não-dirigidos
    • 14.1 Árvores
  • 15 Árvores geradoras de peso mínimo
    • 15.1 Algoritmo de Kruskal
    • 15.2 Algoritmo de Prim
    • 15.3 Outras questões
  • 16 Caminhos de peso mínimo
  • 17 Grafos dirigidos
  • SUMÁRIO
    • 17.1 Digrafos acíclicos e componentes fortes
  • 18 Ordenação em tempo linear
    • 18.1 Algoritmos lineares de ordenação
    • 18.2 Cota inferior para o problema da ordenação
  • 19 Problemas completos em NP
    • 19.1 Questões mais abstratas
  • Bibliografia
  • Índice Remissivo

Capítulo 1

Preliminares e ferramentas

“Os logaritmos permanecem importantes para muitas aplicações científicas e técnicas.” — pérola do jornal O Estado de São Paulo (agosto de 1998)

1.1 Pseudocódigo

Exr 1.1 Reescreva a função abaixo em linguagem C.

FUNC (A, n) 1 para j ← 2 até n faça 2 ch ← A[j] 3 i ← j − 1 4 enquanto i ≥ 1 e A[i] > ch faça 5 A[i + 1] ← A[i] 6 i ← i − 1 7 A[i + 1] ← ch

Exr 1.2 Reescreva a função abaixo em pseudocódigo (notação CLR):

int funcao (int n, int v[]) { int i, j; i = 0; while (i < n) { if (v[i] != 0) i++; else { for (j = i+1; j < n; j++) v[j-1] = v[j]; n--; } } return n; }

CAPÍTULO 1. PRELIMINARES E FERRAMENTAS 7

1 S ← 0

2 para i ← 1 até n faça 3 j ← i 4 enquanto j > 0 faça 5 S ← S + 1 6 j ← ⌊j/ 2 ⌋

Exr 1.13 Seja x um número real diferente de 1. Mostre que x^0 + x^1 + x^2 + · · · + xn^ = xn+1^ − 1 x − 1

Exr 1.14 Seja x um número real tal que |x| < 1. Mostre que x^0 + x^1 + x^2 + x^3 + · · · = 1/(1 − x). Mostre que 1 x^0 + 2x^1 + 3x^2 + · · · = 1/(1 − x)^2. Mostre que 1 x^1 + 2x^2 + 3x^3 + · · · = x/(1 − x)^2.

Exr 1.15 Dê uma fórmula fechada para a soma 22 + 2^4 + 2^6 + · · · + 2^2 k.

Exr 1.16 Prove que 13 + 2^3 + 3^3 + · · · + (n − 1)^3 + n^3 = Θ(n^4 ).

Exr 1.17 Prove que 1 + n + n^2 + n^3 + · · · + n^8 + n^9 = Θ(n^9 ).

1.3 Inversas composicionais

Uma função g é inversa composicional de uma função f se f (g(n)) = g(f (n)) = n. Em outras palavras, y = f (x) se e só se x = g(y). (Estou supondo, ao longo desta seção, que todas as funções estão definidas sobre o conjunto dos números reais positivos.) Leia CLRS sec. 3.2.

Exr 1.18 Dê as inversas composicionais das funções^1 f (n) = n^3 , f (n) = n^1 /^5 ≡ 5

n e f (n) = 1/n.

Exr 1.19 Dê as inversas composicionais das funções 5 n, log 3 n e lg n.

Exr 1.20 [CLRS 3.2 ] Qual a relação entre log 8 n e log 2 n? 2

Exr 1.21 Dê as inversas composicionais das funções log 3 log 3 n ≡ log 3 (log 3 n) e log^23 n ≡ (log 3 n)^2.

Exr 1.22 Desenhe gráficos das funções log 2 n e 2 n^ definidas sobre os inteiros positivos.

1.4 Provas por indução matemática

Indução matemática mirim: Suponha P (n) e prove P (n + 1). Indução matemática de gente grande: Suponha P (m) para todo m < n e prove P (n).

(^1) Em texto sem formatação (numa mensagem de e-mail, por exemplo), escreva “nˆ{1/5}” no lugar de “n 1 / (^5) ”. (^2) Em texto sem formatação, escreva “log_8 n” no lugar de “log 8 n”.

CAPÍTULO 1. PRELIMINARES E FERRAMENTAS 8

Exr 1.23 Prove que 1 + 2 + 2^2 + · · · + 2n^ = 2n+1^ − 1 para todo número natural n.

Exr 1.24 Prove que para qualquer número natural não-nulo n tem-se 12 + 2^2 + 3^2 + · · · + n^2 = 1 6 n(n^ + 1)(2n^ + 1).

Exr 1.25 Veja exercícios 11.23 e 8.2.

Exr 1.26 Prove que 22 + 2^4 + 2^6 + · · · + 2^2 k^ = (4/3)(2^2 k^ − 1).

Exr 1.27 Prove que n ≤ 2 n/^2 quando n ≥ 4. Prove que lg n = n/ 2 quando n ≥ 4.

Exr 1.28 Prove que lg n ≤

n.

1.5 Valor absoluto e módulo

Exr 1.29 Suponha que a ≥ b e x ≥ y. Mostre que |x − a| + |y − b| ≤ |x − b| + |y − a|.

1.6 Piso e teto

Exr 1.30 Seja x um número real. Diga, da maneira mais precisa que puder, o que significam as expressões “⌊x⌋” e “⌈x⌉”.^3

Exr 1.31 Prove ou desprove a seguinte proposição: para todo par x, y de números racionais, x ≤ y se e somente se ⌊x⌋ ≤ ⌊y⌋.

Exr 1.32 Suponha que n/ 5 < m/ 5. É verdade que ⌊n/ 5 ⌋ < ⌊m/ 5 ⌋?

Exr 1.33 Suponha que k é inteiro e k > n/ 5. É verdade que k ≥ 1 + ⌊n/ 5 ⌋?

Exr 1.34 Sejam n, a e b números inteiros positivos. Suponha que b > 4. É verdade que ⌊n/a− 1 /b⌋ = ⌊n/a⌋?

Exr 1.35 É verdade que ⌊x⌋ + ⌊y⌋ = ⌊x + y⌋ para quaisquer x e y?

Exr 1.36 É verdade que ⌊x⌋ + 1 = ⌈x + 1⌉ para qualquer x?

Exr 1.37 Mostre que ⌊x⌋ + ⌊y⌋ ≤ ⌊x + y⌋, com igualdade se e somente se x + y − 1 < ⌊x⌋ + ⌊y⌋. Encontre uma fórmula análoga para ⌈·⌉.

Exr 1.38 Suponha que c é um número inteiro e x um número racional. É verdade que ⌈cx⌉ = c⌈x⌉?

Exr 1.39 Use a notação ⌊ ⌋ para representar o resto da divisão de n por 7.

(^3) Em texto sem formatação, escreva “piso(x)” ou “floor(x)” no lugar de “⌊x⌋”.

CAPÍTULO 1. PRELIMINARES E FERRAMENTAS 10

Exr 1.54 Mostre que ⌊lg n⌋ é o maior inteiro k tal que 2 k^ ≤ n. Mostre que ⌈lg n⌉ é o menor inteiro k tal que 2 k^ ≥ n.

Exr 1.55 Escreva uma função que calcule ⌊lg n⌋. Escreva sua função em pseudocódigo. Escreva uma versão iterativa e uma recursiva (veja capítulo 2).

Exr 1.56 Escreva um algoritmo que calcule ⌈lg n⌉.

Exr 1.57 Prove que para qualquer inteiro n maior que 1 tem-se ⌊lg⌊ n 2 ⌋⌋ = ⌊lg n 2 ⌋.

Exr 1.58 É verdade que ⌊lg n⌋ ≥ lg(n − 1) para todo inteiro n ≥ 2? É verdade que ⌈lg n⌉ ≤ lg(n + 1) para todo inteiro n ≥ 1?

Exr 1.59 [Importante ] É verdade que ⌈lg(n + 1)⌉ = ⌊lg n⌋ + 1 para todo inteiro n > 1? É verdade que ⌊lg(n − 1)⌋ = ⌈lg n⌉ − 1 para todo inteiro n > 1?

Exr 1.60 Mostre que para todo número real x ≥ 1 tem-se ⌊lg x⌋ ≤ lg⌊x⌋ ≤ lg x ≤ lg⌈x⌉ ≤ ⌈lg x⌉.

Exr 1.61 [Soma de teto de log ] Prove que

Pn k=2⌈lg^ k⌉^ =^ n⌈lg^ n⌉ −^2 ⌈lg n⌉ (^) + 1.

Exr 1.62 Para cada número racional positivo x, seja f (x) o número

x. É verdade que ⌊f (x)⌋ ≤ f (⌊x⌋) ≤ f (x) ≤ f (⌈x⌉) ≤ ⌈f (x)⌉.

Exr 1.63 Para cada número racional positivo x, seja f (x) o número 2 x. É verdade que ⌊f (x)⌋ ≤ f (⌊x⌋) ≤ f (x) ≤ f (⌈x⌉) ≤ ⌈f (x)⌉.

Exr 1.64 [Maioria simples ] Considere a seguinte proposição: “O candidato estará eleito se obtiver metade mais um dos votos válidos”. Considere esta outra proposição: “O candidato estará eleito se obtiver mais da metade dos votos válidos”. Compare e critique as duas proposições.

1.7 Ordens assintóticas: O, Ômega e Teta

Leia CLRS seção 3.1. Veja também seções 3.4 e 3.5 de Aho e Ullman [AU95], Veja também seções 2. e 2.4 de R. Sedgewick [Sed98]. Ao ver uma expressão como n + 10 ou n^2 + 1, a maioria das pessoas pensa automaticamente em valores pequenos de n, valores próximos de 0. A análise de algoritmos faz o contrário: ignora os valores pequenos e concentra-se nos valores enormes de n. Escrevemos f = O(g) (diga “f é O-grande de g”) se existe uma constante positiva c tal que 0 ≤ f (n) ≤ c g(n) para todo n suficientemente grande. Mais formalmente: dadas funções f e g, dizemos que f = O(g) se existem constantes c e n 0 tais que 0 ≤ f (n) ≤ c g(n) para todo n ≥ n 0. Uma função f é assintoticamente não-negativa se existe n 1 tal que f (n) ≥ 0 para todo n ≥ n 1. Com esse conceito, podemos dar a seguinte definição equivalente de O(): dadas funções assintoti- camente não-negativas f e g, dizemos que f = O(g) se existem constantes positivas c e n 0 tais que f (n) ≤ c g(n) para todo n ≥ n 0.

CAPÍTULO 1. PRELIMINARES E FERRAMENTAS 11

Notação: Em lugar de escrever “f = O(g)” podemos dizer “f é O(g)” ou “f está na ordem de g” ou “f é da ordem de g”. Podemos também escrever “f ∈ O(g)”, uma vez que O(g) é um conjunto de funções. Escrevemos f = Ω(g) (diga “f é Ômega grande de g”) se existe uma constante positiva c tal que 0 ≤ c g(n) ≤ f (n) para todo n suficientemente grande. Dizemos que f = Θ(g) se f = O(g) e f = Ω(g).

Exr 1.65 Discuta a seguinte afirmação: “A função 2 n^2 + 100n − 1 está em O(n^2 ) com c = 4”, Discuta a seguinte afirmação: “A função 2 n^2 + 100n − 1 está em O(n^2 ) para n ≥ 100 ”.

Exr 1.66 Discuta a seguinte afirmação: “O consumo de tempo do algoritmo X é pelo menos O(n lg n)”. Discuta a seguinte afirmação: “A complexidade do algoritmo X é pelo menos O(n lg n)”.

Exr 1.67 Seja f a função definida pela seguinte recorrência: f (1) = 1 e f (n) = f (n − 1) + 2n para todo número natural n ≥ 2. Quero provar que f (n) = O(n^2 ). Discuta a seguinte prova:

A prova é por indução em n. Se n = 1 então temos f (n) = f (1) = 1 ≤ n^2 = Oh(n^2 ). Suponha agora que n > 1. Temos então f (n) = f (n − 1) + 2n ≤ 2(n − 1)^2 + 2n = 2 n^2 − 4 n + 2 + 2n = 2n^2 − 2 n + 2 ≤ 2 n^2 = O(n^2 ).”

Exr 1.68 Você quer tomar um empréstimo para comprar uma casa. Você quer escolher entre dois bancos, A e B. No banco A, a prestação do mês n é n^2. No banco B, a prestação do mês 4 n + 8. Qual você prefere?

Exr 1.69 Exiba três pares (c, n 0 ) tais que 100 n^2 ≤ c 1001 n^3 para todo n ≥ n 0.

Exr 1.70 Seja f a função definida por f (n) = 3n^2 + 7n − 8 para todo inteiro não-negativo n. Mostre que f (n) = O(n^2 ).

Exr 1.71 Mostre que 100 n = O(2n), que n + 100 = O(n), e que 100 n = O(2n^2 + n).

Exr 1.72 Prove que n^2 + 999n + 9999 = O(n^2 ).

Exr 1.73 É verdade que 1001 n^2 − 999 n − 9999 = O(n)?

Exr 1.74 É verdade que 10

n + 10 = O(n)? É verdade que 101 n − 100 = O(

n)?

Exr 1.75 É verdade que lg n^10 = O(lg n)?

Exr 1.76 Mostre que lg n = O(log 3 n) e log 3 n = O(lg n).

Exr 1.77 Prove que 12 n(n − 1) = O(n^2 ).

Exr 1.78 Prove que 1001 n^3 = O(n^2 ).

Exr 1.79 Prove que n = O(2n).

CAPÍTULO 1. PRELIMINARES E FERRAMENTAS 13

Exr 1.102 Prove que ⌊lg n⌋ = O(lg n)? É verdade que ⌈lg n⌉ = O(lg n)?

Exr 1.103 Mostre, da maneira mais direta que puder, que

1 100 n^ lg^ n^ −^100 n

não é O(n).

Exr 1.104 [CLRS 3.1-2, simplificado ] Mostre que (n + 10)^5 = O(n^5 ).

Exr 1.105 [CLRS 3.1-2 ] Seja k um inteiro positivo. Mostre que (n + 1)k^ = Θ(nk).

Exr 1.106 Mostre que

n + 100 = Θ(

n)

Exr 1.107 Encontre um inteiro positivo k tal que 2 n^ é O(nk).

Exr 1.108 [CLR 2.1-4 ] É verdade que 2 n^ = O(2n/^2 )? É verdade que 22 n^ = O(2n)?

Exr 1.109 É verdade que 2 n+1^ = Θ(2n)? É verdade que 3 n^ = Θ(2n)? É verdade que 22 n^ = Θ(2n)?

Exr 1.110 É verdade que 2 lg^ n^ = O(n)? É verdade que 2 log^3 n^ = O(n)?

Exr 1.111 É verdade que 2 log^3 n^ = O(2log^10 n)?

Exr 1.112 É verdade que n é O(log^2 n)?

Exr 1.113 É verdade que lg n = Ω(n)? É verdade que 2 lg (^2) n = Θ(nlg^ n)?

Exr 1.114 É verdade que

n = O(log^2 n)?

Exr 1.115 Discuta a seguinte afirmação: “n é O(2n) para n ≥ 4 ”?

Exr 1.116 Critique a seguinte afirmação: “f (n) é O(n^2 ) para n ≥ 100 ”?

Exr 1.117 Discuta a seguinte afirmação: “n^2 + n = O(n^2 ) para c = 2 e N = 1”.

Exr 1.118 Sejam f e g funções que levam números racionais positivos em números reais positivos. Suponha que f não é O(g). É verdade então que g = O(f )?

Exr 1.119 [CLR 2-4 simplificado ] É verdade que 1 /2 + 2/ 22 + 3/ 23 + · · · + n/ 2 n^ = O(1)?

Exr 1.120 Sejam f e g duas funções que levam números positivos em números positivos. Refor- mula a afirmação “f não é O(g)” sem usar a expressão “não existe”.

Exr 1.121 Mostre que m⌈n/m⌉ = Θ(m + n). É verdade de n⌈n/m⌉ = Θ(m)?

Exr 1.122 Mostre que n lg n = Ω(n). Mostre que n^2 − 100 n − 200

n = Θ(n^2 ).

CAPÍTULO 1. PRELIMINARES E FERRAMENTAS 14

Exr 1.123 Mostre que n lg n − ⌈ 2 n/ 3 ⌉ − lg n + 4 = Ω(2n lg n).

Exr 1.124 Seja f a função definida assim para todo inteiro positivo k:

f (4k) = 0, f (4k + 1) = 1, f (4k + 2) = 0, f (4k + 3) = − 1.

A função n2+f^ (n)^ é O(n^2 )? é Ω(n^2 )? Justifique.

Exr 1.125 Suponha que T (n) = O(1). Mostre que existe c tal que T (n) ≤ c para todo n ≥ 1.

Exr 1.126 Sejam T e f funções tais f (n) > 0 para n ≥ 1 e T (n) = O(f (n)). Mostre que existe c tal que T (n) ≤ c f (n) para todo n ≥ 1.

1.8 Uso avançado da notação O

Algumas expressões que se usam com notação O:

  • “O(f ) = O(g)” significa “qualquer função f ′^ em O(f ) também está em O(g)” (em outras palavras, “se f ′^ = O(f ) então f = O(g)”) (seria, portanto, mais correto escrever “O(f ) ⊆ O(g)”);
  • “g(n) = f (n) + O(n)” significa “existe uma função h(n) em O(n) tal que g(n) = f (n) + h(n)”;
  • “O(f )+O(g) = O(f +g)” significa “para qualquer f ′^ em O(f ) e qualquer g′^ em O(g), a função f ′^ + g′^ está em O(f + g)”.

Exr 1.127 Qual é o significado exato da afirmação “g(n) = f (n) + O(n)”?

Exr 1.128 Suponha que a função f leva números inteiros em números inteiros. É verdade que 2 f (n) + 3 = O(f (n))?

Exr 1.129 O que significa a afirmação “O(n^2 ) + O(1) = O(n^2 )”? Ela é verdadeira? Justifique.

Exr 1.130 O que significa a afirmação “O(n^2 + 9n) = O(n^2 )”? Ela é verdadeira?

Exr 1.131 O que significa a afirmação “O(f ) + O(g) = O(f + g)”? Ela é verdadeira?

Exr 1.132 Mostre que nO(f (n)) ⊆ O(nf (n)). Mostre que O(nf (n)) ⊆ nO(f (n)).

Exr 1.133 Suponha que f = O(g). Prove que g = Ω(f ).

Exr 1.134 Suponha que f (n) = Ω(g(n)) e g(n) = O(f (n)). É verdade que g(n) = O(n)?

Exr 1.135 Suponha que f (n) = Ω(g(n)) e g(n) = O(f (n)). É verdade que g(n) = Ω(n)?

Exr 1.136 Suponha que f (n) = Ω(g(n)). É verdade que 2 f^ (n)^ = O(2g(n))?

Exr 1.137 Suponha que log f = O(log g). É verdade que f = O(g)?

Capítulo 2

Recursão

A recursão é uma técnica que resolve uma instância de um problema a partir das soluções de instâncias menores do mesmo problema. A idéia de qualquer algoritmo recursivo é simples: se a instância é pequena, resolva-a direta- mente, como puder; se a instância é grande, reduza-a a uma instância menor. Portanto, recursão é essencialmente o mesmo que indução matemática.

2.1 Algorimos recursivos

Exr 2.1 [Máximo de um vetor ] Escreva uma função recursiva que encontre o valor de um ele- mento máximo^1 de um vetor de A[1.. n]. Para que valores de n o problema faz sentido? (Use pseudocódigo ou linguagem C.)

Exr 2.2 Escreva um algoritmo recursivo que calcule a soma dos elementos de um vetor. Use pseu- docódigo CLR.

Exr 2.3 Problema: dado um vetor A[1.. n] de números inteiros, calcular o produto dos elementos não-nulos do vetor. Escreva um algoritmo recursivo que resolva o problema. (Declare claramente as eventuais hipóteses que seu algoritmo faz sobre os dados.)

Exr 2.4 Escreva um algoritmo recursivo eficiente que calcule kn^ para k e n inteiros positivos.

Exr 2.5 Critique o seguinte algoritmo (n é inteiro não-negativo):

XIS (n) 1 se n = 0 2 então devolva 0 3 senão devolva XIS (⌊n/ 3 ⌋ + 1)

Exr 2.6 Escreva funções recursivas que calculem ⌊lg n⌋ e ⌈lg n⌉. (Veja 1.55 e 1.56.)

(^1) Eu não disse “do maior elemento” pois o vetor pode ter mais de um máximo.

CAPÍTULO 2. RECURSÃO 17

Exr 2.7 [Busca linear, CLRS 2.1-3 ] Escreva um algoritmo recursivo que verifique se v é elemento de um vetor A[p.. r]. (Para que valores de p e r o problema faz sentido?) O algoritmo deve devolver i tal que A[i] = v ou NIL se tal i não existe.^2

Exr 2.8 [Busca em vetor ordenado ] Dado um vetor crescente A[p.. r] e um número v, verificar se v é elemento do vetor. Escreva um algoritmo recursivo que resolva o problema. Faça com que o algoritmo devolva j tal que A[j] ≤ v < A[j + 1]

(isso é mais simples que devolver i tal que A[i] = v). Quais os valores possíveis de j? Escreva duas versões: uma de busca linear e outra de busca binária.

Exr 2.9 O algoritmo abaixo recebe um número v e um vetor crescente A[p.. r] com p ≤ r. Se v = A[j] para algum j em p.. r, o algoritmo promete devolver j; senão, promete devolver NIL.

EXERCÍCIO (v, A, p, r) 1 se p = r 2 então se A[p] = v então devolva p senão devolva NIL 3 senão q ← ⌊(p + r)/ 2 ⌋ 4 se A[q] ≤ v 5 então devolva EXERCÍCIO (v, A, q, r) 6 senão devolva EXERCÍCIO (v, A, p, q)

O algoritmo faz o que promete?

Exr 2.10 Suponha que um vetor A[1.. n] tem exatamente m elementos não-nulos e que os índices desses elementos são i 1 < i 2 < · · · < im. Escreva um algoritmo recursivo eficiente que tenha o mesmo efeito que a sequência de atribuições

A[1] ← A[i 1 ], A[2] ← A[i 2 ],... , A[m] ← A[im].

O seu algoritmo deve receber apenas n e A[1.. n] e devolver m.

Exr 2.11 Escreva um algoritmo recursivo que receba um inteiro não-negativo n e devolva as coor- denadas (i, j) de n na tabela abaixo. (Use notação CLRS.)

0 1 2 3 4... j 0 0 2 5 9 14 1 1 4 8 13 2 3 7 12 3 6 11 4 10 .. .

.. . i... n (^2) Acho que o algoritmo ficaria mais bonito se devolvesse p − 1 (ou r + 1) quando v não está em A[p.. r].

Capítulo 3

Recorrências

Uma recorrência é uma “fórmula” que define uma única função em termos d’ela mesma. Em outras palavras, uma recorrência é um algoritmo recursivo que calcula uma função. Resolver uma recorrência é obter uma “fórmula fechada” para a função que a recorrência de- fine. Nem sempre queremos uma fechada exata; às vezes uma fórmula “em termos de O” é sufici- ente. Veja CLRS secs.4.1–4.2. Mais uma observação prática: Como no bilhar, primeiro anuncie o que você vai provar e depois prove. (Veja também a página https://www.ime.usp.br/~pf/amostra-de-prova/.)

3.1 Solução exata de recorrências

Exr 3.1 Seja f a função definida sobre os inteiros positivos pela recorrência

f (1) = 1 f (n) = f (n − 1) + 3n + 1 para n ≥ 2.

Resolva a recorrência exatamente.

Exr 3.2 Seja f a função definida pela recorrência f (1) = 1, f (2) = 2 e

f (n) = f (n − 2) + 2 para n ≥ 2.

Resolva a recorrência exatamente.

Exr 3.3 Suponha que f (1) = 1 e f (n) = f (n − 1) + 2n para n = 2, 3 , 4 ,... Mostre que f (n) = Ω(n^2 ).

Exr 3.4 Seja T (n) uma função definida sobre { 0 , 1 , 2 ,.. .}. Suponha que existem α > 0 e β > 0 tais que T (1) ≤ α e T (n) ≤ T (n − k) + βk para todo n > 1. Mostre que T (n) ≤ max(α, β)n

Exr 3.5 [BB 4.21: algoritmo recursivo para determinantes ] Sejam a e b duas constantes reais positi- vas. Seja f a função definida sobre os inteiros positivos pela seguinte recorrência: f (1) = a e

f (n) = n f (n − 1) + bn

CAPÍTULO 3. RECORRÊNCIAS 20

paraP n > 1. Dê uma fórmula fechada para f (n). (Sua fórmula pode ter um termo da forma n i=1 1 /i!.)^ Prove sua fórmula por indução.

(^1) Escreva f (n) em notação Θ da maneira mais

simples que puder.P Qual o valor de limn→∞ f (n)/n! em função de a e b? (Lembre-se de que ∞ i=1 1 /i! =^ e^ −^1 , sendo^ e^ = 2.^7182818.. .)

Exr 3.6 Seja F a função definida pela recorrência F (0) = F (1) = 0 e

F (n) = F (n − 1) + F (n − 2) + 1

para n ≥ 2. Mostre que F (n) = Ω((3/2)n).

Exr 3.7 [CLRS 3.2-6 e CLRS 4-5 ] Seja f a função definida sobre os inteiros não-negativos pela recorrência f (0) = 0, f (1) = 1 e f (n) = f (n − 1) + f (n − 2) + 2 para n ≥ 2. Resolva a recorrência exatamente.

Exr 3.8 Discuta a seguinte recorrência: f (7) = 1 e f (n) = f (⌊n/ 2 ⌋) + n para n = 8, 9 , 10 , 11 , 12 ,...

Exr 3.9 Considere a seguinte recorrência: f (1) = 3 e

f (n) = f (n/2) + 1

para n = 2^1 , 22 , 23 ,... Quanto vale f (16)? Mostre que f (n) = lg(n) + 3 para n = 2^0 , 21 , 22 , 23 ,.. ..

Exr 3.10 Considere a seguinte recorrência: g(1) = 3 e g(n) = g(⌊n/ 2 ⌋) + 1 para todo inteiro n > 1. Dê uma fórmula fechada para a recorrência.

Exr 3.11 Seja f a função definida sobre os inteiros positivos pela recorrência

f (1) = 1 e f (n) = f (⌈ n− 2 1 ⌉) + 1 para n ≥ 2.

Resolva a recorrência.

Exr 3.12 [CLRS 2.3-5 ] Seja f a função definida sobre os inteiros positivos pela recorrência f (1) = 1 e f (n) = max{f (⌈ n− 2 1 ⌉), f (⌊ n− 2 1 ⌋)} + 1

para n ≥ 2. Resolva a recorrência.

Exr 3.13 Seja f a função definida sobre os inteiros positivos pela recorrência

f (1) = 0 f (n) = f (⌈n/ 2 ⌉) + f (⌊n/ 2 ⌋) + n + 1 para n ≥ 2.

Calcule f (n) para n = 1, 2 , 3 , 4 , 5. Mostre que f (n) = n⌈lg n⌉ − 2 ⌈lg^ n⌉^ + 2n − 1.

(^1) A rigor, eu deveria dizer “indução matemática”.