Tarefas

Notas das tarefas

Entrega das tarefas

Apresentação das tarefas

 


Tarefa 1 (em 24/2)

  1. Prove por indução matemática que 20 + 21 + … + 2n = 2n+1−1
  2. Qual a diferença entre (1,2,3,4) e {1,2,3,4}?
  3. O que significa a expressão log …?
  4. Quanto vale k?
  5. Escreva um algoritmo recursivo que calcule a soma dos elementos pares de um vetor A[1..n] de números naturais.

Tarefa 2 (para 3/3, vale 4 pontos)

  1. Escreva um algoritmo para o seguinte problema: dado um número x e um vetor crescente A[1..n], encontrar j tal que A[j−1] < x ≤  A[j].  Escreva um algoritmo iterativo e um recursivo. Use a técnica da busca binária em ambos os casos. Prove que cada um dos algoritmos está correto. Estime o consumo de tempo de cada um dos algoritmos.

Tarefa 3 (para 10/3, 5 pontos)

  1. [1 ponto]  Prove ou desprove a seguinte conjetura: para todo inteiro positivo n,  ⌈lg n⌉  é o menor inteiro k tal que n ≤ 2k.
  2. [2 pontos]  Resolva o problema dos dois algoritmos equivalentes na página de exercícios preliminares do sítio Análise de Algoritmos.  Qual dos dois é mais eficiente?
  3. [2 pontos]  Seja T a função definida sobre os números naturais pela seguinte recorrência: T(0) = 0 e T(n) = T(⌈(n−1)/2⌉) + 1  para n = 1,2,3,4,…  Prove (por indução em n) que T(n) ≤ lg n + 1  para n = 1,2,3,4,…

Tarefa 4 (para 17/3, vale 12 pontos)

  1. [2 pontos]  Prove que n = O(2n).  (Use indução.)
  2. [1 ponto]  Prove que lg n = O(n).
  3. [1 ponto]  Prove que teto(lg n) + 10 = O(lg n).
  4. [4 pontos]  Escreva e analise um algoritmo recursivo que calcule piso(lg n).
  5. [1 ponto]  Seja f a função definida pela seguinte recorrência:  f(1) = 3 e f(n) = f(n/2) + 1 para n = 21, 22, 23, …  Mostre que f(n) = lg n + 3  para n = 20, 21, 22, 23, …
  6. [3 pontos]  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.  Mostre que f(n) é O(n2).  Mostre que f(n) é Ω(n2).

Tarefa 5 (em 7/4)

  1. Prove que  100 lg n + 2n lg n − 10n  está em O(n lg n) e também em Ω(n lg n).   [Solução]

Tarefa 6 (em 9/4)

  1. Escreva um algoritmo recursivo para o seguinte problema:  dados vetores A[1..n] e B[1..n], decidir se existe um índice i tal que A[i] = B[i].  [Solução]

Tarefa 7 (para 14/4, 7 pontos)

  1. [1 ponto]  Sejam f' e g' as derivadas das funções f e g respectivamente.  Se f'(n) >g'(n) para todo n ≥ 10 podemos concluir que f cresce mais rápido que g e portanto f não é O(g).  Discuta essa afirmação.
  2. [3 pontos]  O seguinte fragmento de código transforma o vetor A[1..n] em max-heap?

    para  mn decrescendo até 2 faça
            Corrige-Subindo (A, m)

  3. [3 pontos]  Considere o seguinte problema:  decidir se um vetor B[1..k] é uma subsequência de um vetor A[1..n].  Escreva um algoritmo recursivo eficiente para resolver o problema e prove o seu algoritmo está correto.

Tarefa 8 (em 14/4, 3 pontos)

  1. [CLRS 4.2-1]  Seja T a função definida assim:  T(1) = 1 e T(n) = 3 T(n/2) + n  para n = 21,22,23,…  Prove que T(n) é Ω(nlg 3).  Prove que T(n) é O(nlg 3).  (A propósito, lg 3 fica entre 1.5 e 1.6.)

Tarefa Opcional (até 16/5, vale 25 pontos)

  1. Implemente o algoritmo de Karatsuba–Ofman. Implemente o algoritmo usual de multiplicação.  Siga de perto o pseudocódigo discutido na aula, mas use base 215 em lugar da base 10.  (Se a coisa ficar muito complicada, você pode usar base 10000.)  Faça testes para comparar a velocidade dos dois algoritmos.

    Use linguagem C. Não use C++ nem Java. Use layout padronizado.

    É muito provável que não vou gostar das suas primeiras versões e vou sugerir alterações. Por isso, sugiro entregar suas primeiras versões em papel, antes do prazo final.  A versão final deve ser entregue ao Moodle. Um resumo dos resultados dos testes deve constar, como comentário, no fim do seu programa C.


Tarefa 9 (para 23/4)

  1. [2 pontos]  Seja u o seu número USP e v o número 9898989.  Calcule o produto de u por v usando o método de Karatsuba.  Aplique apenas um nível de recursão do algoritmo.  Use lapis e papel ou uma calculadora eletrônica para fazer as multiplicações intermediárias.  Exiba todos os resultados intermediários.
  2. [3 pontos]  Seja (s[1],f[1]), … , (s[n],f[n]) uma coleção de intervalos.  Suponha que os intervalos são dados em ordem crescente de início. Escreva um algoritmo que devolva uma sdm da coleção e uma cobertura mínima da coleção.  O consumo de tempo do seu algoritmo deve estar em O(n).  (Sugestão: Faça primeiro uma versão sem cobertura. Depois acrescente o cálculo da cobertura.)
  3. [2 pontos]  Dada uma coleção S de intervalos, e um peso numérico wi > 0 para cada intervalo i, encontrar o peso de uma subcoleção disjunta de S que tenha peso máximo.  Escreva um algoritmo de programação dinâmica para o problema.

Tarefa 10 (para 28/4)

  1. [2 pontos]  O algoritmo Subset-Sum-Prog-Din preenche a tabela t "por colunas" (a primeira coluna, depois a segunda, etc.).  Escreva uma variante do algoritmo que preencha a tabela "por linhas".
  2. [2 pontos]  Mostre como um algoritmo para o problema subset-sum generalizado pode ser usado para resolver o nosso problema subset-sum básico.

Tarefa 11 (durante a aula de 28/4)

  1. [1 ponto]  Imagine a heurística gulosa óbvia para o problema da mochila booleana.  Mostre que a heurística não resolve o problema.  Mostre que a heurística não resolve o problema nem mesmo se os objetos forem tomadas em ordem crescente de peso. Idem para ordem decrescente de valor. Idem para ordem decrescente de valor específico (ou seja, valor-dividido-por-peso).
  2. [1 ponto]  [Problema do pen drive]  Tenho um grande número de arquivos digitais no meu computador. Cada arquivo ocupa um certo número de kilobytes. Quero gravar o maior número possível de arquivos num pen drive com capacidade para W kilobytes.  Escreva um algoritmo guloso que resolva esse problema.  Mostre que o seu algoritmo está correto.
  3. [1 ponto]  Descreva em pseudocódigo um algoritmo de programação dinâmica para o problema da mochila booleana.

Tarefa 12 (durante a aula de 12/5)

  1. [2 pontos]  Digamos que tenho um arquivo sobre o alfabeto a, b, c, d, e, f.  Cada caractere ocorre exatamente k vezes.   (1) Se for necessário representar cada caractere por um número fixo de bits, quantos bits você usaria por caractere? Quantos bits terá o arquivo codificado?  (2) Quantos bits terá o arquivo codificado se usarmos um código de Huffman?

Tarefa 13 (para 14/5)

  1. [2 pontos]  Calcule o código de Huffman para o alfabeto a, b, . . , h com frequências que são os primeiros números de Fibonacci: f(a) = 1, f(b) = 1, f(c) = 2, f(d) = 3, f(e) = 5, f(f) = 8, f(g) = 13, f(h) = 21.  O arquivo original tem 1+1+…+21 = 54 caracteres. Quantos bits tem o arquivo codificado?

Tarefa 14 (para 26/5)

  1. [3 pontos]  O alfabeto de um arquivo A tem 256 caracteres.  A frequência máxima de um caractere em A é menor que o dobro da frequência mínima.  Mostre que a codificação de Huffman para A não é melhor que a codificação usual, que usa 8 bits por caractere.

Tarefa 15 (para 9/6)

  1. [4 pontos]  Prove o invariante do processo iterativo que insere e remove numa tabela dinâmica.

Tarefa 16 (durante a aula de 9/6)

  1. [0 pontos]  …  Mostre que o arquivo codificado não tem mais que  t · teto(lg n)  bits.
  2. [0 pontos]  …  Dê um algoritmo que consuma tempo Ο(t lg n) para fazer o serviço.
  3. [0 pontos]  …  Em que ordem os vetores devem ser submetidos ao Merge para que a soma dos tempos do Merge seja mínima?

Tarefa 17 (para 23/6)

  1. [1 ponto]  Mostre que não basta examinar os arcos em ordem crescente de peso para resolver o problema da arborescência maximal de peso mínimo:
  2. [2 pontos]  Troque o bloco de linhas 1 a 12 do algoritmo Prim-com-Fila-de-Vértices pelo código abaixo.  Mostre que o algoritmo continua correto.
    1o para v crescendo de 1 até n faça
    1oooo chave[v] ← ∞
    1oooo pai[v] ← 0
    1oooo cor[v] ← branco
    1o chave[r] ← 0
    1o pai[r] ← r
    10  o QCria-Fila-Vazia ( )
    11  o para v crescendo de 1 até n faça
    12  oooo Insere-na-Fila (v, Q)
  3. [2 pontos]  Escreva uma versão de Prim-com-Fila-de-Vértices que devolva apenas o peso da arborescência maximal de peso mínimo (e não a arborescência propriamente dita).
  4. [1 ponto]  Execute o algoritmo Prim-com-Fila-de-Vértices sobre o digrafo abaixo. (Basta indicar a solução na figura.)
               3         9
           1--------2--------3
           |\       |       /|
          4|  \  5  |6    /  |2
           |    \   |   / 8  |
           |      \ | /      |
           4--------5--------6
           |\    6  |    9
           |  \     |
          6|  7 \   |8
           |      \ |
           7------- 8        9
               8