Tópicos Especiais em Programação —  2018/2

Main page

Página principal

Informações

Conteúdo das aulas

17/08


Conversa inicial sobre o curso. Google Interview Preparation Tips.
Complexidade assintótica: por que é imporante? por que as constantes são desprezíveis?
Complexidade O(sqrt(n))? Exemplo de sqrt-decomposition: o problema do edifício e das duas bolas idênticas.
O problema dos números que estão faltando no array. Código (Python 3) feito em sala de aula no GitHub.  
 

24/08


A complexidade de nested loops.
Número harmônico. O problema dos armários. A complexidade do Quick Sort Randomizado.
Algoritmos com complexidades distintas que coexistem como boas opções. Um pode ser mais eficiente do que o outro, dependendo da entrada.

Trabalho 1: O problema do lifespan.  
 

14/09


Mais problemas que admitem algoritmos distintos que "competem" entre si. Exemplo: o problema das estradas.
Sorteando números sem reposição. Knuth shuffle (aka Fischer-Yates shuffle).
O "Tuane Shuffle", em que sorteamos k inteiros positivos sem repetição, do intervalo [1, n], para n dado, em tempo e espaço O(k).
Backtracking. O problema das permutações caóticas. Solução em Python. Note que há dois commits. No primeiro, temos a versão de enumeração, que lista todas as permutações; no segundo, temos a versão que encontra apenas uma.

Trabalho 2: Encontre todos os subconjuntos de tamanho k do conjunto {1, 2, 3, ..., n}, para n e k dados.  
 

21/09


Solução conjunta do problema dos subconjuntos. Enumeração via bitwise operations.
O problema dos números mágicos. Cuidado com casos que aparentemente te levam a um backtracking, mas que são muito mais fáceis em verdade.
O problema do array "quase ordenado". Recordando listas encadeadas, árvores binárias de busca e heaps.

Problemas do hackersrank:
Ransom Note. Minha solução.
Sherlock and Anagrams. Minha solução.

Trabalho 3: Imprima todos os anagramas de uma palavra dada (qualquer) que:
a) começam por vogal; e
b) não tem três consoantes juntas; e
c) a primeira ocorrência da letra "P", se houver, tem que ocorrer antes da primeira ocorrência da letra "G", se houver; e
d) não tem duas letras iguais consecutivas.  
 

28/09


Dividir e conquistar.
Relações de recorrência.
Recursão.
Memoização.
Programação Dinâmica.

O problemas das permutações caóticas via relação de recorrência com memoização.
O problema da mochila via "PD top down", i.e., usando memoização para não resolver subproblemas repetidos.
PS.: Desabilitem a memoização e vejam o que acontece com os tempos!

Trabalho 4: O problema da carga da balsa. Resolva por backtracking ingênuo, depois pense em como se livrar da complexidade exponencial (no número n'de carros que cabem na balsa) usando PD/memoização, chegando a uma complexidade pseudo-polinomial do tipo O(L * n').  
 

05/10


Memoização quando não sabemos de antemão a quantidade de subproblemas a memoizar. Políticas de cache.
O problema do 3n+1 (Conjectura de Collatz). Código no GitHub.

A força de um único bit. O problema dos condenados encapuzados.

Trabalho 5: Dada uma lista de palavras válidas, encontrar uma matriz bidimensional de caracteres que possua área máxima e na qual cada linha e coluna corresponda precisamente a uma palavra válida (i.e., um "retângulo mágico").  
 

26/10


Tries. Test-driven development (TDD).
Resolução do exercício do retângulo mágico, sem o uso de tries (e sem usar TDD) e com o uso de tries (programadas com TDD). Código no GitHub.

Trabalho 6A: Seja uma moeda com probabilidade p=2/3 de dar cara num cara-ou-coroa. Encontre, computacionalmente (via simulação):
- o número médio de lançamentos da moeda até obter 5 caras;
- o número médio de lançamentos da moeda até obter 2 caras seguidas, e isso por duas vezes independentemente.
O que acontece quando você varia p?

Trabalho 6B: Seja um dado não necessariamente honesto de n faces. Encontre, computacionalmente (via simulação):
- a probabilidade de se obter três resultados iguais em três lançamentos seguidos do dado;
- a probabilidade de se obter dois pares seguidos em quatro lançamentos do dado, i.e., A=B, C=D.
O que acontece quando você varia a distribuição de probabilidades do dado?  
 

09/11


Problema: encontrar números que são ao mesmo tempo quadrados perfeitos e triangulares. Como fazer de forma eficiente?

Exercícios envolvendo hashing:
(1) encontrar o par de inteiros para uma soma dada;
(2) encontrar três pontos colineares;
(3) interseção de listas.

BloomFilter.

Trabalho 7: Construa um BloomFilter, estudando seu comportamento para diversos parâmetros. Veja o que acontece (com a probabilidade de falsos positivos) quando você deixa fixo o tamanho do filtro e a quantidade de chaves, mas varia o número de funções hash utilizadas. Veja o que acontece quando você mantém fixa a quantidade de funções hash, mas varia o tamanho do filtro. A seguir, pesquise qual seria a melhor quantidade de funções hash para uma probabilidade de falsos positivos pré-estabelecida. Escreva testes para seu BloomFilter, indicando os números de true/false positives/negatives.

Voltar ao topo