Aula 22 && Revisão geral

Documentos relacionados
Aula 16 Árvores Patricia e Árvores B

MCTA028 Programação Estruturada Aula 19 Custos de um algoritmo e funções de complexidade

Algoritmos e Estruturas de Dados I Aula 15 Árvores de busca balanceadas (e mais...)

Aula 13 Árvores Rubro-Negras

BC1424 Algoritmos e Estruturas de Dados I Aula 05 Custos de um algoritmo e funções de complexidade

Aula 19 Árvores Rubro-Negras

Aula 02: Custos de um algoritmo e funções de complexidade

Aula 13 Árvores Adelson-Velskii e Landis

Algoritmos e Estruturas de Dados I. Aula 11 Árvores AVL. Prof. Jesús P. Mena-Chalco.

Aula 10 Árvores Adelson-Velskii e Landis

Aula 19 Conjuntos disjuntos (Union-find)

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Aula 15 Árvores Digitais / Trie

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Limite assintótico para a ordenação, Ordenação em tempo linear

MC3305 Algoritmos e Estruturas de Dados II. Aula 02 Hashing. Prof. Jesús P. Mena-Chalco.

Análise de Algoritmos

Aula 18 Árvores B e parâmetros de compilação

Complexidade de algoritmos Notação Big-O

Algoritmos e Estruturas de Dados I Aula 06 Custos de um algoritmo

Projeto e Análise de Algoritmos

Nem todos os problemas algorítmicos que podem ser resolvidos em princípio podem ser resolvidos na prática: os recursos computacionais requeridos

Aula 19: Métodos eficientes de ordenação

Projeto e Análise de Algoritmos

Bit (Binary Digit) é a menor unidade de armazenamento de informação dentro do computador; Byte é a união de 8 bits capaz de representar 256

Árvores B Partes I e II

B-Árvores. Siang Wun Song - Universidade de São Paulo - IME/USP. MAC Estruturas de Dados

Ordenação. Prof. Jonas Potros

Dicionários. TAD Orientado a conteúdo

Estruturas de Dados para Conjuntos Disjuntos: Union-find Letícia Rodrigues Bueno

A Invenção da B-Tree. Árvores B Parte I. Problema. Problema. Introdução. Leandro C. Cintra Maria Cristina F. de Oliveira. Solução?

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

BC1424 Algoritmos e Estruturas de Dados I. Aula 16: Árvores (introdução) Prof. Jesús P. Mena-Chalco. jesus.mena@ufabc.edu.br

Aula 21 Ordenação externa

Hashing Externo. SCC-503 Algoritmos e Estruturas de Dados II. Thiago A. S. Pardo M.C.F. de Oliveira Cristina Ciferri

Hashing convencional...

Programa Analítico de Disciplina SIN213 Projeto de Algoritmos

A Invenção da B-Tree. Árvores B Parte I. Problema. Problema. Árvores Binárias de Busca. Árvores Binárias de Busca. Introdução

Hashing. Hashing. Hashing versus Indexação. Hashing. Hashing convencional... Exemplo de espalhamento. Revisão...

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

EDUARDO DA SILVA SARDÃO 0981/00-4 IGOR RODRIGO MACHADO DE MENEZES 1422/98-1 TRABALHO FINAL ÁRVORES B+

Árvores-B (Parte I) SCC-503 Algoritmos e Estruturas de Dados II. Thiago A. S. Pardo Leandro C. Cintra M.C.F. de Oliveira

Implementação de Diretórios (1)

Árvores-B (Parte Ia) SCC-203 Algoritmos e Estruturas de Dados II. Graça Nunes

MCTA028 Programação Estruturada Aula 20 Exercícios de custos de um algoritmo

Árvore Vermelho-Preta. Estrutura de Dados II Jairo Francisco de Souza

ANÁLISE DE ALGORITMOS: PARTE 1. Prof. André Backes. Como resolver um problema no computador? Precisamos descrevê-lo de uma forma clara e precisa

ALGORITMOS DE ORDENAÇÃO

PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos

5. Algoritmos de Ordenação

Acesso Sequencial Indexado

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

Quantidade de memória necessária

Abordagens para Resolução de Problemas

Árvore-B. Árvore B. Características Gerais. Sistemas de Banco de Dados. Características Gerais. Revisão

- Métodos simples de busca - Métodos ingênuos de ordenação (introdução)

Aula 01 Introdução Custo de um algoritmo, Funções de complexidad e Recursão

Árvores AVL e Árvores B. Jeane Melo

Algoritmos e Estruturas de Dados I Prof. Tiago Eugenio de Melo

MC3305 Algoritmos e Estruturas de Dados II. Aula 00 Apresentação. Prof. Jesús P. Mena-Chalco.

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Métodos de Ordenação

SCC-501 Introdução à Ciência de Computação II

PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação

Projeto e Análise de Algoritmos

Edital de Seleção 055/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Complexidade de Tempo e Espaço

Ordenação e Busca em Arquivos

Análise de Algoritmos Estrutura de Dados II

INF 1010 Estruturas de Dados Avançadas

Teoria da Computação Aula 9 Noções de Complexidade

Análise de Algoritmos. Prof. Sérgio Carlos Portari Júnior

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

ÁRVORE RUBRO- NEGRA. Prof. André Backes. Também conhecida como árvore vermelhopreto

Árvores-B (Parte Ib) SCC-203 Algoritmos e Estruturas de Dados II. Graça Nunes

Hashing externo. Graça Nunes. Fonte: Folk & Zoelick, File Structures

B-tree. B-Trees. Estrutura do nodo da B-tree. Balanceamento. Disposição dos elementos ordenados na B-tree. Exemplo de uma B-tree de ordem 3

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Edital de Seleção 023/2018 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Análise empírica de algoritmos de ordenação

Teoria da Computação. Aula 9 Pesquisa em Memória Secundária 5COP096. Aula 9 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Projeto e Análise de Algoritmos

PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação

Aula 07: Algoritmos de busca e Listas encadeadas

Métodos de Busca Parte 1

Algoritmos e Estruturas de Dados I

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

PLANO DE DISCIPLINA DISCIPLINA: Estrutura de Dados 2

Árvores Vermelho-Preto

Árvores Vermelho-Preto

ANÁLISE E PROJETO DE BANCO DE DADOS

Árvores balanceadas. Aleardo Manacero Jr.

Edital de Seleção 053/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Estruturas de Dados Tabelas de Espalhamento

Métodos de Busca Parte 2

Preliminares. Profa. Sheila Morais de Almeida. agosto

Aula 1. Teoria da Computação III

Transcrição:

MC3305 Algoritmos e Estruturas de Dados II Aula 22 && Revisão geral Prof. Jesús P. Mena-Chalco jesus.mena@ufabc.edu.br 2Q-2015 1

Medida de custo/complexidade de um algoritmo 2

(1) medida de custo pela execução de um programa em uma plataforma real Tais medidas são bastante inadequadas e os resultados jamais devem ser generalizados: Os resultados são dependentes do compilador que pode favorecer algumas construções em detrimento de outras; Os resultados dependem de hardware; Quanto grandes quantidades de memória são utilizadas, as medidas de tempo podem depender deste aspecto. 3

(1) medida de custo pela execução de um programa em uma plataforma real Apesar disso, há argumentos a favor de se obterem medidas reais de tempo: Exemplo: Quando há vários algoritmos distintos para resolver o problema; Assim, são considerados tanto os custos reais das operações como os custos não aparentes, tais como alocação de memória, indexação, carga, dentre outros. 4

(2) medida de custo por meio de um modelo matemático Usa um modelo matemático baseado em um computador idealizado. Deve ser especificado o conjunto de operações e seus custos de execuções. É mais usual ignorar o custo de algumas das operações e considerar apenas as mais significantes. Em algoritmos de ordenação: Consideramos o conjunto de comparações entre os elementos do conjunto a ser ordenado e ignoramos as operações aritméticas, de atribuição e manipulação de índices, caso existam. 5

Função de complexidade Para medir o custo de execução de um algoritmo, é comum definir uma função de custo ou função de complexidade f. Função de complexidade de tempo: mede o tempo necessário para executar um algoritmo para um problema de tamanho n. Função de complexidade de espaço: mede a memória necessária para executar um algoritmo para um problema de tamanho n. Utilizaremos f para denotar uma função de complexidade de tempo daqui para frente. Na realidade, f não representa tempo diretamente, mas o número de vezes que determinada operação (considerada relevante) é realizada. 6

Melhor caso, pior caso e caso médio Melhor caso: Menor tempo de execução sobre todas as entradas de tamanho n. Pior caso: Maior tempo de execução sobre todas as entradas de tamanho n. Caso médio (caso esperado): Média dos tempos de execução de todas as entradas de tamanho n. Aqui supoe-se uma distribuição de probabilidades sobre o conjunto de entradas de tamanho n. 7

Comparação de programas Estudamos o comportamento assintótico das funções de custo (comportamento de suas funções de custo para valores grande de n). O comportamento assintótico de f(n) representa o limite do comportamento de custo, quando n cresce. 8

Comparação de programas: exemplo O programa1 leva O programa2 leva vezes para ser executado. vezes para ser executa. Qual dos dois é o melhor? Depende do tamanho do problema. Para n<50, o programa 2 é melhor Para n>50, o programa 1 é melhor 9

Comparação de programas Se uma função não é O(f(n)) isso implica que a função seja Omega(f(n))? 10

11

Tratabilidade do problema Um problema é considerado Intratável (difícil): Se ele é tão difícil que não se conhece um algoritmo polinomial para resolvê-lo Ex. Algoritmo do caixeiro viajante Tratável / bem resolvido (fácil): Se existe um algoritmo polinomial para resolvê-lo. Ex. Algoritmo de multiplicação de matrizes. Algoritmo de Strassen 12

Questão importante 13

Questão importante 14

Recursividade 15

Recursividade Uma função recursiva é aquela que se chama a si mesma (obrigatoriamente)? 16

Recursividade Uma função recursiva não necessariamente é aquela que se chama a si mesma 17

Ordenação 18

Ordenação Os métodos de ordenação são classificados em 2 grandes grupos: Ordenação Interna: Se o arquivo a ser ordenado cabe todo na memória principal Ordenação Externa: Se o arquivo a ser ordenado não cabe todo na memória principal 19

Ordenação 20

Ordenação Os métodos de ordenação são classificados em 2 grandes grupos: Ordenação Interna: Se o arquivo a ser ordenado cabe todo na memória principal Algoritmos Baseados em Comparações Algoritmos Não Baseados em Comparações 21

Ordenação Algoritmos basedos em Comparações Insertion sort Selection sort Bubble sort Merge sort Quick sort Complexidade computacional [limite matemático] [limite assintótico para a ordenação] 22

Ordenação Algoritmos basedo em Comparações Insertion sort Selection sort Bubble sort Merge sort Quick sort Algoritmos não baseados em Comparações (utilizam alguma informação sobre os dados) Counting sort Radix sort Bin sort / Bucket sort Algoritmos que fazem a ordenação em tempo linear 23

Ordenação 24

Ordenação (bogosort.c) 25

Ordenação parcial 26

Ordenação parcial Os algoritmos de Ord. Parcial que estudamos: Seleção parcial Inserção parcial Heapsort parcial Quicksort parcial (implementado muito bem por vocês!) 27

Seleção parcial Um dos algoritmos mais simples. Principio de funcionamento: Selecione o menor item do vetor. Troque-o com o item que está na primeira posição do vetor. Repita estas duas operações com os itens: n-1, n-2, n-3,, n-(k-1), n-k k=7 Animação: https://www.cs.usfca.edu/~galles/visualization/comparisonsort.html 28

Comparação entre algoritmos 29

Heurísticas de pesquisa Procedimento simplificador (embora não simplista) 30

Heurísticas proposta por Rivest Move To Front (MTF) para listas: Elemento vai para a primeira posição. Transposição (T) para vetores: Elemento vai para a uma posição mais perto do início. 31

Heurísticas proposta por Rivest MTF Elemento vai para a primeira posição. T Elemento vai para a uma posição mais perto do início. É possível fazer melhor que MTF e T? Sim Aplicar a regra apenas quando o elemento é acessado k vezes seguidas, para k=2,3, ou 4. Leva mais tempo para estabilizar, mas faz de uma melhor maneira. 32

Árvores 33

Árvores de pesquisa A árvore de pesquisa é uma estrutura muito eficiente para armazenar informação. Apropriada quando existe necessidade de considerar todos ou alguma combinação de: Acesso direto e sequencial eficientes. Facilidade de inserção e retirada de elementos. Boa taxa de utilização de memória. Utilização de memória principal e secundária. 34

Representação hierárquica Representação por barras Representação por parênteses 35

Nós e filhos Carga útil Campos que dão estrutura à árvore O nó folha (=leaf) é um nó que não tem filho algum. Se x tiver um pai, essa árvore é uma subárvore de alguma árvore maior. 36

Varredura Uma função recursiva que faz a varredura e-r-d de uma árvore binária r: 37

Varredura 38

Complexidade de busca em uma ABB Busca em ABB = caminho da raiz até a chave desejada (ou até a folha, caso a chave não exista) Pior caso: Maior caminho até a folha = altura da árvore Complexidade: Uma árvore binária balanceada é aquela com altura 39

Árvore AVL 40

AVL Georgy M. Adelson-Velsky Russia Evgenii Mikhailovich Landis Ucrania (1922-2014/abril/26) (1921-1997) 41

AVL G.M. Adelson-Velskii y E.M. Landis An algorithm for the organization of information. Proceedings of the USSR Academy of Sciences, vol. 146, pp. 263 266, 1962 AVL foi a primeira estrutura (conhecida) de árvore de altura balanceada ou altura equilibrada. 42

Árvores AVL 43

Árvores AVL: Fator de balanceamento O fator de balanceamento/equilibrio de um nó T em uma ABB é definido como: Para qualquer nó T em uma árvore AVL, o fator de balanceamento assume o valor: +1, 0, -1. O fator de balanceamento de uma folha? 44

Árvores AVL: Fator de balanceamento 45

Árvores AVL: Rotações O processo de rebalanceamento é conduzido utilizando 4 tipos de rotações LL RR LR RL 46

Árvores AVL Há um custo adicional para manter uma árvore balanceada, mesmo assim garantindo O(log2 n), mesmo no pior caso, para todas as operações. Em testes empíricos: Uma rotação é necessária a cada duas inserções. Uma rotação é necessária a cada cinco remoções. 47

Árvore Rubro-Negras 48

Árvore Rubro-Negra Rudolf Bayer Computer scientist 49

Árvore Rubro-Negra Somente em 1978, Leo Guibas e Robert Sedgewick, atribuiram a 'coloração' na árvore. A cor "vermelho" foi escolhida porque era a mais bonita produzida pela impressora laser a cores disponíveis para os autores, enquanto trabalhavam na Xerox PARC 50

Propriedades de Árvore Rubro-Negra As propriedades da árvore rubronegra são: 1- Todo nó da árvore ou é vermelho ou é preto 2- A raiz e as folhas (nil) são pretas 3- Se um nó é vermelho, então seus filhos são pretos 4- Para todo nó, todos os caminhos do nó até as folhas descendentes contêm o mesmo número de nós pretos. 51

Altura de uma Árvore Rubro-Negra As ARNs com n nós/chaves internas tem altura, no máximo, igual a 2 lg(n+1) = O(log(n)) A prova é por indução. Ver detalhes no livro de Cormen et al. 52

Inserção 53

Altura de uma Árvore Rubro-Negra Nenhum caminho é maior do que duas vezes o comprimento de qualquer outro caminho 54

AVL vs Rubro-Negra Altura (pior caso) AVL: 1.44 lg(n+1) ARN: 2 lg(n+1) Árvores AVL são mais rigidamente balanceadas que ARN: AVL A inserção e remoção são mais lentas. AVL A busca (recuperação) são mais rápidas. AVL: Eficiente para árvores que mudam pouco. ARN: Eficiente para árvores de mudam muito. 55

AVL vs Rubro-Negra 56

Árvores Digitais (Trie) 57

TRIE originado de 'Information retrieval' TRIE = digital tree = radix tree = prefix tree 58

Árvores digitais (Árvore de prefixos) Palavras/Chaves: A to tea ted ten inn 59

Árvores TRIE A busca se inicia na raiz. As busca continua com a subárvore associado ao símbolo/caratere procurado até chegar a uma folha (ou nó interno) Essa estrutura permite fazer buscas eficiente de cadeias que compartilham prefixo. 60

Implementando uma ATRIE 61

Árvores P.A.T.R.I.C.I.A. acrônimo de Practical Algorithm To Retrieve Information Coded In Alphanumeric 62

PATRICIA 63

Árvores PATRICIA TRIE compactada binária. Caminhos que possuem nós com apenas 1 filho são agrupados em uma única aresta. Diferente das TRIE, não armazena informações nos nós internos, apenas contadores e ponteiros para cada subárvore descendente. Ou seja, nenhuma chave é prefixa de outra. 64

PATRICIA: Exemplo de representação Registro acumulativo que integra todos os nós exeto nas folhas. Indica o caractere que deve ser comparado ao caractere da chave informada. Identifica qual a posição do caratere da chave informada que deve ser analisado Similar às ABBs: Se a chave é menor ou Igual ao nó, ela é consultada à esquerda, caso contrário, à direita. 65

PATRICIA Vantagem Permite armazenar um número de posições para qual é movido para fentre antes de fazer a próxima comparação. [elimina comparações desnecessárias melhora o desempenho] 66

PATRICIA Desvantagem Considera apenas 2 subárvores. Se mais do que duas chaves são distintas na mesma posição do caratere, é necessário adicionar nós extras ao índice para separa-lo. [Se n chaves são distintas na mesma posição, então serão necessários n-1 nós para separá-los. Se muitos casos destes acontecem, é preferível utilizar TRIE] 67

Árvores 50 60 70 80 90 Anos log(m) log(n) 1960 TRIE 1968 PATRICIA 1962 AVL 1972 Symmetric Binary B-Trees 1978 Red-Black 68

Árvores B 69

Artigo: R. Bayer, E. McCreight Organization and Maintenance of Large Ordered Indexes. Acta-Informatica, 1:173-189, 1972. 70

P D A B C D M P G I W T M N P R S W T U W 71

http://blog.hackerrank.com/the-unhealthy-obsession-with-tree-questions/ 72

HASHING (tabelas de dispersão) 73

Problemas com o acesso direto As chaves nem sempre são valores numéricos: Exemplo: chaves com nomes de pessoas. Solução: Contruir uma representação numérica das chaves. Função F(chave) {0,1,...,m-1} O problema dos espaços é mais grave! Exemplo: duas chaves 0 e 999.999 Acesso direto: tabela de 1milhão de buckets, sendo que somente dois seriam ocupados. Solução: o uso de tabelas de dispersão. Precisamos de um bucket para cada chave possível. 74

Tabelas de dispersão (Hashing) Através da aplicação de uma função conveniente (função de dispersão ou função hash), a chave é transformada em um endereço de tabela (endereço base). hash(chave) {0, 1,,m-1} Note: m, não n. O método aproveita a possíbilidade de acesso randômico a memória para alcançar uma complexidade média O(1), sendo o pior caso, entretanto, O(n) 75

Tabelas de dispersão/espalhamento Duas formas de tratar colisões: Endereçamento aberto. Resolução de colisões através de encadeamento. Para evitar colisões usa-se uma função Hash que apresente comportamento randômico 76

Custo de acesso a disco 77

Custo do acesso a disco O custo do acesso a disco pode ser dividido em três operações distintas Tempo de busca (seek). Atraso rotacional no disco. Tempo de transferência dos dados.

Custo do acesso a disco Tempo de busca (Seek time) Tempo necessário para se mover o braço de acesso para o cilindro correto. Atraso rotacional (Rotational delay) É o tempo que o disco necessita para rotacionar de forma que o setor desejado fique sob a cabeça de leitura/escrita. Tempo de transferência (Transfer time) É dado pela seguinte fórmula: Tempo de transferência = (Número de bytes transferidos / Número de bytes na trilha) x tempo de rotação.

Comparação memória RAM vs discos Discos Um acesso na memória RAM (Random Access Memory) tipicamente pode ser feito em 30 a 60 nanosegundos (30 x10-9 s). Obter a mesma informação no disco tipicamente leva de 7 a 10 milisegundos (7 x10-3 s). Memória RAM é cerca de 1 milhão de vezes mais rápida que o disco. Mas provêm uma capacidade maior a um preço menor. Também são capazes de reter dados quando o computador é desligado. são lentos

Estado-da-arte Gustavo S. Pavani 81

Conjuntos disjuntos 82

Estruturas para conjuntos disjuntos Union-Find Coleção {S1,..., Sk} de conjuntos disjuntos dinâmicos (que variam ao longo do tempo) Cada conjunto Sk é identificado por um representante, que é um membro do conjunto. Geralmente não importa quem é o representante 8 7 3 2 1 9 0 6 5 4 0 1 2 3 4 5 6 7 8 9 C 5 1 1 35 5 5 3 35 83

Operações Make_Set(x): Cria um novo conjunto cujo único elemento é apontado por x. x não pode pertencer a outro conjunto da coleção. Union(x, y): Executa a união dos conjuntos que contêm x e y, digamos Sx e Sy, em um conjunto único. Sx Sy é vazio (conjuntos disjuntos). O representante de S = Sx Sy é um elemento de S. Find(x): Devolve um ponteiro para o representante (único) do conjunto que contém x. 84

Aplicações Algumas aplicações envolvem o agrupamento de N elementos em uma coleção de conjuntos disjuntos, ou seja, um particionamento dos elementos em conjuntos. Alguns usos Problemas de grafos E.g. árvore geradora mínima, componentes conexas Agrupamento (clustering) Envolvido em mineração de dados e reconhecimento de padrões 85

Heurística para floresta de conjuntos disjuntos União ponderada (union by rank): faça a raiz da árvore com menor rank (altura) apontar para a raiz da árvore com maior rank. Compressão de caminhos (path compression): durante uma busca (Find_Set) faça os nós do caminho apontar para a raiz Find_Set(a) 86

Na prática 87

Para finalizar 88

Tópicos interessantes Algoritmos por força bruta. Backtracking (refinamento da busca por força bruta). Algoritmos Gulosos (Greedy algorithms) Algoritmos de programação dinamica (Dynamic programming) Algoritmos Randomizados (Monte Carlo algorithms) Testes de software Códigos elegantes 89

Código elegante para os artesão de software Código que funciona Vs Código bonito Elegância é sinônimo de beleza. Em computação também foram associados as conotações de eficâcia e simplicidade. 90

Código elegante 91

Código elegante The book is about "topics like testing, debugging, portability, performance, design alternatives, and style," which, according to the authors, "are not usually the focus of computer science or programming courses". It treats these topics in case studies, featuring implementations in several programming languages (mostly C, but also C++, AWK, Perl, Tcl and Java). "The book fills a critical need by providing insight into pragmatic designand coding issues so that programmers become better at their craft...programmers just out of school should be given this book on their first day of work. It will save employers thousands of dollars due to lost productivity and "mindless" debugging." -- Paul McNamee, Computer Scientist, Johns Hopkins University Applied Physics Laboratory 92

93

Sobre a P2 Tópicos: Todos os tratados no quadrimestre Dia: 18/08 (com inicio -opcional- 30min antes do horário) Resumo: Pode trazer uma folha A4 contendo um resumo (feito a mao) 94