Algoritmos e Estruturas de Dados Lição n.º 1 Algoritmos e Estruturas de Dados
Algoritmos e Estruturas de Dados Logística Tecnologia Aulas Avaliação Programa da cadeira O ambiente de programação 20140210 Algoritmos e Estruturas de Dados 2
Tecnologia Linguagem: Java. Componente gráfica: Processing. Estilo: Checkstyle. Ambiente: Eclipse, linha de comando. Sistema operativo: Windows, MacOS, Linux. Avaliador automático: Mooshak. Tutoria: Moodle. 20140210 Algoritmos e Estruturas de Dados 3
Aulas Teóricas: Pedro Guerreiro. Práticas: Hamid Shahbazkia. 20140210 Algoritmos e Estruturas de Dados 4
Bibliografia principal Algorithms, quarta edição (2011), Robert Sedgewick e Kevin Wayne. Book site: http://algs4.cs.princeton.edu/ http://www.amazon.co.uk/algorithms-robert-sedgewick/dp/032157351x/ 20140210 Algoritmos e Estruturas de Dados 5
Bibliografia de interesse Introduction to Algorithms, 3.ª edição, Thomas Cormen, Charles Leiserson, Ronald Rivest, Clifford Stein. http://www.amazon.co.uk/introduction-algorithms-tcormen/ The Art of Computer Programming, Donald Knuth. http://www.amazon.co.uk/art-computer-programmingvolumes-1-4a/ Algorithms + Data Structures = Programs, Niklaus Wirth (1975). http://www.amazon.co.uk/algorithms-structures-prentice-hallautomatic-computation/ 20140210 Algoritmos e Estruturas de Dados 6
Coursera Algorithms, Part I Instructors: Robert Sedgewick, Kevin Wayne. This course covers the essential information that every serious programmer needs to know about algorithms and data structures, with emphasis on applications and scientific performance analysis of Java implementations. Part I covers ( ) union-find algorithms; basic iterable data types (stack, queues, and bags); sorting algorithms (quicksort, mergesort, heapsort) and applications; priority queues; binary search trees; red-black trees; hash tables; and symbol-table applications. https://www.coursera.org/course/algs4parti 20140210 Algoritmos e Estruturas de Dados 7
Mais Coursera Algorithms, Part II Part II covers graph-processing algorithms, including minimum spanning tree and shortest paths algorithms, and string processing algorithms, including string sorts, tries, substring search, regular expressions, and data compression, and concludes with an overview placing the contents of the course in a larger context. https://www.coursera.org/course/algs4partii 20140210 Algoritmos e Estruturas de Dados 8
Programa de AED Conceitos fundamentais Modelo de programação Sacos, pilhas e filas Union-Find Análise de algoritmos Ordenação Algoritmos elementares Mergesort, quicksort Filas com prioridade Busca Árvores binárias de busca Árvores equilibradas Tabelas de dispersão Grafos Busca em profundidade Busca em largura Árvores de cobertura Caminho mais curto Cadeias de carateres Busca de subcadeias Compressão de dados Estratégias programativas Divisão-conquista Algoritmos gananciosos Programação dinâmica Intratabilidade 20140210 Algoritmos e Estruturas de Dados 9
Algoritmos de programação Busca linear Busca dicotómica Bubblesort Quicksort Conversão numérica Reversão numérica Máximo, mínimo de um array Remoção de duplicados Comparação lexicográfica de arrays 20140210 Algoritmos e Estruturas de Dados 10
Algoritmos no ensino secundário Fatorização Máximo divisor comum Simplificação de frações Regra de Ruffini Método de Gauss 20140210 Algoritmos e Estruturas de Dados 11
Algoritmos da escola primária Adição Subtração Multiplicação Divisão (Sucessor) 20140210 Algoritmos e Estruturas de Dados 12
Algoritmos clássicos Algoritmo de Euclides. Método para o cálculo de π, de Arquimedes. Crivo de Eratóstenes. 20140210 Algoritmos e Estruturas de Dados 13
Algoritmo de Euclides Calcula o máximo divisor comum de dois números inteiros positivos. É o mais antigo algoritmo inventado pelo espírito humano. public static int euclidalgorithm(int x, int y) while (x!= y) if (x < y) y -= x; else x -= y; return x; Isto será um método estático de alguma classe, em Java. 20140210 Algoritmos e Estruturas de Dados 14
Algoritmo de Euclides, variantes recursivas Formulação recursiva public static int euclid(int x, int y) return x < y? euclid(x, y-x) : x > y? euclid(x-y, y) : x; Formulação recursiva, curto-circuito: public static int greatestcommondivisor(int x, int y) int result = x; if (y!= 0) result = greatestcommondivisor(y, x % y); return result; Esta versão substitui uma sequência de subtrações x -= y até x ser menor que y por x % y. 20140210 Algoritmos e Estruturas de Dados 15
Algoritmo de Euclides, versão de combate Normalmente, usamos a seguinte variante iterativa: public static int gcd(int x, int y) while (y!= 0) int r = x % y; x = y; y = r; return x; Tenha esta sempre à mão! 20140210 Algoritmos e Estruturas de Dados 16
Comparando as versões iterativas Eis uma função de teste para comparar na consolas duas versões iterativas: public static void testiterativeversions() while (!StdIn.isEmpty()) int x = StdIn.readInt(); int y = StdIn.readInt(); int z1 = euclidalgorithm(x, y); StdOut.println(z1); int z2 = gcd(x, y); StdOut.println(z2); Lemos e escrevemos usando a biblioteca stdlib.jar, que teremos juntado ao projeto no Eclipse, importando-a e acrescentando-a ao build path. 20140210 Algoritmos e Estruturas de Dados 17
Classes StdIn e StdOut Usaremos a classe StdIn para ler e a classe StdOut para escrever na consola. StdOut StdIn 20140210 Algoritmos e Estruturas de Dados 18
A função main Em cada classe, a função main apenas chamará as funções de teste. Por enquanto, só temos uma função de teste: public static void main(string[] args) testiterativeversions(); A função main e todas as outras formam a classe Euclid, que teremos desenvolvido no Eclipse. 20140210 Algoritmos e Estruturas de Dados 19
Classe Euclid public final class Euclid public static int euclid(int x, int y) return x < y? euclid(x, y - x) : x > y? euclid(x - y, y) : x; //... public static void testiterativeversions() while (!StdIn.isEmpty()) int x = StdIn.readInt(); int y = StdIn.readInt(); int z1 = euclidalgorithm(x, y); StdOut.println(z1); int z2 = gcd(x, y); StdOut.println(z2); public static void main(string[] args) testiterativeversions(); 20140210 Algoritmos e Estruturas de Dados 20
Correndo no Eclipse Correndo no Eclipse, a interação dá-se na consola do Eclipse, terminando com ctrl-z (Windows) ou ctrl-d (Mac ou Linux). 20140210 Algoritmos e Estruturas de Dados 21
Correndo na linha de comando Para correr na linha de comando, colocamo-nos da diretoria bin, dentro do projecto, no workspace. Aí damos o comando java cp../stdlib.jar:. Euclid Observe: Note que estamos dentro da diretoria bin e que a biblioteca stdlib.jar está ao lado da diretoria bin. 20140210 Algoritmos e Estruturas de Dados 22
Testando as funções todas Eis uma segunda função de teste, para comparar os resultados das quatro funções: public static void testallversions() while (!StdIn.isEmpty()) int x = StdIn.readInt(); int y = StdIn.readInt(); int z1 = euclid(x, y); int z2 = euclidalgorithm(x, y); int z3 = greatestcommondivisor(x, y); int z4 = gcd(x, y); StdOut.printf("%d %d %d %d\n", z1, z2, z3, z4); 20140210 Algoritmos e Estruturas de Dados 23
Argumentos na linha de comando Selecionamos a função de teste por meio de um argumento na linha de comando: public static void main(string[] args) int choice = 1; if (args.length > 0) choice = Integer.parseInt(args[0]); switch (choice) case 1: testiterativeversions(); break; case 2: testallversions(); break; default: break; 20140210 Algoritmos e Estruturas de Dados 24