Desenho e Análise de Algoritmos 2020/2021 (CC2001) - DCC/FCUP


Vídeos das Aulas Teóricas e de outro temas


Aulas Teóricas

Aqui irão ser colocadas ligações para todos os vídeos das aulas teóricas (que serão pré-gravadas). Entre parênteses estão o dia da última aulas teórica associada esses vídeos.
Clicar na imagem ou no título para aceder ao vídeo. Os vídeos estão publicados por ordem cronológica crescente.


Ligação Rápida para Todos os Vídeos publicados

Playlist com todos os vídeos

"Hino" de Desenho e Análise de Algoritmos


Capítulo 0 - Introdução (25/09/2020)

#01 - Introdução à UC (28m08s)
Slides incluídos: 1 a 12 de "0 - Introdução".
Apresentação da unidade curricular: frequência, avaliação, objectivos, programa, funcionamento das aulas.

Capítulo 1 - Análise Assintótica (02/10/2020)

#02 - Análise Assintótica: Introdução e Motivação (49m33s)
Slides incluídos: 1 a 17 de "1 - Análise Assintótica".
Conceitos de algoritmo, instância, correção e eficiência temporal ou espacial; o problema do caixeiro-viajante (TSP): uma possível heurística não optimal e uma solução correta gerando todas as hipóteses; taxa de crescimento de um algoritmo e um exemplo usando permutações.
#03 - Análise Assintótica: Notação "Big O" (48m09s)
Slides incluídos: 18 a 39 de "1 - Análise Assintótica".
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.
#04 - Análise Assintótica: Previsão de Tempo de Execução (30m46s)
Slides incluídos: 40 a 55 de "1 - Análise Assintótica".
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.
#05 - Análise Assintótica: Complexidade de Programas (46m36s)
Slides incluídos: 56 a 79 de "1 - Análise Assintótica".
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).

Capítulo 2 - Ordenação (09/10/2020)

#06 - Ordenação: Motivação e Complexidade Ótima (22m21s)
Slides incluídos: 1 a 5 de "2 - Ordenacao".
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.
#07 - Ordenação: Algoritmos Comparativos e Não Comparativos (37m04s)
Slides incluídos: 6 a 18 de "2 - Ordenacao".
Algoritmos comparativos: bubblesort, selectionsort, insertionsort, mergesort e quicksort (naive e aleatorizado); algoritmos não comparativos: counting sort e radixsort.
#08 - Ordenação: Aplicações e Pesquisa Binária Direta (27m35s)
Slides incluídos: 19 a 24 de "2 - Ordenacao".
Exemplos de aplicação de ordenação; Algoritmo de pesquisa binária direto num array ordenado.
#09 - Ordenação: Pesquisa Binária Indirecta (45m07s)
Slides incluídos: 25 a 37 de "2 - Ordenacao".
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.

Capítulo 3 - Algoritmos Greedy (16/10/2020)

#10 - Algoritmos Greedy: Introdução (35m24s)
Slides incluídos: 1 a 10 de "3 - Algoritmos Greedy".
Algoritmos greedy (ávidos/gananciosos/gulosos); o problema do troco de moedas; propriedades de um algoritmo greedy: subestrutura ótima e escolha greedy.
#11 - Algoritmos Greedy: Exemplos (1h05m02s)
Slides incluídos: 11 a 39 de "3 - Algoritmos Greedy".
Algoritmos greedy para problemas práticos: fractional knapsack, planeamento de intervalos, cobertura mínima.

Capítulo 4 - Programação Dinâmica (23/10/2020)

#12 - Programação Dinâmica: Introdução (1h03m41s)
Slides incluídos: 1 a 35 de "4 - Programação Dinâmica".
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.
#13 - Programação Dinâmica: Exemplos (1h16m56s)
Slides incluídos: 36 a 61 de "4 - Programação Dinâmica".
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.

Capítulo 5 - Árvores Binárias de Pesquisa Equilibradas (30/10/2020)

#14 - Árvores Binárias de Pesquisa: Introdução (45m26s)
Slides incluídos: 1 a 23 de "5 - Árvores Binárias de Pesquisa Equilibradas".
Conceito de Árvores Binárias de Pesquisa: terminologia, pesquisa, inserção, remoção e visualização; complexidade temporal e relação entre altura e equilíbrio; estratégias de balanceamento.
#15 - Árvores Binárias de Pesquisa: AVL + Red Black Trees (1h15m02s)
Slides incluídos: 24 a 54 de "5 - Árvores Binárias de Pesquisa Equilibradas".
Operação de rotação em árvores; AVL Trees: conceito, invariantes, operações, rebalanceamento, visualização; Red-Black trees: conceito, invariantes, operações, rebalanceamento, visualização.

Capítulo 6 - Grafos: Introdução (13/11/2020)

#16 - Grafos: Introdução (52m01s)
Slides incluídos: 1 a 23 de "6 - Grafos: Introdução".
Grafos: conceito, exemplos e terminologia; representação de grafos: matrizes e listas de adjacência; visão sobre os algoritmos de grafos que serão dados; exemplos de aplicações.

Capítulo 7 - Grafos: Pesquisa (20/11/2020)

#17 - Grafos: Pesquisa em Profundidade I (1h03m15s)
Slides incluídos: 1 a 15 de "7 - Grafos: Pesquisa".
Motivação para pesquisa em grafos; comparação de DFS com BFS; implementação de dfs com live coding e contagem de componentes conexos; grafos implicítios; flood fill com live coding.
#18 - Grafos: Pesquisa em Profundidade II (1h14m17s)
Slides incluídos: 16 a 41 de "7 - Grafos: Pesquisa".
Aplicações de DFS com live coding: ordenação topológica e deteção de ciclos; conceito de árvore de DFS e classificaçãos de arestas: "tree", "backward", "forward" e "cross" edges; algoritmo de Tarjan para identificação de componentes fortemente conexos; algoritmo para descoberta de pontos de articulação.
#19 - Grafos: Pesquisa em Largura (51m42s)
Slides incluídos: 42 a 52 de "7 - Grafos: Pesquisa".
Conceito de pesquisa em largura (BFS); esqueleto e implementaçáo de BFS, com live coding; cálculo de distâncias em grafos não pesados usando BFS; BFS em grelhas bidimensionais; BFS com origem múltipla (problema "nuvem de cinzas"); BFS para pesquisa de estados em jogos (problema "quadrados mágicos").

Capítulo 8 - Grafos: Distâncias Mínimas (27/11/2020)

#20 - Grafos: Distâncias e Algoritmo de Dijkstra (1h29m50s)
Slides incluídos: 1 a 14 de "8 - Grafos: Distâncias Mínimas".
Distâncias mínimas em grafos: conceito e motivação; BFS e grafos não pesados; problemas SSSP e APSP; algoritmo de Dijkstra: conceito e intuição, visualização para uma instância, complexidade, implementação com livecoding.
#21 - Grafos: Algoritmos de Bellman-Ford e Floyd-Warshall (38m03s)
Slides incluídos: 15 a 34 de "8 - Grafos: Distâncias Mínimas".
Porque falha o algoritmo de Dijkstra com pesos negativos; algoritmo de Bellman-Ford: intuição, visualização, pseudo-código e complexidade; algoritmo de Floyd-Warshall: intuição, visualização, pseudo-código, complexidade e adaptação para fecho transitivo: variações e o exemplo da distância maximin.

Capítulo 9 - Grafos: Árvores de Suporte de Custo Mínimo (04/12/2020)

#22 - Grafos: Árvores de Suporte de Custo Mínimo (1h20m19s)
Slides incluídos: 1 a 25 de "9 - Grafos: Árvores de Suporte de Custo Mínimo".
Conceito de árvore de suporte e árvore de suporte de custo mínimo (MST); esqueleto; esqueleto de um algoritmo greedy para MSTs; algoritmo de prim: conceito, exemplos, implementação e complexidade (includindo live coding); algoritmo de kruskal: conceito, exemplos, implementação e complexidade; estruturas de dados para union-find (disjoint-sets) e heurísticas union by rank e path compression.

Capítulo 10 - Grafos: Fluxo Máximo (11/12/2020)

#23 - Grafos: Fluxo Máximo (55m26s)
Slides incluídos: 1 a 27 de "10 - Grafos: Fluxo Máximo".
Conceito de redes de fluxos e formalismos: capacidades, conservação de fluxo e fluxo máximo; método de Ford-Fulkerson e conceitos de caminho de aumento e grafo residual; aplicação passo a passo do método num grafo exemplo; implementações de método e suas complexidades: Ford-Fulkerson (com DFS) e Edmonds-Karp (com BFS); aplicações de fluxo máximo: caminhos diferentes (edge-disjoing) e emparelhamento máximo (maximum bipartite matching).