Informações Gerais
MAC 122 Princípios de Desenvolvimento de Algoritmos
Bem-vindo!
Bem-vindo à MAC 122 Princípios de Desenvolvimento de Algoritmos. Esta é uma disciplina introdutória em estruturas de dados e projetos de algoritmos. Abaixo encontra-se uma descrição de alguns dos ingredientes principais desta disciplina.
- Introdução
Programas de computador armazenam, acessam e manipulam informações, isto é dados. Programas são uma formulação concreta de algoritmos abstratos 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 ou sistemas operacionais) é buscar maneiras de representar os dados para que o armazenamento, acesso e manipulação destes seja feito de maneira eficiente (ou seja, rápida e gastando pouco espaço).
Sempre que representamos dados em um computador nós consideramos cada um dos seguintes aspectos:
- a maneira que essas informações (ou objetos do mundo real) são modelados como objetos matemáticos;
- o conjunto de operações que definiremos sobre estes objetos matemáticos;
- a maneira na qual estes objetos serão armazenados (representados) na memória de um computador;
- os algoritmos que são usados para executar as operações sobre os objetos com a representação escolhida.
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 esta variável pode assumir. Por exemplo, uma variável do tipo boolean só pode assumir os valores TRUE e FALSE.
Os itens 1 e 2 acima dizem respeito ao tipo abstrato de dados, ou seja, ao modelo matemático junto com uma coleção de operações difinidas sobre este modelo. Um exemplo de tipo abstrado de dados é o conjunto dos números inteiros com as operações de soma, subtração, multiplicação e divisão sobre inteiros.
Já os itens 3 e 4 estão relacionados aos aspectos de implementação. Para representar um tipo abstrato de dados em um computador nós usamos uma estrutura de dados, que é uma coleção de variáveis, possivelmente de diferentes tipos, ligadas (relacionas) de diversas maneiras.
- Objetivos
Nesta disciplina estudaremos, através de exemplos, a correção, a análise de eficiência e projeto de algoritmos que são amplamento utilizados por programadores.
Veremos ainda alguns tipos abstratos de dados básicos e estudaremos diferentes estruturas de dados para armazenar (representar) estes tipos 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. É pretenção desta disciplina fornecer aos estudantes elementos e técnicas que possam auxiliá-los a projetarem bons algoritmos e estruturas de dados.
- Pré-requisitos
Para esta disciplina os pré-requisitos é conhecimento de técnicas básicas de programação que são vistos em MAC 110 Introdução à Computação.
- Critério de avaliação
- Provas
- Teremos três provas nesta disciplina, P1, P2 e P3. Todas as provas serão às quintas-feiras. A primeira prova será no dia 29 de setembro, a segunda no dia 1 de dezembro e a terceira no dia 8 de dezembro. A média das provas será mp = max{(P1 + 2 P2)/3, (P1 + 2 P3)/3, (P2 + P3)/2}. Essa média representará 60% da nota final. Para que o aluno seja aprovado é necessário que mp seja pelo menos 5 (cinco).
- Exercícios-programas
- Durante o semestre desenvolveremos exercícios-programas. Cada
exercício-programa valerá um certo número de pontos. A
média mep das notas dos exercícios-programas representará
40% da nota final. Para que o aluno seja aprovado é necessário que
mep seja pelo menos 5 (cinco).
- Nota final
- A nota final nf será calculada da através da execução da função
nota_final(mp, mep).
#define min(m,n) ((m) < (n) ? (m) : (n))
float
nota_final (float mp, float mep)
{
if (mp < 5 || mep < 5) return min(mp,mep);
return 0.6*mp +0.4*mep;
} - Normas de 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 prova de
recuperação.
A prova de recuperação será feita no dia 15 de dezembro.
A nota final da disciplina para aqueles que fizerem recuperação será
dada por (nf + 2*nr)/3, onde nr é a nota da prova de
recuperação.
Note que não haverá exercício-programa de recuperação. Quem ficar de recuperação devido somente a média de exercícios-programas também deverá fazer a prova de recuperação. - Alguns tópicos que pretendemos cobrir
- recursão;
- busca em um vetor;
- busca (binária) em vetor ordenado;
- listas lineares: filas e pilhas;
- listas encadeadas;
- algoritmos de enumeração: backtracking;
- busca de palavras em um texto;
- algoritmos de ordenação: bublesort, heapsort, mergesort, ...
- filas de prioridades (heaps);
A nota final na disciplina será baseada em dois componentes:
Pretendemos cobrir os tópicos elementares em projetos de algoritmos. Alguns destes tópicos (não necessariamente nesta ordem) são:
Para descrevermos as estruturas de dados e os algoritmos que manipulam estas estruturas faremos uso da linguagem de programação C.