Planificação
Calendário
Esta planificação serve para dar uma ideia resumida das aulas planeadas e/ou dadas:
- Teóricas:
- (T01 e T02) 25/09: Apresentação da UC; Análise Assintótica I (motivação)
- (T03 e T04) 02/10: Análise Assintótica II (notação, previsão, complexidade de programas)
- (T05 e T06) 09/10: Ordenação (comparativos, não comparativos; pesquisa binária e variantes)
- (T07 e T08) 16/10: Algoritmos Greedy
- (T09 e T10) 23/10: Programação Dinâmica
- (T11 e T12) 30/10: Árvores Binárias de Pesquisa Equilibradas
- (T13 e T14) 06/11: Recuperação
- (T15 e T16) 13/11: Introdução a Grafos + DFS I
- (T17 e T18) 20/11: DFS II + BFS e Variantes
- (T19 e T20) 27/12: Caminhos e Distâncias
- (T21 e T22) 04/12: Árvores de Suporte de Custo Mínimo
- (T23 e T24) 11/12: Algoritmos de Fluxo Máximo
- (T25 e T26) 18/12: Revisões e Apoio para o Exame
- Práticas:
- (P01) 28/09 a 02/10: Desenferrujar
- (P02) 05/10 a 09/10: Análise Assintótica
- (P03) 12/10 a 16/10: Ordenação
- (P04) 19/10 a 23/10: Algoritmos Greedy
- (P05) 26/10 a 30/10: Programação Dinâmica
- (P06) 02/11 a 06/11: Árvores Binárias de Pesquisa Equilibradas
- (P07) 09/11 a 13/11: Recuperação
- (P08) 16/11 a 20/11: Introdução a Grafos e Pesquisa em Profundidade
- (P09) 23/11 a 27/11: DFS e Variantes
- (P10) 30/11 a 04/12: Distâncias Mínimas
- (P11) 07/12 a 11/12: Árvores de Suporte de Custo Mínimo
- (P12) 14/12 a 18/12: Fluxo Máximo
Sumários
Aula Teórica #01: 25/09/2020
Apresentação da unidade curricular: frequência, avaliação, objectivos, programa, funcionamento das aulas.
Aula Teórica #02: 25/09/2020
Previsão do tempo de execução de um algoritmo: com acesso a implementação e tempo de execução numa instância e antes mesmo de ter implementação; alguns exemplos e regras práticas.
Aula Teórica #03: 02/10/2020
O modelo de Random Access Machine (RAM) para contagem de operações simples num programa; tipos de análise: pior caso e caso médio; fundamentos de análise assintótica: conceito de taxa de crescimento e notação O, Ω Θ e regras práticas; funções mais comuns: nomes, relações de dominância e exemplos de algoritmos. Previsão do tempo de execução de um algoritmo com acesso a uma implementação (alguns exemplos e regras práticas).
Aula Teórica #04: 02/10/2020
Previsão do tempo de execução de um algoritmo antes de ter uma implementação (alguns exemplos e regras práticas). Análise de ciclos (e somatórios); progressões aritméticas; intuições sobre complexidade de ciclos; análise de funções recursivas (e recorrências); a estratégia de dividir para conquistar; estudo detalhado do algoritmo do mergesort e sua árvore de recorrências; outras recorrências (máximo com dividir para conquistar ou tail recursion; pesquisa binária).
Aula Teórica #05: 09/10/2020
A ordenação como passo fundamental de muitos algoritmos; esboço de prova do "lower bound" de n log n para algoritmos de ordenação no modelo comparativo; algoritmos comparativos: bubblesort, selectionsort, insertionsort, mergesort e quicksort (naive e aleatorizado); algoritmos não comparativos: counting sort e radixsort.
Aula Teórica #06: 09/10/2020
Exemplos de aplicação de ordenação; algoritmo de pesquisa binária direto num array ordenado; variantes de pesquisa binária; "binary search the answer" como pesquisa binária indireta, no espaço de soluções; problema da partição equilibrada; método de bisseção.
Aula Teórica #07: 16/10/2020
Algoritmos greedy (ávidos/gananciosos/gulosos); o problema do troco de moedas; propriedades de um algoritmo greedy: subestrutura ótima e escolha greedy.
Aula Teórica #08: 16/10/2020
Algoritmos greedy para problemas práticos: fractional knapsack, planeamento de intervalos, cobertura mínima.
Aula Teórica #09: 23/10/2020
Motivação para programação dinâmica (PD): números de fibonacci e pirâmide de números; propriedades de um algoritmo de PD: subestrutura ótima e subproblemas coincidentes; metodologia para resolução de um problema com PD: caracterizar, definição recursiva, cálculo da solução de todos os problemas e eventual reconstrução da solução ótima.
Aula Teórica #10: 23/10/2020
Aplicação de PD em problemas: maior subsequência crescente, mínimo troco de moedas, contagem de caminhos, jogos para 2 jogadores, distância de edição.
Aula Prática #01: 28/09 a 02/10
Introdução e uso prático do Mooshak como sistema de avaliação automático. Resolução de problemas introdutórios (ciclos, manipulação de dígitos, manipulação de strings).
Aula Prática #02: 05/10 a 09/10
Exercícios sobre análise assintótica: notação, previsão e complexidade de programas. Resolução de problemas envolvendo somas acumuladas e paradigma de dividir para conquistar.
Aula Prática #03: 12/10 a 16/10
Exercícios práticos sobre ordenação e pesquisa binária; bibliotecas para ordenação customizada, pesquisa binária directa a indirecta.
Aula Prática #04: 19/10 a 23/10
Exercícios práticos sobre algoritmos greedy.
Aula Prática #05: 26/10 a 30/10
Exercícios práticos sobre programação dinâmica.