MAC0323 Algoritmos e Estruturas de Dados II

In Pursuit of Simplicity


"Your life as it has been is over.
We will add your biological and technological distinctiveness to our own.
For this time forward you will serve us.
You will be assimilated.
Resistence is futile."

Fonte: Discurso de recepção aos calouros
ou "The Borg -- Star Trek, The Next Generation".

 

Bem-vindo à MAC0323 Algoritmos e Estruturas de Dados II. Esta é uma segunda disciplina em estruturas de dados e projetos de algoritmos. Abaixo está uma descrição de alguns dos ingredientes principais desta disciplina.

Os responsáveis por está edição de MAC0323 são Gustavo Silva, José Coelho de Pina e Mateus Barros Rodrigues.


Introdução

Programas de computador armazenam, acessam e manipulam dados. Programas são uma formulação concreta de algoritmos baseados em uma representação particular dos dados. Muito do que é feito em várias áreas da ciência da computação, tais como compiladores, computação gráfica, sistemas operacionais, . . ., é buscar maneiras de representar os dados para que o armazenamento, acesso e manipulação destes seja feito de maneira eficiente, ou seja, consumindo pouco tempo e espaço.

Sempre que representamos dados no computador consideramos cada um dos seguintes aspectos:

  1. a maneira que os dados são modeladas;
  2. o conjunto de operações definidas sobre estes dados;
  3. a maneira de armazenar os dados;
  4. os algoritmos usados para manipular os dados.

Apesar dos termos tipo de dados, tipo abstrato de dados e estrutura de dados parecerem semelhantes eles têm significados diferentes. O tipo de dado de uma variável é o conjunto de valores que ela pode assumir. Por exemplo, uma variável do tipo boolean pode assumir os valores true e false.

Os itens 1 e 2 acima dizem respeito ao tipo abstrato de dados, ou seja, ao modelo junto com uma coleção de operações definidas sobre os dados. Um exemplo de tipo abstrato de dados é o conjunto dos números inteiros com as operações de soma, subtração, multiplicação e divisão. No contexto de orientação a objetos os tipos abstratos de dados são chamados de classes e as operações sobre os dados ou objetos são realizadas através de métodos.

Já os itens 3 e 4 estão relacionados a aspectos de implementação. Para representar um tipo abstrato de dados em um computador usamos uma estrutura de dados, que é uma coleção de variáveis, possivelmente de diferentes tipos, relacionadas de diversas maneiras.

 

Objetivos

Em MAC0323 daremos prosseguimento ao estudo feito em MAC0121. Estudaremos, através de exemplos, a correção, a análise de eficiência e projeto de algoritmos e estruturas de dados muito bacanas e que são amplamente utilizados por programadores.

Veremos alguns tipos abstratos de dados (ou classes) básicos e algumas estruturas de dados elementares para armazenar estes dados juntamente com os algoritmos para manipular estas estruturas. Existem várias estruturas de dados para um mesmo tipo abstrato de dados e em geral não existe uma estrutura de dados que é a melhor para todas as circunstâncias.

Os algoritmos e estruturas de dados que veremos nesta disciplina nasceram de aplicações cotidianas em ciência da computação. Novas aplicações irão requerer a criação de novos algoritmos e estruturas de dados. É pretensão desta disciplina fornecer aos estudantes elementos e técnicas que possam auxiliá-los a escrever bons algoritmos e estruturas de dados.

Pré-requisitos

Para esta disciplina o pré-requisito é o conhecimento de técnicas básicas de programação que são vistas principalmente em MAC0121 Estruturas de Dados e Algoritmos I.

Principais tópicos

MAC0323 estuda algoritmos para alguns problemas computacionais básicos. Isso serve de motivação para introduzir vários conceitos e ideias importantes. Alguns dos tópicos de MAC0323 são:

  • Bags, Queues e Stacks;
  • Union-find;
  • Tabelas de símbolos;
  • Árvore binária de busca;
  • Árvores balanceadas de busca;
  • Tabelas de Hash;
  • Grafos não orientados;
  • Grafos orientados;
  • Árvore geradora mínima;
  • Caminhos mínimos;
  • Tries; e
  • Autômatos e expressões regulares.
Tudo isso regado a muita análise de algoritmos e invariantes. Seguimos os passos do livro Algorithms de Sedgewick & Wayne Realizaremos experimentos computacionais para medir o consumo de tempos dos nossos programas. Essas medidas são usadas para propormos ou confirmarmos as nossas avaliações sobre a eficiência dos algoritmos. Mediremos também a memória utilizada pelos nossos programas.

 

   

Critério de avaliação

"Programadores iniciantes tendem a colocar a culpa dos erros no
compilador, na biblioteca, no mau tempo, . . .
Programadores experientes gostariam de ser iniciantes para ter
a quem culpar, além deles mesmos . . ."

The Practice of Programming
Brian Wilson Kernighan e Robert C. Pike


  "Testes mostram a presença de erros,
mas não a ausência."

Edsger W. Dijkstra

 

  A nota final na disciplina será baseada em dois componentes:

Exercícios

Nesta disciplinas teremos alguns exercícios que podem ou não envolver programação. Cada exercício vale um certa número de pontos, dependendo da sua dificuldade. A média MEP de exercícios será calculada pela fórmula  
MEP = X/S
onde  X  é o total de pontos acumulado pelo aluno  e  S  é o total de pontos possíveis.

Provas

Teremos 3 provas nesta disciplina. Não haverá prova substitutiva. A média MP das provas será  
MP = (P1 + 2×P2 + 2×P3)/5
onde, P1, P2 e P3 são as notas das três provas.

Nota final

A nota final;  NF,  será calculada pela regra  
se  MP ≥ 5  e  MEP ≥ 5 , então  NF = MP +  MEP , senão  NF = min{MP,MEP} .
Em código temos
#define min(m,n) ((m) < (n) ? (m) : (n))
			    
float
nota_final (float mp, float mep)
{
   if (mp < 5 || mep < 5) return min(mp,me);
   return (mp + me) / 2;
} 

Recuperação

Os alunos que ficaram com nota final NF maior ou igual a 3.0 e menor que 5.0 terão direito a fazer a recuperação. Os alunos em recuperação deverão fazer uma prova em em data a ser acertada. Se Prec é a nota na prova de recupereção então a nota da recuperação  NR,  será calculada pela regra  
NR = (Prec + NF )/2,

   

Conduta ética

Os exercícios e provas devem ser feitos INDIVIDUALMENTE. Você tem responsabilidade sobre cópias feitas de questões de sua prova e de seus exercícios. Não faça os exercícios em grupos e não compartilhe código: não permita que outro aluno tenha acesso ao seu programa. Você pode consultar seus colegas para esclarecer dúvidas e discutir possíveis soluções, mas não copie os programas.

O Departamento de Ciência da Computação considera qualquer forma de plágio uma infração disciplinar inadmissível.

Na ocorrência de tais casos, o Departamento recomenda que os alunos envolvidos sejam reprovados na disciplina em questão, e que o ocorrido seja relatado à CG para as demais providências.

Leia mais sobre plágio na página Plágio++ em disciplinas de Computação por Arnaldo Mandel.

   

Alunos

Verifique seu status no sistema Júpiter depois do período de retificação de matriculas. Seu status deve ser "MATRICULADO". Se for "PENDENTE" ou "INSCRITO", procure imediatamente o Serviço de Alunos de Graduação.


Last modified: Wed Mar 8 17:56:06 BRT 2017