Estrutura de Dados e Algoritmos em C Roberto de Beauclair Seixas [email protected] Porque usar computador ? “É indigno de homens eminentes perder horas como escravos na tarefa desgastante de calcular. Esse trabalho bem poderia ser confiado a pessoas sem qualquer qualificação especial, se máquinas pudessem ser utilizadas.” Gottfried Wilhelm Leibniz 2 Engenharia de Software “Engenharia de software é a área interdisciplinar que engloba vertentes tecnológicas e gerencial visando a abordar, de modo sistemático, os processos de construção, implantação e manutenção de produtos de software com qualidade assegurada por construção, segundo cronogramas e custos previamente definidos.” 3 Engenharia de Software Interdisciplinar baseada nos seguintes áreas: Ciência da Computação Sistemas e Modelos Avaliação de Complexidade de Problemas Álgebra Linear Cálculo Administração de Projetos Comunicação 4 Estrutura de Dados Em linguagens de programação o Tipo de Dado de uma variável define o conjunto de valores que a variável pode assumir. Tipo Abstrato de Dados é o Tipo de Dado em termos do que os usuários podem fazer e não ao computador. Estrutura de Dados é um método particular de se implementar um Tipo Abstrato de Dados. A implementação de um Tipo Abstrato de Dados escolhe uma Estrutura de Dados para representá-lo. Cada Estrutura de Dados é construída dos tipos básicos (int, real, char) ou dos tipos estruturados (array, record) de uma linguagem de programação. 5 Abu Abd-Allah ibn Musa al'Khwarizmi Seu trabalho mais importante escrito em 830 nos dá a palavra álgebra. classifica a solução de equações quadráticas e dá métodos geométricos para completar o quadrado. Al'Khwarizmi também escreveu números Hindu-árabe. Este texto de árabe está perdido mas uma tradução latina “Algoritmi de numero Indorum”, em inglês “Al-Khwarizmi on the Hindu Art of Reckoning”, deu origem a palavra algoritmo que deriva do nome dele no título. O primeiro uso do zero com lugar posicional na anotação básica provavelmente foi devida a al'Khwarizmi. 6 Algoritmo Dicionário Webster: “Any special method of solving a certain kind of problem.” 7 Algoritmo Dicionário Webster: “Any special method of solving a certain kind of problem.” ( parece coisa do McGuiver! ) 8 Algoritmo Fundamentals of Computer Algorithms; E.Horowitz, S.Sahni; 1978: “A precise method useable by a computer for the solution of a problem.” 9 Algoritmo Fundamentals of Computer Algorithms; E.Horowitz, S.Sahni; 1978: “A precise method useable by a computer for the solution of a problem.” 10 Linguagem C Desenvolvida pelo Bell Lab no início dos anos 70, visando a implementação do UNIX. Possui um padrão feito por Kernighan e Ritchie em 1978. Tem facilidades para a programação em “alto” e “baixo” níveis e gera código eficiente. Possui um grande conjunto de operadores, o que permite um código compacto, porém de baixa legibilidade. É excelente para construir programas portáveis. 11 Oops! #include <stdio.h> main(){char *b=" .:-;!/>)|&IH%*#"; float i,j,k,r,x,y=-16; while (puts(""),y++<15) for(x=0;x++<84; putchar(b[(int)k&15])) for(i=k=r=0; j=r*r-i*i-2+x/25, i=2*r*i+y/10, j*j+i*i<11&&k++<111; r=j);} 12 Motivação: Presente Engenharia de Software: What the Hell is this? Engenheiros Civis fazem Plantas antes de construírem prédios; Engenheiros Eletrônicos fazem Esquemas antes de montarem aparelhos; Engenheiros Mecânicos fazem Desenhos antes de produzirem máquinas; Engenheiros de Software são superdotados pela Mãe Natureza, e não precisam de nada disso! “Se prédios fossem construídos da mesma forma que fazemos sistemas, o primeiro pica-pau que aparecesse no planeta destruiria a humanidade” - Weinberg 14 A Engenharia de Software é uma área MUITO NOVA! O ser humano faz casas e abrigos há milhões de anos; O ser humano lida com eletricidade há milhares de anos; O ser humano produz máquinas e ferramentas há outros milhares de anos; O ser humano faz software há 40 anos. Estamos nos primórdios da computação... 15 Conclusão “A formulação de um problema é freqüentemente mais essencial do que sua solução, a qual pode ser meramente uma questão de habilidade matemática ou experimental.” Einstein e Infeld, “A Evolução da Física” - 1938 16 Aderência da Linguagem 17 Motivação: Passado e Futuro(?) Alan M. Turing (1912-1954) Computing Machinery and Intelligence. Mind, Vol. LIX. 433-460, 1950. Os computadores terão inteligência. Debate: Então, e agora ? Será uma relação simbiótica ? (computador como uma ferramenta) Os computadores terão “consciência”? 19 53 anos depois Previsão de tecnologia de Turing foi fantástica! Armazenamento de Gb de memória são comuns. Previsão de inteligência foi otimista. Vários locais da Internet oferecem “chatterbots” do Teste de Turing. Ninguém passou (ainda) ` http://www.loebner.net/Prizef/loebner-prize.html Os testes de Turing ainda se apresentam como desafios de longo prazo. Mas acredita-se que não demorará menos de 50 anos, mais de 10 anos. 20 Mas, houve progresso ... Computadores solucionaram alguns problemas: “Mapa de 4 cores” K. Appel and W. Haken, “The solution of the four-color-map problem,” Scientific American, Oct 1977, 108-121 e uma prova “manual” http://www.math.gatech.edu/~thomas/FC/fourcolor.html (1995) Os computadores venceram o campeão mundial de xadrez com alguma ajuda dos programadores, mas … venceu! Os computadores estão presentes no dia-a-dia Ajudam a projetar e idealizar novas coisas Estas são relações simbióticas. Aprendizado e formação de conhecimento ainda são ilusórios. 21 Armadilha dos números Os seres humanos possuem 100 Tb de informação (1012) e podem processar 100 T ops. ROBOT, Hans Moravec, Oxford, 1998, page 58 Então, um supercomputador “tem” um poder comparável. O Genoma humano tem 109 bits: 90% não possuem informação alguma (proteínas de ligação) 90% em comum com os chimpanzés 90% comum entre os indivíduos Então, realmente só 106 bytes são relevantes (huh?!) Estamos perdendo algo ... Um excelente algoritmo de compressão ? Uma melhor linguagem de programação ? Técnicas de aprendizado ? 22 Charles Babbage (1791-1871) Os objetivo de Babbage foram alcançados mas ainda precisamos de melhores algoritmos e máquinas mais rápidas. O que acontecerá quando: A capacidade de processamento for infinita ? A capacidade de armazenamento for infinita ? Limites remanescentes: Conteúdo: A capacidade de informação do Cyberspace Software: Bugs, >100$ por linha de código (!) Processamento: > 1,000 $/cpu/ano 23 Benefícios Hoje os computadores podem: Ler para os cegos (OCR & Texto → Fala) Ouvir para os surdos (Fala → Texto) Escrever para os deficientes (Fala → Texto) Logo: Substituir deficiências: ` melhor memória, melhor visão, … Novas formas de comunicação ` Tradução automática de telefonemas Revolucionar a interface homem-computador 24 Vannevar Bush (1890-1974) “As We May Think” The Atlantic Monthly, 1945 http://www.theatlantic.com/unbound/flashbks/computer/bushf.htm Memex Todo conhecimento humano … “a billion books” hyper-linked together ... Registrando tudo o que se vê ` filmes e fotos ` ... “a machine which types when talked to” ... Navigate by ` … text search following links associations ... Conexões diretas ao sistema nervoso ? 25 Memex Individual Memex: “Lembrar o que é visto e ouvido e rapidamente devolver qualquer informação solicitada” 26 Quanto de Informação Existe ? Logo, tudo poderá ser gravado e catalogado. A maioria da informação nunca será vista. Fundamentos tecnológicos: Atenção humana “Sumarização” automática Busca automática http://www.lesk.com/mlesk/ksg97/ksg.html 27 Resumo Pense seriamente sobre Algoritmos Qual o melhor algoritmo para um problema? → “aderência” Oito paradigmas para projetar um bom algoritmo: 1. reduzir a um problema conhecido (ex: ordenação); 2. recursão; 3. criar ou expandir uma estrutura de dados; 4. dividir e conquistar; 5. guloso; 6. programação dinâmica; 7. probabilidade; 8. aproximação. 28 Cuidado com os efeitos colaterais! 29 Estruturas de Dados e Algoritmos em C Proposta de Curso – Nível Iniciação Científica A finalidade deste curso é ensinar ao aluno as técnicas básicas de estruturação de dados em linguagens convencionais e capacitá-lo a empregar essas técnicas, na construção de pequenos programas. Descrição do Curso Familiarizar os alunos com a linguagem de programação C, enfocando os elementos essenciais para a construção de programas confiáveis, seguros, corretos, eficientes e baratos. Para tanto, as estruturas de dados básicas serão estudadas e implementadas em C, bem como algoritmos para manipulá-las. 30 Ementa Linguagem C Conceitos fundamentais Expressões Controle de fluxo Funções Estruturas de dados básicas Vetores Matrizes Cadeia de caracteres Tipos estruturados Ordenação e busca Arquivos Ordenação Busca Hashing Aplicações Grafos e árvores Buscas Árvore geradora mínima Caminho mínimo Redes de fluxo Estruturas de dados dinâmicas Alocação dinâmica Listas encadeadas Pilhas Filas Árvores 31 Problema Algorítmico Problema E ⇒ conjunto das possíveis entradas S ⇒ conjunto das saídas desejadas R(E,S) ⇒ relação entre entradas e saídas desejadas O ⇒ operações válidas Solução A ⇒ algoritmo correto e ∀e ∈ E A s (e,s) ∈ R(E,S) 32 Solução de Problemas modelo modelomatemático matemático algoritmo algoritmoinformal informal tipo tipoabstrato abstratode dedados dados pseudo pseudocódigo código estrutura estruturade dedados dados programa programa ... código códigode demáquina máquina 33 Algoritmos e Complexidade Problema, Instância e Algoritmo. Dado um problema: Como encontrar um algoritmo eficiente para solucioná-lo ? Uma vez encontrado, como compará-lo a outros algoritmos que também resolvem o problema ? Como determinar se o algoritmo está correto ? Como determinar se o algoritmo é eficiente ? 34 Algoritmo Conjunto finito de instruções, composta de uma ou mais operações válidas, com o objetivo de resolver um problema específico. Operações válidas definidas efetivas 5÷0 √π Término em tempo finito (procedimento computacional) Entrada (opcional) Saída (uma ou mais) 35 Alguns Exemplos Iniciais Para qualquer algoritmo, temos que provar que ele sempre retornará o resultado desejado para todas as instâncias possíveis do problema. ⌦ ⌦ Correção (Correctness) Eficiência 36 Critérios de Análise especificação Eficácia Correção problema algoritmo requisitos verificação NÃO erros código Eficiência Tempo Espaço Simplicidade / Clareza Otimalidade Limitações Computabilidade Tratabilidade SIM solução Parcialmente Correto entrada válida → saída desejada pode ser tempo infinito Totalmente Correto tempo finito saída desejada 37 Correção não é óbvio! ⌦ ⌦ ⌦ Você recebeu a tarefa de programa um braço de robô de soldagem. O robô deve soldar (visitar) o primeiro ponto de solda, depois o segundo, terceiro e assim por diante. Determine um algoritmo para achar o melhor caminho. 38 Vizinho Mais Próximo ⌦ Inicie em algum ponto p0 e então vá para o ponto mais próximo p1. Repita o processo a partir de p1, etc. até que todos os pontos sejam visitados. Escolha e visite um ponto inicial p0 p = p0; i = 0; enquanto existirem pontos não visitados i=i+1 escolha e visite o ponto pi, mais próximo de pi-1 retorne ao ponto inicial ⌦ Este algoritmo é simples de entender, simples de entender e muito eficiente. Está correto ? 39 Vizinho Mais Próximo ⌦ Algoritmo não é correto! ⌦ Escolher sempre o ponto mais próximo é muito restritivo, pois pode nos levar a fazer movimentos desnecessários. 40 Par Mais Próximo ⌦ Conectar ao par mais próximo de pontos cuja conexão não irá causar um ciclo ou bifurcações, até se formar uma única cadeia de pontos com todos os pontos. faça n ser o número de pontos do conjunto e d = ∞ para i = 1 até n - 1 faça para cada par de pontos (x,y) de caminhos parciais if (dist(x,y) <= d) então xm = x; ym = y; d = dist(x,y); conecte (xm, ym) por uma aresta conecte os dois pontos por uma aresta ⌦ Este algoritmo está correto para o contra-exemplo anterior. Então agora estará correto ? 41 Par Mais Próximo ⌦ Algoritmo ⌦ Existe não é correto! algoritmo correto ?! 42 Um algoritmo correto Podemos tentar todas as ordenações de pontos possíveis e então selecionar a ordenação que minimiza o comprimento total. Uma vez que todas as possíveis ordenações são consideradas, podemos garantir que teremos o melhor caminho possível. Mas, isso significa testar n! permutações, que é extremamente lento. Tão lento que é inviável quanto se tem mais de 10 ou 20 pontos. Conclusão: Não existe um algoritmo correto eficiente! Traveling Salesman Problem 43 Eficiência “Porque (simplesmente) não usar um supercomputador?” Supercomputadores são para pessoas muito ricas e muito estúpidas para escrever algoritmos eficientes! (S.Skiena) Um algoritmo rápido rodando em um computador lento irá sempre ganhar de um supercomputador com um algoritmo ruim para instâncias suficientemente grandes. Normalmente, os problemas não chegam a ficar tão grandes antes do algoritmo rápido ganhar. 44 Problema: Ponto em Polígono Dado em polígono plano simples, ou seja, os lados não se cruzam, P e um ponto p do plano, decidir se p é interior ou não ao polígono P. •p P 45 Complexidade Assintótica Existe algum algoritmo que resolve o problema? Isso requer que o algoritmo pare após um número finito de passos para qualquer instância do problema. Dado um certo algoritmo A, quão eficiente é este algoritmo? Dado dois algoritmos A e B, qual deles é superior? Dentre todos os algoritmos que resolvem o problema, qual deles é melhor? Medir a complexidade (ou eficiência) de um algoritmo pelo tempo necessário à sua execução em função do tamanho da instância. (Complexidade Assintótica O(f (n))) 46 Análise de Algoritmos Recursos Computacionais Tempo de execução e quantidade de memória Implementação do Algoritmo Linguagem e arquitetura Tamanho da entrada (N) Número de elementos ou número de nós da expressão Complexidade (tempo) de Pior Caso T(N): Maior tempo de execução do algoritmo com todos os problemas possíveis de tamanho N. T(N) é proporcional ao número total de instruções t (N) executadas para o pior caso de tamanho N ⇒ T(N) = c t (N) 47 Definição 1 Um algoritmo A para resolver P tem complexidade O(f (n)) se existe uma constante k > 0 e um natural N tais que, para qualquer instância de P de tamanho n > N, o número de passos de A necessários para resolver esta instância é, no máximo, k f (n). ex. 1000 n2 “ambiente computacional”` “natureza do método” 48 Ordens de Magnitude x←x+y for i ← 1 to n for i ← 1 to n begin begin x←x+y end for j ← 1 to n begin x←x+y end end 1 n n2 49 Complexidade Se um algoritmo processa problemas de tamanho n em tempo cn2 para alguma constante c, então dizemos que a complexidade (time complexity) do algoritmo é O(n2), lendo-se “ordem n2”. algoritmo A1 A2 A3 A4 A5 complexidade n n log n n2 n3 2n 1s 1000 140 31 10 9 1m 1h 6x104 3.6x106 4893 2.0x105 244 1897 39 153 15 21 50 Tempo de Execução Tamanho Complexidade 20 50 100 200 500 1000 1000 n 0.02 s 0.05 s 0.1 s 0.2 s 0.5 s 1s 1000 n log n 0.09 s 0.3 s 0.6 s 1.5 s 4.5 s 10 s 100 n 2 0.04 s 0.25 s 1s 4s 25 s 2m 10 n 3 0.02 s 1s 10 s 1m 21 n 2.7 h n log n 0.4 s 1.1 h 220 d 125 s 5E8 s 2n 1s 35 a 3E4 s - Obs.: Supondo que 1 operação leva 1 µs. 51 Curiosidades Explosão Combinatorial 100! → número com 158 dígitos 120! → número com 200 dígitos número de prótons no universo → 126 dígitos número de µ segundos desde o Big-Bang → 24 dígitos Impacto da Evolução Tecnológica algoritmo n n2 n3 2n atuais N1 N2 N3 N4 100 x 100 N1 10 N2 4.64 N3 N4 + 6.64 1000 x 1000 N1 31.6 N2 10 N3 N4 + 9.97 52 Outra Curiosidade (sic!) Dada a função f abaixo, calcule o seu valor para x = 40545 e y = 70226. f (x,y) = 9 x4 - y4 + 2 y2 dígitos: 3 7 11 15 19 21 1010 -10-13 1.3 107 82152 2 Oops! O valor correto é 1 53 Outra Curiosidade (sic!) Dada a função f abaixo, calcule o seu valor para: x = 77617 y = 33096. f (x,y) = 333.75 y6 + x2 (11 x2 y2 - y6 - 121 y4 - 2) + 5.5 y8 + x/2y Precisão simples: Precisão dupla: Precisão extendida: 1.172603… 1.1726039400531… 1.172603940053178… Oops! O valor correto é -0.8273960599… ( - 54767 / 66192 ) 54 Moral da História “Computers do not solve problems, People do!” E.R.Davidson 55