Estruturas de Dados 2022/2023 (CC1007) - DCC/FCUP

Aula Prática #12 - Filas de Prioridade (e revisões)
(12/12 a 16/12)

Esta aula prática é um pouco mais pequena, para lhe dar mais tempo para "respirar" e por ser a última antes do final das aulas :)


Exercícios para submissão

Para efeitos da nota atribuída à resolução de exercícios ao longo do semestre, os exercícios que pode submeter desta aula são:

Prazo de submissão: 30 de dezembro (submeter no Mooshak de EDados)

É encorajado que vão falando com os docentes e outros colegas se tiverem dificuldades. No entanto, qualquer ajuda mais direta que tenham recebido de outros colegas deve ser reconhecida nos comentário do programa que submetem.
Depois do prazo os problemas continuarão disponíveis no Mooshak, mas as submissões não contarão para a sua nota.
Cada aula vale 11% da nota desta componente. Como existem 11 aulas com submissões, pode ter pontuação máxima mesmo sem ter feito tudo.
Para um problema contar tem acertar todos os testes (ou seja, ter accepted). Mesmo que resolva todos os problemas, o máximo numa aula é de 100%.
Para ter 100% bastará sempre resolver os exercícios do guião principal.


Conteúdos das teóricas

Nesta aula iremos abordar conceitos de Filas de Prioridade. Será por isso conveniente ver o que foi falado nas teóricas:


Exercício 1) Compreendendo Filas de Prioridade e Heaps

Um TAD fila de prioridade mantém uma coleção de elementos mantendo maneira de eficiente de inserir elementos e de retirar o elemento mais prioritário (vamos assumir que o mais prioritário é o menor).

Uma maneira de implementar filas de prioridade com operações eficientes em tempo logarítmico é usar um tipo especial de árvores chamadas de heaps. Numa (min)heap, qualquer nó deve sempre ser menor que os seus filhos (o que significa que o menor de todos está na raíz). Além disso, uma heap é uma árvore completa (todos os níveis cheios, excepto potencialmente o último, com os nós colocados o mais à esquerda possível - o que implica que é equilibrada e tem alura O(log n)) e é tipicamente implementada usando um array (onde o nó na posição i tem como filhos os nós nas posições i*2 e i*2+1) [pode espreitar os slides para relembrar]



Descobrindo o mínimo e o máximo.
Exercício 2) Submtendo um problema


Exercícios extra para consolidação de conhecimentos

  1. Para consolidar os seus conhecimentos, experimente resolver novamente o ED215 mas desta vez usando um TAD do próprio Java, a PriorityQueue.
  2. Experimente implementar uma MaxHeap, usando como base de codigo a MinHeap.
  3. Tente resolver o desafio desta semana (ED259), que é um problema um pouco mais simples que o habitual para um desafio e de aplicação quase directa de filas de prioridade :)
  4. Preparação para o teste #2: se ainda não o fez, pode e deve espreitar e tentar fazer os exercícios extra de revisão/preparação para esse segundo teste prático.

Exercício de Desafio

Para esta semana vou colocar um exercício da minha autoria que envolve uma das estruturas de dados que foi falada nesta aula e que que foi usado nas Olimpíadas de Informática "há muito muito tempo":

Para estes problemas de desafio não vou dar logo dicas, para vos deixar pensar, mas se quiserem mesmo resolver o problema e não estejam a conseguir (mesmo depois de terem realmente tentado), podem falar comigo para obter pistas, ou ter uma ideia de como os "atacar".

Espero que se tenham divertido com estes desafios extra que vos fui colocando e que tenham ficado com o "bichinho" de problem solving e de programação competitiva :)