Estruturas de Dados 2020/2021 (CC1007) - DCC/FCUP

Aula Prática #14 - Dicionários e Filas de Prioridade
(aula extra)


Exercícios para submissão

Esta aula prática é extra (e opcional) pelo que não tem exercícios a contar para a avaliação. O seu objetivo é dar a hipótese de ter algum contacto prático com filas de prioridade e heaps.


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. Tentem 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. Revisite o problema [ED098] Triagem de Manchester e volte a submetê-lo mas desta vez usando uma única fila de prioridade (ao invés de uma fila por cada cor).

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 :)