Aula 1 - Apresentação aos Algoritmos Computacionais
O que é a Disciplina? Disciplina de Projeto e Análise de Algoritmos Esta é uma disciplina de Algoritmos em nível de Pós-Graduação! Temas a serem abordados: Algoritmos e Complexidade, como: Problemas de decisão, Alcançabilidade, Problemas de otimização, Fluxo máximo, Caixeiro viajante, Complexidade computacional O(f). Classes P e NP Classes de complexidade, Hierarquia das classes, Reduções e completude. Problemas em grafos. Problemas envolvendo conjuntos e números. Heurísticas para solução de problemas. Uso de Modelo de Computação Paralela para solução de problemas.
Avaliações Apresentação Serão realizadas duas avaliações teóricas com os assuntos e tópicos abordados em sala de aula. As datas das provas serão marcadas no decorrer do curso: a primeira ocorrendo em torno da metade da carga horária e a outra no final da carga horária. Serão propostos exercícios para serem resolvidos tanto de forma individual como em equipe. A nota (conceito) será calculada como, Nota Final = 80 N AT +20 N E 100 onde N AT é a mádia aritmética das Avaliações Teóricas e N E é a média aritmética dos exercícios propostos.
Livro Texto Apresentação Livro Texto utilizado: Título: Introduction to Algorithms. Autores: Thomas H. Cormen; Charles E. Leiserson; Roanld L. Rivest; Clifford Stein. Editora: MIT Press Edição: Third Edtion Ano: 2009. Figura: Livro Texto utilizado.
Demais Referências... Livros: PAPADIMITRIOU, C.H. Computational Complexity, Addison-Wesley, 1994. AHO, A V.; HOPCROFT, J.E.; ULLMAN, J.D. The Design and Analysis of Computer Algorithms, Addison-Wesley, 1974. GAREY, M.S.; JOHNSON, D.S. Computers and Intractability: A Guide to the Theory of NP-Completness, Freeman, 1979. LEWIS, H.R.; PAPADIMITRIOU, C.H. Elements of the Theory of Computation, Prentice-Hall International Editions, 1981. SEDGEWICK, R.; FLAJOLET, P. An Introduction to the Analysis of Algorithms, Addison Wesley, 1996.
Demais Referências... Periódicos: ACM, ACM Transactions on Algorithms. SCIENCE DIRECT, Journal of Algorithms. MANEY PUBLISHING, Journal of Algorithms and Computational Technology. DOAJ Directory of Open Access Journals Free Algorithms (ISSN:1999-4893) Dentre outros... (verificar www.periodicos.capes.gov.br)
O que é um Algoritmo? Informalmente, um Algoritmo é qualquer procedimento computacional bem definido que toma algum valor, ou um conjunto de valores, como entrada e produz algum valor, ou conjunto de valores, como saída. Convencionalmente, um algoritmo é uma sequência de passos computacionais que transforma uma entrada em um saída. É uma ferramenta computacional que resolve um problema computacional bem especificado.
Exemplo: Ordenamento Entrada: uma sequencia de números a 1,a 2,...,a n. Saída: uma permutação específica a 1,a 2,...,a n da entrada tal que (ordenamento crescente), a 1 a 2 a n Por exemplo, da a sequência de entrada 31,41,59,26,41,58, o algoritmo deve retornar a saída, 26,31,41,41,58,59 A sequência de entrada é chamada de instância. De forma geral, a instância de um problema consiste na entrada necessária para computar uma possível solução do problema!
Corretude Apresentação Um algoritmo é dito ser correto quando, para toda instância de entrada possível, este pára com a saída correta! Assim, um algoritmo correto resolve um dado problema computacional! Um algoritmo incorreto pode não parar para alguns instâncias de entrada, ou pode parar com a saída incorreta! Um algoritmo incorreto ainda pode ser usável, se for conhecida a sua taxa de erro!
Outros Exemplos Apresentação É evidente que ordenamento não é o único tipo de algoritmos que exite e tem importância computacional. Vários outros exemplos de problemas computacionais podem ser enumerados onde é possível aplicar/definir um algoritmo, dentre os quais: O Projeto Genoma Humano (e de vários outrao seres vivos). Em particular são 100.000 genes e mais de 3 bilhões de peres de bases químicad para serem ordenadas e analisadas. O acesso rápido à informações via internet. Segurança e privacidade em transações econômicas através da internet. Distribuição, logística e alocação de recursos. etc.
O Nosso Curso... Apresentação Como já afirmado, este é um curso de Pós-Graduação... Logo, bem mais avançado do que um curso de algoritmos de um bom curso de graduação em ciência da computação e/ou áreas afins. Assim, estaremos trabalhando com problemas com basicamente duas características comuns: 1 Os problemas têm muitas soluções candidatas, porém a maioria esmagadora destas soluções candidatas não conseguem resolver o problema em questão. Encontrar uma solução que consiga resolver o problemas, ou encontrar a melhor solução, pode ser um verdadeiro desafio. 2 Estaremos interessados em problemas do mundo real!
Eficiência Apresentação Outro aspecto muito importante ao se estudar algoritmos é como definir suas eficiências. Diferentes algoritmos podem ser projetados para resolver o mesmo problema! Frequentemente estes diferem dramaticamente em relação a eficiência. Exemplo: Dado o problema de ordenamento. E dado dois algoritmos de ordenamento, o insertion sort e o merge sort. O insertion sort demora um tempo c 1 n 2, onde n é o número de itens a serem ordenados e c 1 é uma constante. O merge sort demora um tempo c 2 nlog 2 n, onde c 2 é uma constante.
Eficiência - Exemplo Vamos imaginar dois computadores: Computador A capaz de realizar 10 bilhões de instruções por segundo. Computador B capaz de realizar 10 milhões de instruções por segundo. O computador A é 1.000 vezes mais rápido do que o computador B Como implementar o algoritmo também é importante! Imagine que o melhor programador no mundo implemente o insertion sort no computador A. Suponha também que um programador mediano implemente o merge sort no computador B.
Eficiência - Exemplo Devido as características dos computadores e a qualidade dos programadores, é razoável supor c 1 = 2 e c 2 = 50, ou seja, as condições do conjunto computador e implementação para o algoritmo insertion sort seja 25 vezes melhor do que para o mergesort. Assim, para 10 7 números a serem ordenados, Computador A: Computador B: 2 (10 7 ) 2 Inst. 10 10 = 20.000 segundos Inst. por seg. 50 (10 7 )log 2 10 7 Inst. 10 7 Inst. por seg. 1.163 segundos
Perfil Esperado da Turma Qual formação básica dos alunos da nossa Turma? Um aluno que passou por um curso de ciência da computação, sistemas de informação, engenharia da computação ou área afins de informática deve saber, Abordagens de problemas (Técnicas de Programação; Recursividade; Dividir para Conquistar; Análise Assíntótica de Funções). Algoritmos de ordenamento (Bubble Sort; Insertion Sort; Merge Sort; Heap Sort; Quick Sort; Sorting in Linear Time). Estrutura de Dados Básicas (Listas; Filas; Pilhas; Tabelas Hash; Árvores Binárias; Ávores Vermelho-Preto)
Alvo da Disciplina Dados os pré-requisitos no slide anterior, desejamos estudar, Técnicas de Análise e Projetos Avançados de Algoritmos Estrutura de Dados Avançadas Algoritmos em Grafos Algoritmos Paralelos Algoritmos científicos (Operação em Matrizes, Programação Linear, Polinônios e FFT, String Matching) Classes P e NP Classes de complexidade, Hierarquia das classes, Reduções e completude.