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

Main page

Página principal

Informações

Conteúdo das aulas

04/08


Conversa introdutória.
Carta do Google com dicas para entrevistas.
Visualizando por que a notação O(.) faz sentido. Constantes multiplicativas e aditivas que realmente não importam. Código no GitHub.

Trabalho 1: o problema de se encontrar números ao mesmo tempo quadrados e triangulares. Ex.: 36=6*6 e 36=1+2+3+4+5+6+7+8. Escreva um programa para listar os primeiros n inteiros com essa propriedade.  
 

11/08


Heaps binárias (revisão).
Esperança de variável aleatória. Complexidade de caso médio. O caso médio do QuickSort (assumindo distribuição uniforme das permutações dos n elementos que se quer ordenar).

O problema da selação dos k maiores (ou menores) elementos de uma lista.
Abordagem 1: ordena tudo e retorne os k primeiros.
Abordagem 2: mantém os k maiores já vistos em uma lista (array) não-ordenado.
Abordagem 3: mantém os k maiores já vistos em uma lista (array) ordenado.
Abordagem 4: mantém os k maiores já vistos em uma lista encadeada ordenada.
Abordagem 5: mantém os k maiores já vistos em uma heap de mínimo (de tamanho k).
Abordagem 6: QuickSelect.

Trabalho 2: implementar o QuickSelect e pelo menos duas das outras abordagens, comparando-as para diversos valores de n e k.  
 

18/08


Bitwise operations. O problema de se determinar a menor potência de 2 que é maior ou igual ao número dado.
Novo exemplo de uso eficiente de uma heap: ordenando um array cujos elementos estão originalmente no máximo à distância k da posição que ocuparão no array ordenado.

Introdução às classes P e NP. O Problema do Milênio.  
 

25/08


Sorteando k elementos sem repetição, com uniformidade, em tempo O(k). Várias abordagens pouco eficientes. O paradigma do colecionador de coupons. Linearidade da esperança. Knuth shuffle (Fisher-Yates shuffle).

Problema: listar todas as permutações dos n primeiros inteiros positivos.

Discussão geral sobre backtracking. Implementação do problema proposto em Python.
Código feito em sala de aula no GitHub.

Trabalho 3: listar todos os anagramas da palavra PARALELA, onde:
- a primeira letra é uma consoante; e
- as letras R e P não aparecem juntas (em qualquer ordem); e
- a primeira ocorrência de um L fica à direita da primeira ocorrência de um A.
Reportar a quantidade de anagramas listados, no final.  
 

01/09


Problemas envolvendo hashing.

Problema 1: Dada uma lista com n inteiros e um inteiro k, encontrar os pares de elementos distintos da lista que somem k.
Problema 2: Dadas duas listas, encontrar sua interseção.
Problema 3: Dada uma lista de inteiros e uma função f nos inteiros, encontrar todas as tuplas de elementos distintos (x, y, z, w) que satisfaçam f(x) + f(y) = f(z) + f(w).

Memoização. Memoização com limitação de memória (políticas de cache).

Trabalho 4: Seja f(x) = x/2, se x é par; e f(x) = 3x+1, se x é ímpar. Seja g(x) o número de vezes que deve-se aplicar a função x, a partir de x, até que o resultado obtido seja 1. Exemplo: g(10) = 6, correspondendo à sequência 10 - 5 - 16 - 8 - 4 - 2 - 1. Entrada do programa: dois inteiros, min_x e max_x. Saída: x e g(x), para x que maximiza a função g, com min_x ≤ x ≤ max_x.  
 

15/09


Trabalho 5: Seja Xn,k uma variável aleatória definida como o número de vezes que se deve sortear (com reposição) uma k-upla de elementos distintos de A = {1, 2, ..., n} até que todas as k! permutações de algum subconjunto de A já tenham sido sorteadas. Entrada do programa: um inteiro n e um inteiro k. Saída: uma boa aproximação para a esperança de Xn,k, obtida por simulação.

Discussão sobre uso eficiente de memória. Como armazenar as tuplas sorteadas poupando espaço.
Problema incidental: dada uma tupla de k elementos, como saber sua posição na lista de todas as permutações (daqueles k elementos) ordenadas lexicograficamente?  
 

29/09


Problema 1: os condenados encapuzados (o poder da paridade)
Problema 2: prédio, duas bolas idênticas (balanceamento, sqrt-decomposition)
Problema 3: histograma de usuários online (estratégia incremental, diff's)
Problema 4: arquivo de transações (hashing duplo, processando arquivo de trs pra frente)


Trabalho 6: Dada uma lista de palavras válidas e um inteiro k, encontrar (se existir) uma matriz k x k em que cada linha e cada coluna contém uma palavra válida de tamanho k.  
 

06/10


Tries.
Código feito em sala de aula no GitHub.



Trabalho 6 (continuação): Pensar em outras implementações para tries (como representar os filhos de um nó). Pensar em como usar uma única trie, ao invés de uma trie para cada tamanho de palavra.  
 

Voltar ao topo