SIMPÓSIO BRASILEIRO DE PESQUISA OPERACIONAL 8 a 11 de novembro de 2002, Rio de Janeiro/RJ A PESQUISA OPERACIONAL E AS CIDADES
|
|
- Júlio Barata Bentes
- 6 Há anos
- Visualizações:
Transcrição
1 XXXIV SBPO SIMPÓSIO BRASILEIRO DE PESQUISA OPERACIONAL 8 a 11 de novembro de 2002, Rio de Janeiro/RJ A PESQUISA OPERACIONAL E AS CIDADES METODOLOGIA PARA O CÁLCULO DA COMPLEXIDADE DE ALGORITMOS E O PROCESSO DE AVALIAÇÃO DAS EQUAÇÕES DE COMPLEXIDADE Marco Antonio de Castro Barbosa UNICRUZ - Universidade de Cruz Alta Departamento de Informática Cx. Postal 858 CEP Cruz Alta (RS) Tel.(55) marco@unicruz.edu.br Laira Vieira Toscani Leila Ribeiro UFRGS Universidade Federal do Rio Grande do Sul Instituto de Informática Departamento de Informática Teórica Cx. Postal CEP Porto Alegre (RS) Tel.(55) {laira,leila}@inf.ufrgs.br Resumo: Este artigo apresenta um método de cálculo da complexidade de algoritmos para o pior caso. Tal método baseia-se em estruturas algorítmicas que são identificadas e expressas na forma de equações de complexidade. É apresentado também o processo de resolução dessas equações na análise da complexidade de algoritmos. Um exemplo de utilização da metodologia é o protótipo de sistema ANAC, que realiza a análise automática do cálculo da complexidade de algoritmos para o pior caso. Palavras Chaves: Complexidade de algoritmos, análise de algoritmos, equações de complexidade. Abstract: This paper show a methodology to calculate the complexity of algorithms to the worst case. This methodology is baseaded in the algorithms structures. This structures are identified and express in the way of complexity equations. The system ANAC is an example of this methodology. Key Words: Complexity of algorithms, algorithms analisys, complexity equations. 1 Introdução A análise da complexidade de um algoritmo é usualmente tratada de maneira muito particular, ou seja, é uma atividade muito dependente da classe dos algoritmos a serem analisados. O cálculo depende essencialmente da função tamanho da entrada e das operações fundamentais. No entanto, alguns aspectos do cálculo da complexidade dependem das estruturas que compõem o algoritmo, podendo ser assim generalizados. Esta idéia motivou o desenvolvimento de uma metodologia de cálculo de complexidade para estruturas algorítmicas para o pior caso [1]. Essa idéia serviu de motivação para o desenvolvimento do protótipo de sistema ANAC [2], que constitui-se em uma ferramenta para análise automática da complexidade de algoritmos. Este artigo está dividido em 7 seções. A seção 2 apresenta alguns conceitos básicos de Complexidade de Algoritmos. Na seção 3 são vistos alguns sistemas para automatização da cálculo da complexidade de algoritmos. A seção 4 trata do método desenvolvido baseado nas estruturas algorítmicas. A seção 5 trata do protótipo de sistema ANAC para análise automática de algoritmos. Na seção 6 é apresentado o processo de resolução das equações de complexidade. Na seção 7 são apresentadas as conclusões.
2 2 Definições de Complexidade de Algoritmos A análise de algoritmos é uma atividade que contribui para o entendimento fundamental da Ciência da Computação. Segundo Aho [3], a complexidade é o coração da computação. A construção de um algoritmo visa não apenas à solução de um determinado problema, mas à construção de um algoritmo bom, ou seja, que solucione o problema e seja eficiente. A complexidade de algoritmos consiste na quantidade de trabalho necessária para a sua execução, expressa em função das operações fundamentais, as quais variam de acordo com o algoritmo, e em função do volume de dados. As operações fundamentais são aquelas que, dentre as demais operações que compõe o algoritmo, expressam a quantidade de trabalho, portanto extremamente dependentes do problema e do algoritmo. De acordo com Knuth [4], um algoritmo é um método abstrato para computar a solução de um problema. Um problema, segundo Veloso & Veloso [5], é uma 3-upla p = <D,R,q>, onde D é o domínio das instâncias do problema, R é o domínio dos resultados e p é uma relação binária entre D e R que define o problema. Uma solução de p é uma função total α : D R, tal que ( d D)((d, α(d)) q). Desta forma, dado um problema p = <D,R,q> e uma solução α para p, um algoritmo a α é um método abstrato que computa α. Dado um problema p = <D,R,q> com solução α considera-se a o conjunto de todos os algoritmos que computam α. Para calcular a complexidade de um algoritmo a a, deve-se determinar as operações fundamentais e definir a função tamanho do problema. Se houver mais de uma operação fundamental é necessário que se defina o peso de cada operação. Considere E o conjunto de todas as seqüências de execução das operações fundamentais. Obtém-se o seguinte diagrama: a execução E tamanho ΙΝ D f ΙΝ custo Figura 1 Diagrama de Complexidade onde: execução: a x D E; execução(a, d) := seqüência de execuções de operações fundamentais efetuadas na execução do algoritmo a, com entrada d. custo: E ΙΝ; custo(s) := comprimento da seqüência s, definido conforme o peso estabelecido para as operações fundamentais. tamanho: D ΙΝ; tamanho(d) := tamanho da entrada d. Determinadas as funções fundamentais e a função tamanho, o conjunto a é particionado (os algoritmos com mesmas funções fundamentais e mesma função tamanho ficam na mesma classe). A complexidade é então definida dentro de cada classe. Considere A como uma dessas classes e defina a complexidade de cada elemento de A, como uma função do tipo ΙΝ ΙΝ. A complexidade é portanto um funcional do tipo A (ΙΝ ΙΝ), isto é: complexidade: A f e f :={f/f: ΙΝ ΙΝ}. Para a A, complexidade(a) = f. A função tamanho não é inversível. Dado n ΙΝ, para avaliar f(n) é necessário considerar todas as entradas d D com tamanhod(d):=n, é calculado custo(execução(a,d)) e então, conforme o critério de complexidade desejado é estabelecido f(n). Pode-se dizer que: 2
3 f(n) := avaliação({custo(execução(a,d))/d D e tamanho(d) = n}). E custo(execução(a,d)) pode ser denominado desempenho de d em a, ou simplesmente desempenho de d, quando está claro quem é a, i.é., desempenho(d) := custo(execução(a,d)). Dados a a e n ΙΝ, sejam E n := {d/d D e tamanho(d) = n} e prob(d) a probabilidade de d ocorrer, então: avaliaçãocpc(n) := max{desempenho(d) / d E n } define a Complexidade no Pior Caso, e: avaliaçãocm ( n) : = prob( b). desempenho( d) d En define a Complexidade no Caso Médio. A complexidade assintótica de tempo de computação de um algoritmo ignora todos os fatores que são dependentes da linguagem de programação e da máquina e concentra-se em determinar a ordem de magnitude da freqüência de execução das operações. O comportamento assintótico de um algoritmo é o mais procurado, já que para um volume grande de dados é que a complexidade tornase mais importante. O algoritmo assintoticamente mais eficiente é melhor para todas entradas, exceto entradas relativamente pequenas. Várias medidas de complexidade assintótica podem ser definidas, a mais usada é a notação 0.[6] A notação 0: Esta notação define um limite assintótico superior, isto é f(n) é 0(g(n)) sss ( c) ( n 0 ) ( n n 0 ) f(n) c.g(n), Isto é, a partir de um certo n 0, f(n) não cresce mais que c.g(n) ; ou f(n) tem o mesmo tipo de crescimento que g(n). Onde n é um parâmetro que caracteriza o volume de dados de entrada do algoritmo. Se f(n) é 0(g(n)), por abuso de linguagem também se escreve f(n) = 0(g(n)). Assim o cálculo da complexidade se concentra em determinar a ordem de magnitude do número de operações fundamentais na execução do algoritmo em função do tamanho da entrada. Uma das mais importantes medidas de complexidade de algoritmos é a medida de tempo. Isto se justifica em razão de boa parte da pesquisa em Ciência da Computação consistir do projeto e análise de algoritmos em relação à eficiência. Neste trabalho chamar-se-à de simplesmente complexidade à complexidade de tempo. Existem duas principais medidas de complexidade de tempo de um algoritmo: complexidade no Pior Caso e complexidade no Caso Médio. A complexidade no pior caso é geralmente a medida mais empregada na prática. Fixado um tamanho de entrada, a análise no pior caso é feita em relação ao número máximo de operações fundamentais necessárias para a resolução de qualquer problema do tamanho fixado. Seu valor pode ser considerado como um limite de complexidade que não será ultrapassado, sendo portanto, uma garantia de qualidade mínima do algoritmo. O aspecto negativo da análise no pior caso é que leva em consideração os casos caóticos que dificilmente irão ocorrer na prática. 3 Análise Automática de algoritmos Nas últimas décadas muitos estudos foram realizados sobre a análise de algoritmos. Entretanto estes estudos focalizavam, em sua maioria, à análise de algoritmos específicos, tais como algoritmos de classificação, pesquisa e etc. Poucos estudos foram destinados à automatização do processo de análise de forma mais genérica. Na década de 70 surgiram as primeiras tentativas de automatizar o processo de análise de algoritmos. Algumas destas tentativas resultaram em sistemas, como é o caso dos sistemas METRIC [7], ACE [8] e o Lambda-Upsilon-Omega[9]. O sistema METRIC, desenvolvido por Wegbreit foi o primeiro sistema criado com a finalidade de analisar algoritmos de forma totalmente mecânica. Este sistema transforma especificações de programas em equações de recorrência e ao resolver estas equações obtém a complexidade do programa analisado. O METRIC analisa programas segundo as medidas de desempenho apresentadas por Knuth [10], sendo elas a complexidade mínima (melhor caso), a complexidade 3
4 máxima (pior caso) e a complexidade média. Wegbreit estabeleceu uma análise mecânica de programas como uma atividade viável, o que foi inovador e motivou novas pesquisas neste campo. O sistema ACE (Automatic Complexity Evaluator), desenvolvido por Le Métayer possui uma abordagem um tanto similar ao escopo de Wegbreit aplicada, no entanto, à análise no pior caso. O ACE analisa programas funcionais usando uma base de dados com regras que convertem as especificações de programas em equações de complexidade. O sistema Lambda-Upsilon-Omega - ΛϒΩ, desenvolvido por Flajolet, Salvy e Zimmermann é um sistema projetado para realizar análise automática de classes restritas de procedimentos puramente funcionais. O sistema baseia-se na conjunção de duas idéias: 1) Recentes metodologias em análise combinatorial, que mostraram uma correspondência geral entre estruturas de dados e especificações de algoritmos e equações operando sobre funções geradoras. A computação automática destas equações de funções geradoras é realizada pelo Sistema Analisador Algébrico - ALAS. 2) As equações obtidas pelo ALAS são passadas para um Sistema Analítico ANANAS, que é uma coleção de rotinas algébricas escritas na linguagem Maple, para serem resolvidas. 4 Complexidade das Estruturas Algorítmicas Alguns aspectos do cálculo da complexidade de algoritmo dependem das estruturas que o compõem [1]. Serão consideradas a seguir as estruturas: Atribuição: a := b ; Seqüência: a ; b ; Condicional: if a then b else c ; Iteração: for k = i to j do a ; Iteração Condicional: while a do b ; A descrição das metodologias utiliza as seguintes notações: c(a) - Complexidade de a no pior caso (n) - Tamanho de entrada t k (n) - Tamanho de entrada após k-ésima iteração A complexidade de um algoritmo pode ser definida a partir da soma das complexidades de suas partes. A complexidade de uma parte pode ser absorvida pela de outra parte no seguinte caso: A complexidade de a é absorvida pela complexidade de b, se e somente se c N n N complexidade(a)(n) c. complexidade(b)(n). Neste caso, diz-se que: complexidade(a) + complexidade (b) = complexidade(b) Por exemplo, considere complexidade(a) e complexidade(b) polinômios, n 2 e n 3 respectivamente. Neste caso a complexidade de menor grau é absorvida pela de maior grau. Desta forma, complexidade(a) é absorvida por complexidade(b), ou seja, n 2 é absorvida por n 3. A seguir cada uma das estruturas algorítmicas citadas é analisada e é definida uma expressão para a complexidade. 4.1 Atribuição A atribuição é apresentada na forma: a := b ; A complexidade associada a esta estrutura depende do tipo dos dados envolvidos. c (a := b) = c(:=) + c (b) A atribuição pode ser uma operação simples, como a atribuição de um valor a uma variável, ou uma atribuição mais complexa, como a inserção de um nodo num grafo, a atualização de uma matriz, dentre outros. A atribuição pode ainda requerer uma avaliação de b, que pode ser uma expressão ou uma função. Nestes casos, existe um esforço computacional associado a operação de atribuição c(:=) propriamente dita e um esforço associado à avaliação de b. 4.2 Seqüência Este estrutura tem a forma: a ; b ; 4
5 A complexidade da seqüência é a soma das complexidades componentes. A execução de a, entretanto pode alterar o volume de dados para b, então: c(a ; b) (n) = c(a) (n) + c(b) (t(n)) onde, t(n) é o tamanho da entrada após a execução de a, dado que antes da execução era n. 4.3 Condicional A estrutura condicional pode apresentar-se de diversas formas, sendo a mais usual: if a then b else c A complexidade desta estrutura é definida pela complexidade da avaliação da condição a mais a complexidade de b ou a complexidade de c, conforme o critério de complexidade a ser utilizado. Como esta se tratando de complexidade no pior caso, a complexidade é definida como a complexidade de a mais a complexidade máxima entre b e c. Ou seja; c(if a then b else c) = c(a) + max(c(b),c(c)) Ocorre, porém, que max não tem uma interpretação padrão nesse caso, que c(b) e c(c) não são simples naturais, mas sim funções de ΙΝ em ΙΝ. Freqüentemente, a partir de certo ponto, f(n) fica sempre maior do que g(n), ou vice-versa. Então, parece razoável tomar f ou g como max(f,g), conforme o caso. Entretanto, pode acontecer, como no caso abaixo, que não exista essa dominância. Para exemplificar este situação, pode-se imaginar um algoritmo que manipula grafos e efetua duas operações, uma cuja complexidade depende exclusivamente do número de arestas e outra cuja complexidade varia exclusivamente com o número de nodos. A função da entrada do algoritmo tem duas componentes: número de arestas e número de nodos, combinados de alguma forma (somados, por exemplo). O algoritmo constitui-se de um condicional cujo ramo then efetua uma das operações, por exemplo aquela dependente do número de arestas, e o ramo else efetua a outra operação. Aumentando o número de arestas, aumenta somente a complexidade do ramo then e aumentando o número de nodos, somente aumenta a complexidade do ramo else. Desta forma, aumentando convenientemente a entrada, a complexidade de cada ramo pode superar a do outro. Nesse ponto, o máximo ponto a ponto pode ser usado, i.e., a função: max(f,g)(n) := max(f(n),g(n)). Uma solução simplista, mas muitas vezes usada, é utilizar como máximo a soma ponto a ponto das duas funções: max (f,g) = f + g, com ( f+g )(n) := f(n) + g(n). Na verdade, há várias possíveis escolhas para máximo assintótico de funções de naturais. Para definir o máximo entre funções, é preciso ter uma relação de ordem entre elas. Em [6] há uma discussão bastante completa sobre o assunto. A estrutura condicional também pode apresentar-se num modo mais simples sem a presença do else: if a then b neste caso, a complexidade desta estrutura é simplificada: c(if a then b) = c(a) + c(b) 4.4 Iteração Não Condicional O caso mais simples de iteração não condicional (ou definida) é: for k = i to j do a A execução da iteração causa a execução de a (j-i+1) vezes, com o valor de k variando de i até j. Considerando-se que as valores de i e j não são alterados na execução de a, o número de iterações é determinado e é (j-i+1). Pode ocorrer, entretanto, a situação onde a complexidade de execução de a varia a cada iteração, por exemplo, alterando o tamanho da entrada, então tem que ser considerada a complexidade de cada iteração executada. Por estas razões, a complexidade desta estrutura tem dois casos a serem considerados: Se a complexidade de execução de a não varia durante a iteração: c(for k = i to j do a) = (j-i+1).c(a) Se a complexidade da execução de a varia durante a iteração, tem-se que: 5
6 j i c(for k = i to j do a)(n) = k c( a)( t ( n)) k = 0 onde t k (n) = t(t k-1 (n)) se k 1 e t 0 (n) = n e t k+1 (n) = t k (t(n)), (n) conforme definido em Iteração Condicional (ou Indefinida) As estruturas de iteração condicional (ou indefinida), podem assumir várias formas. A forma vista a seguir será o while, mas o tratamento para as demais estruturas é similar. while a do b Neste tipo de iteração b será executado sucessivamente enquanto a condição a for satisfeita, possivelmente com alteração no volume dos dados. k 1 k c(while a do b)(n) = c( a )( t ( n)) + i= 0 i ( c( a) c( b))( t ( n)) 5 O Analisador de Complexidade ANAC A construção de algoritmos que, não apenas solucione determinado problema, mas o faça em tempo viável, constituíram-se em motivação para a construção de um sistema que realiza a análise algorítmica de forma semi-automática, o Analisador de Complexidade - ANAC. [2] O sistema ANAC é uma ferramenta de apoio ao ensino de complexidade de algoritmos, constituindo-se num ambiente de aplicação prática ao embasamento teórico adquirido no ensino de complexidade algorítmica, que tem como principal objetivo estimular o cálculo da complexidade de algoritmos. O protótipo de sistema ANAC baseia-se na metodologia de cálculo de complexidade para estruturas algorítmicas proposta em [1]. O sistema analisa algoritmos não recursivos escritos em uma linguagem Pascal-like pré-estabelecida para o sistema. Essa linguagem engloba as principais estruturas presentes em linguagens imperativas: atribuição, seqüência, condicional, iteração e iteração condicional, calculando de forma semi-automática a equação de complexidade e resolvendo-a sempre que forem fornecidos os dados necessários para este processo. O ANAC consiste de um processo de análise-síntese que recebe como entrada uma especificação algorítmica escrita numa linguagem Pascal-like pré-estabelecida e à medida que a análise sintática vai sendo efetuada a equação de complexidade vai sendo construída. O processo de análise sintática ocorre de maneira top-down e ao ser identificada uma estrutura a sua equação de complexidade correspondente é construída como a expressão de uma árvore e são geradas variáveis de complexidade para representar a complexidade das partes ainda não identificadas. Quando o sistema encontra uma estrutura que não apresenta mais ramificações, ou seja, é uma estrutura que representa um nodo folha, é feito o cálculo da complexidade da estrutura corresponde e o seu valor é atribuído à variável correspondente a aquela estrutura. Nesse ponto o processo sobe na árvore resolvendo as complexidades estabelecidas naquele ramo, que eram dependentes do valor calculado na folha. Quando todos os ramos são completados é atingido a raiz e o cálculo de complexidade do algoritmo é finalizado. Essa complexidade pode, entretanto, não ser uma expressão simples, o sistema irá simplificar a expressão sempre que possível. Tal processo é melhor detalhado na seção 6. 6 O Processo de Resolução das Equações de Complexidade no sistema ANAC O sistema ANAC implementa a metodologia apresentada na seção 4, através de uma análise simbólica top-down. Quando uma estrutura algorítmica é identificada a equação de complexidade referente a ela é definida. As complexidades das partes são identificadas por variáveis que são detalhadas (calculadas por outras equações de complexidade) à medida que a estrutura algorítmica correspondente é identificada. À medida que o algoritmo vai sendo analisado e suas estruturas são identificadas é construída uma árvore-sintática correspondente. Nesta árvore a raiz é a complexidade do algoritmo, que é constituído de partes que podem ser: atribuições, estruturas condicionais, iterações definidas ou indefinidas, ou seqüências. Uma estrutura por sua vez é também composta por partes cada uma gerando um ou mais filhos. 6
7 A seguir será detalhado este processo. A operação fundamental é a atribuição associada ao valor 1. A complexidade dos testes é requerida ao usuário e aos delimitadores de escopo é atribuído o valor zero. Notação: S i é uma estrutura do algoritmo. x i = complexidade de uma estrutura algorítmica S i ; t(n) = tamanho da entrada A seqüência é considerada a estrutura básica. O algoritmo é considerado sempre, em princípio, como uma seqüência. É identificada a primeira estrutura e a continuação é atribuída a uma variável. Seqüência: c(a;b)(n) = c(a) (n) + c(b) (t(n)) S 1 ; S 2 ; Estrutura Análise do programa Árvore da Seqüência x1 = x2 + x3 x1 = x2 + x3 x 1 x 2 x 3 Tabela 1 Seqüência O cálculo da complexidade de uma seqüência, constitui-se na soma das complexidades das partes. A Tabela 1, ilustra uma representação da complexidade da seqüência, onde x1 representa a soma das partes S 1, S 2, cujas complexidades estarão definidas em x 2 e x 3. Condicional: if <condição> then S 1 else S 2 Considerando x1 = c(if <condição> then S 1 else S 2 ) ou seja, x1 é igual a complexidade da estrutura: ( if <condição> then S 1 else S 2 ). Para se obter a complexidade desta estrutura as complexidades da condição e das estruturas S 1 e S 2 devem ser avaliadas. Serão utilizadas as variáveis x2 e x3 para representar as complexidades de S2 e S3, respectivamente. Para exemplificar esse processo a Tabela 2 mostra a estrutura condicional, a análise da complexidade desse programa no pior caso, pelo sistema ANAC e a ilustração da árvore criada para a estrutura condicional. O sistema ANAC, no cálculo da complexidade da estrutura condicional usa a seguinte equação: c(if <condição> then S 1 else S 2 ) = c(condição) + c(s 1 ) + c(s 2 ) Programa Análise do programa Árvore da Estrutura Condicional if a <= b then x1 = C ( a<=b ) + x2 + x3 x1 = C(a<=b) + x2 + x3 S 1 ; x2 = C ( S 1 ) + x4 x 1 else x4 = C ( S 2 ) + x5 S 2 ; x5 = C (endif) = 0 endif; c(a<=b) x 2 Tabela 2 Estrutura Condicional O sistema irá construir a árvore com a raiz x1 e os filhos c(a<=b), x2 e x3. Para a construção da equação o sistema irá percorrer o ramo correspondente a x2 até que encontre um nodo folha, ou seja, que não possua mais filhos e que o seu valor correspondente possa ser definido. Ao ocorrer essa situação o sistema retorna na árvore atribuindo o valor calculado à variável de complexidade correspondente a esta estrutura, no nodo pai. No nodo pai duas situações podem ocorrer: 1) não haver mais filhos naquele nodo pai, neste caso já existe informação suficiente para o valor da complexidade ser definido. 2) o pai pode ter mais filhos, neste caso o sistema irá percorrer o caminho definido pelos filhos até que encontre um nodo folha e possa retornar na árvore e ter, desta x 3 7
8 forma, subsídios para a avaliação da equação de complexidade correspondente. Isto é, a árvore é percorrida em profundidade, da esquerda para a direita. Atribuição: a := b ; A avaliação desta estrutura pode ser bastante simples, como o caso de uma atribuição de um valor a uma variável, ou pode ser necessário a avaliação de uma expressão ou função. Programa Análise do programa Árvore da Estrutura Atribuição a := b; x1 = c (:= ) + x2 x1 = c (:= ) + x2 x2 = c (b) + x3 x1 c(:=) x2 Tabela 3 Estrutura Atribuição A complexidade do algoritmo da Tabela 3 será a complexidade da estrutura de atribuição c( := ) mais a complexidade da avaliação de b e x3 a complexidade da próxima estrutura ainda não entificada e que será representada por x2. Iteração: for k = i to j do a ; Programa Análise do programa Árvore da Iteração for i := 1 to n do x1 = c (for i:= 1 to n do x2) + x3 x1 = [SUM( i=1, n) x2] + x3 S 1 ; x1 = [SUM( i=1, n) x2] + x3 x 1 endfor; x2 = c (S 1 ) + x4 = 1 + x4 S2; x4 = c (endfor) Tabela 4 Estrutura de Iteração No exemplo da Tabela 4, a primeira estrutura encontrada foi a iteração, logo, a complexidade deste algoritmo é o somatório das complexidades das estrutura S1 que serão executadas por esta iteração, que foram identificadas por x2, mais a complexidade de uma próxima estrutura (S2), identificada por x3. Para se obter x1, o sistema irá percorrer a árvore até conseguir obter a definição de x2 e seus filhos e irá retornar para obter x3, desta forma o sistema consegue obter x1. Iteração Condicional: while a do b ; Programa Análise do programa Árvore da Iteração Condicional while a < b do x1 = C( while a < b do x2 ) + x3 x1 = c(a<b)+n.[c(a<b)+x2] + x3 S 1 ; x1 = C ( a<b ) + f(n).[c ( a<b ) + x2 ] + x3 endwhile; x2 = C (S 1 ) + x4 = 1 + x4 x 1 S 2 ; x4 = C (endwhile) c(a<b) x 2 x 3 Tabela 5 Estrutura de Iteração Condicional x 2 x 3 No exemplo da Tabela 5, a complexidade do algoritmo é definida por c(a < b), mais a complexidade da estrutura S1, que será executada neste comando identificada por x2, mais a estrutura S2 seguinte do algoritmo, identificada por x3. O procedimento de cálculo é o mesmo aplicado à iteração não condicional. No cálculo desta estrutura, o usuário deverá fornecer o valor de f(n), avaliação do número de vezes que a iteração será executada. Exemplo de Aplicação: A Tabela 7 ilustra o exemplo de um algoritmo onde a primeira estrutura encontrada pelo sistema ANAC é a estrutura condicional, logo, a complexidade deste algoritmo será obtida pela soma da complexidade da avaliação da condição, mais a estrutura x2, que são as estruturas existentes no seu 8
9 bloco de comando, mais a próxima estrutura, x3. Com o prosseguimento do sistema é calculada a variável x2 como a complexidade da parte then mais a complexidade da parte else. Falta ainda definir a variável x3 para que a complexidade do algoritmo possa ser definida. a seguir é identificada uma de estrutura de iteração for e uma estrutura de continuação cuja complexidade é representada pela variável x7, sendo mais tarde identificada como a estrutura end. Uma vez definido seu valor de complexidade o sistema pode retornar na árvore e realizar a soma destas estruturas para obter o valor de x1 que irá representar a a complexidade do algoritmo. Pode-se observar na árvore gerada para o cálculo desta estrutura que, durante o processo de cálculo do programa são criadas as variáveis x,x e x que atuam de maneira implícita na resolução da equação, não aparecendo durante a análise do programa que é visualizada pelo usuário do sistema. Programa Análise do programa Árvore da Seqüência If a < b then x1 = c(a<b) + x2 + x3 = x1 = 1 + x2 + x3 vet[i] := a; x2 = c(vet[i] := a ) + x4 = 1 + x4 else x4 = c(vet[i] := b ) + x5 = 1 + x5 x1 = c(a<b) + x2 + x3 x 1 vet[i] := b; x5 = c (endif) = 0 c(a<b) endif; x4 = = 1 x 2 x 3 for i:=1 to n do x2 = = 2 x vet[i] := 0; x3 = c (for i:= 1 to n do x6 ) + x7 x3 = [ SUM( i=1, n) x6 ] + x7 endfor; x6 = c(vet[i] := 0 ) + x8 = 1 + x8 a x 4 x 6 x 7 end. x8 = c (endfor) = 0 := x6 = = 1 x7 = c (end) = 0 x3 = [ SUM( i=1, n) 1 ] + 0 = x 0 x 5 end x := x 8 0 end end x3 = n + 0 = n := x1 = n = n O (n) Tabela 7 Exemplo de aplicação 7 Conclusão Neste artigo foi apresentado um método de cálculo da complexidade de algoritmos, e como ele foi utilizado na construção do protótipo de sistema ANAC. Os exemplos demonstrando a análise realizada pelo programa, mostrando claramente que o método pode ser aplicado à maioria das linguagens imperativas, que possuam estruturas do tipo: atribuição, condicional, iteração e iteração condicional. O objetivo do método e do sistema é tornar a análise de algoritmos uma prática freqüente no projeto e desenvolvimento de algoritmos eficientes. A utilização do sistema ou método irá criar no projetista (usuário do ANAC) uma cultura de desenvolvimento em que esta prática acabe se tornando uma tarefa bem menos árdua do que pode-se ver atualmente em equipes ou profissionais que desenvolvem algoritmos e buscam eficiência e, no entanto, fogem à prática da análise da complexidade de algoritmos. O sistema ANAC apresenta algumas vantagens em relação aos sistemas citados na seção 3. O fato da linguagem de especificação do algoritmo ser Pascal-like torna o ANAC um sistema mais utilizável, por ser o Pascal uma linguagem amplamente difundida no meio acadêmico, ao contrário de um sistema como METRIC que trabalha com a linguagem Lisp, cuja utilização é mais restrita. O ANAC possui um ambiente de trabalho mais simples de operar. Em sistemas como o Lambda- Upsilon-Omega o usuário necessita ter conhecimento do sistema operacional Unix, conhecer a linguagem de programação Lisp e ainda ter conhecimento do software matemático Maple. O 9
10 ANAC é um sistema interativo que vai guiando o usuário durante o processo de análise, isto faz com que o usuário vá adquirindo perícia no processo de análise e venha a tornar o processo de análise um hábito durante o processo de desenvolvimento de um algoritmo. Gera, sempre que possível, um resultado simplificado o que não é visto nos demais sistemas que podem gerar extensas e complicadas equações, que podem ser desestimulantes para quem não esteja habituado com o processo de cálculo de complexidade ou para quem está se iniciando no estudo da Complexidade de Algoritmos. 8 Referências [1] Toscani, L. V. & Veloso, Paulo A. S. Uma metodologia para cálculo da complexidade de algoritmos. Simpósio Brasileiro de Engenharia de Software, 4. Águas de São Pedro/SP, out Anais, SBC [2] Barbosa, Marco A. C.; Toscani, Laira; Ribeiro, Leila. Ferramenta para a Automatização da Análise da Complexidade de Algoritmos. In: SBIE2000 XI Simpósio Brasileiro de Informática na Educação/SBC. Anais..., Maceió, [3] Aho, A.; Hopcroft, J.; Ullman, J. Data Structures and Algorithms. Addison-Wesley [4] Knuth, D. E. Algorithms and Program: Information and Data. Communication of ACM, New York, 26(1):56, janeiro pp56. [5] Veloso, P. A. S. & Veloso, S. R. M. Problem Decomposition and Reduction: Applicability, Soundness, Completeness. In: Progress in Cybernetics and Systems Research. Washington, Hemisphere, v.8. [6] Toscani, L. V. & Veloso, Paulo A. S. Complexidade de Algoritmos. Sagra-Luzzatto. Porto Alegre, [7] Wegbreit, B. Mechanical program analysis. Communications of the ACM, 18(9): , [8] Metayer, D. Le. Ace: An automatic complexity evaluator. ACM Transactions on Programming Languages and Systems, 10(2): ,1988. [9] Flajolet, Philippe; Salvy, Bruno & Zimmermann, Paul. ΛϒΩ: An Assistante Algorithms Analyser. In Proceedings AAECC'6, Lecture Notes in Computer Science 357, pg , Also available as INRIA Reserch Report 876, [10] Knuth, D. E. The Art of Computer Programming. Addison-Wesley, Menlo Park, California,
Teoria da Computação: Aplicações e Problemas de Investigação. Marco Antonio de Castro Barbosa
Teoria da Computação: Aplicações e Problemas de Investigação Marco Antonio de Castro Barbosa marco.cb@gmail.com mbarbosa@utfpr.edu.br Objetivos: Apresentar pesquisas realizadas; Identificar questões de
ANAC UMA FERRAMENTA PARA APOIO AO ENSINO DE COMPLEXIDADE DE ALGORITMOS. Marco Antonio de Castro Barbosa, Laira Vieira Toscani, Leila Ribeiro
ANAC UMA FERRAMENTA PARA APOIO AO ENSINO DE COMPLEXIDADE DE ALGORITMOS Marco Antonio de Castro Barbosa, Laira Vieira Toscani, Leila Ribeiro {mantonio,laira,leila}@inf.ufrgs.br Universidade Federal do Rio
UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA PROGRAMA DE PÓS-GRADUAÇÃO EM COMPUTAÇÃO
UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA PROGRAMA DE PÓS-GRADUAÇÃO EM COMPUTAÇÃO ANAC Uma Ferramenta para a Automatização da Análise da Complexidade de Algoritmos por MARCO ANTONIO
SISTEMA PARA ANÁLISE AUTOMÁTICA DA COMPLEXIDADE DE ALGORITMOS NÃO RECURSIVOS NO PIOR CASO
SISTEMA PARA ANÁLISE AUTOMÁTICA DA COMPLEXIDADE DE ALGORITMOS NÃO RECURSIVOS NO PIOR CASO Marco Antonio de Castro Barbosa UNICRUZ - Universidade de Cruz Alta, Dept. Informática, Cruz Alta, Brasil, 98050-010
Preliminares. Profa. Sheila Morais de Almeida. agosto
Preliminares Profa. Sheila Morais de Almeida DAINF-UTFPR-PG agosto - 2016 Algoritmos Definição - Skiena Algoritmo é a ideia por trás dos programas de computador. É aquilo que permanece igual se o programa
É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser
É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser executado 1 Fazendo estimativas e simplificações... O número
Aula 1. Teoria da Computação III
Aula 1 Teoria da Computação III Complexidade de Algoritmos Um problema pode ser resolvido através de diversos algoritmos; O fato de um algoritmo resolver um dado problema não significa que seja aceitável
PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos
UNIVERSIDADE FEDERAL DE UBERLÂNDIA FACULDADE DE COMPUTAÇÃO BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos ( X ) SEMESTRAL - ( ) ANUAL CÓDIGO: GBC052 PERÍODO:
2. Complexidade de Algoritmos
Introdução à Computação II 5952011 2. Complexidade de Algoritmos Prof. Renato Tinós Depto. de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 2.1. Introdução 2.1.1. Revisão de Pseudo-Código 2.1.2.
TEORIA: 60 LABORATÓRIO: 0
Universidade Federal do ABC Rua Santa Adélia, 166 - Bairro Bangu - Santo André - SP - Brasil CEP 09.210-170 - Telefone/Fax: +55 11 4996-3166 1. CÓDIGO E NOME DA DISCIPLINA: BC1435 - Análise de Algoritmos
COMPLEXIDADE DE ALGORITMOS
COMPLEXIDADE DE ALGORITMOS Algoritmos Seqüência de instruções necessárias para a resolução de um problema bem formulado Permite implementação computacional COMPLEXIDADE DE ALGORITMOS Um algoritmo resolve
CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches
CT-234 Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural Carlos Alberto Alonso Sanches Bibliografia T.H. Cormen, C.E. Leiserson and R.L. Rivest Introduction to algorithms R. Sedgewick
Algoritmos e Estrutura de Dados. Aula 01 Apresentação da Disciplina e Introdução aos Algoritmos Prof. Tiago A. E. Ferreira
Algoritmos e Estrutura de Dados Aula 01 Apresentação da Disciplina e Introdução aos Algoritmos Prof. Tiago A. E. Ferreira Ementa e Objetivos Ementa: Análise de Algoritmos: Notação O e Análise Assintótica.
Teoria da computabilidade Indecidíveis Decidíveis
Bacharelado em Ciência da Computação Disciplina: Algoritmos e Estruturas de Dados I Professor: Mário Luiz Rodrigues Oliveira Teoria da computabilidade Indecidíveis Decidíveis Teoria da complexidade Intratáveis:
ESTRUTURA DE DADOS CIÊNCIA E TECNOLOGIA DO RIO. Curso de Tecnologia em Sistemas para Internet
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE ESTRUTURA DE DADOS Docente: Éberton da Silva Marinho e-mail: ebertonsm@gmail.com eberton.marinho@ifrn.edu.br Curso de Tecnologia
PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos
UNIVERSIDADE FEDERAL DE UBERLÂNDIA FACULDADE DE COMPUTAÇÃO BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos ( X ) SEMESTRAL - ( ) ANUAL CÓDIGO: GBC052 PERÍODO:
Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Operadores relacionais e lógicos estruturas condicionais If...
Universidade Federal de Uberlândia Faculdade de Computação Linguagem C: Operadores relacionais e lógicos estruturas condicionais If... Else Switch Prof. Renato Pimentel 1 Operações relacionais Operações
3. ANÁLISE DE COMPLEXIDADE PESSIMISTA
3. ANÁLISE DE COMPLEXIDADE PESSIMISTA Este capítulo introduz uma metodologia para analisar a complexidade pessimista (i. e. no pior caso) de um algoritmo com base em sua estrutura. O processo de construção
Complexidade Assintótica de Programas Letícia Rodrigues Bueno
Complexidade Assintótica de Programas Letícia Rodrigues Bueno Análise de Algoritmos 1. Introdução; Análise de Algoritmos 1. Introdução; 2. Conceitos básicos; Análise de Algoritmos 1. Introdução; 2. Conceitos
Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR
Medida do Tempo de Execução de um Programa David Menotti Algoritmos e Estruturas de Dados II DInf UFPR Classes de Comportamento Assintótico Se f é uma função de complexidade para um algoritmo F, então
Complexidade de Algoritmos
Complexidade de Algoritmos! Uma característica importante de qualquer algoritmo é seu tempo de execução! é possível determiná-lo através de métodos empíricos, considerando-se entradas diversas! é também
Prova Didática Grafos: Árvores Geradoras e Caminhos Mínimos, Análise de Complexidade
Prova Didática Grafos: Árvores Geradoras e Caminhos Mínimos, Análise de Complexidade Gustavo E.A.P.A. Batista 25 de janeiro de 2005 1 Contextualização 2 Caminhos Mínimos Caminhos Mínimos de uma Origem
Introdução à Ciência da Computação II
Introdução à Ciência da Computação II 2semestre/200 Prof Alneu de Andrade Lopes Apresentação com material gentilmente cedido pelas profas Renata Pontin Mattos Fortes http://wwwicmcuspbr/~renata e Graça
SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.
SEMÂNTICA program simples = var x : int := 3 in x := x + 5 end. rode =? Rogério Rocha Roteiro Introdução Sintaxe Semântica Dinâmica (Métodos formais) Operacional Axiomática Denotacional Estática Conclusão
USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio
USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS Bruno Maffeo Departamento de Informática PUC-Rio MÉTODO INDUTIVO O método indutivo para resolver problemas aqui empregado inspira-se na formulação mais
COMPLEXIDADE DE ALGORITMOS COMPLEXIDADE DE ALGORITMOS
COMPLEXIDADE DE ALGORITMOS Algoritmos Seqüência de instruções necessárias para a resolução de um prolema em formulado Permite implementação computacional COMPLEXIDADE DE ALGORITMOS Um algoritmo resolve
Complexidade de Tempo e Espaço
Complexidade de Tempo e Espaço Profa. Sheila Morais de Almeida DAINF-UTFPR-PG junho - 2018 Sheila Almeida (DAINF-UTFPR-PG) Complexidade de Tempo e Espaço junho - 2018 1 / 43 Este material é preparado usando
Nem todos os problemas algorítmicos que podem ser resolvidos em princípio podem ser resolvidos na prática: os recursos computacionais requeridos
Nem todos os problemas algorítmicos que podem ser resolvidos em princípio podem ser resolvidos na prática: os recursos computacionais requeridos (tempo ou espaço) podem ser proibitivos. 1 Suponha que duas
PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação
UNIVERSIDADE FEDERAL DE UBERLÂNDIA FACULDADE DE COMPUTAÇÃO BACHARELADO EM GESTÃO DA INFORMAÇÃO PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação ( X ) SEMESTRAL - ( ) ANUAL CÓDIGO: GGI026 PERÍODO:
FACULDADE LEÃO SAMPAIO
FACULDADE LEÃO SAMPAIO Paradigmas de Programação Curso de Análise e Desenvolvimento de Sistemas Turma: 309-5 Semestre - 2014.2 Paradigmas de Programação Prof. MSc. Isaac Bezerra de Oliveira. 1 PARADIGMAS
Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição
Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição 1 Comando while Deseja-se calcular o valor de: 1 + 2 + 3 +... + N. Observação: não sabemos, a priori, quantos termos
Compiladores e Computabilidade
Compiladores e Computabilidade Prof. Leandro C. Fernandes UNIP Universidade Paulista, 2013 GERAÇÃO DE CÓDIGO INTERMEDIÁRIO Geração de Código Intermediário Corresponde a 1ª etapa do processo de Síntese
Programação Procedimental
Programação Procedimental Maria Adriana Vidigal de Lima Universidade Federal de Uberlândia - 2013 1 Escrita de Algoritmos 1.1 Técnicas de Programação e Algoritmos Na elaboração de programas maiores e complexos
ao paradigma imperativo
PARADIGMA FUNCIONAL PARADIGMA FUNCIONAL: INTRODUÇÃO G Exemplos de linguagens funcionais LISP - Início: LP puramente funcional - Depois: acréscimo de alguns recursos imperativos (aumentaram eficiência de
Linguagem de Programação I Prof. Tiago Eugenio de Melo.
Linguagem de Programação I Prof. Tiago Eugenio de Melo tmelo@uea.edu.br www.tiagodemelo.info 1 Sumário Introdução Conceitos preliminares Introdução Variáveis Comandos Condicionais 2 Por que aprender a
Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013
Lista 1 - PMR2300 Fabio G. Cozman 3 de abril de 2013 1. Qual String é impressa pelo programa: p u b l i c c l a s s What { p u b l i c s t a t i c void f ( i n t x ) { x = 2 ; p u b l i c s t a t i c void
7. Introdução à Complexidade de Algoritmos
7. Introdução à Complexidade de Algoritmos Fernando Silva DCC-FCUP Estruturas de Dados Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 1 / 1 Análise de Algoritmos
CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.
CES-11 Noções de complexidade de algoritmos Complexidade de algoritmos Avaliação do tempo de execução Razão de crescimento desse tempo Notação O Exercícios COMPLEXIDADE DE ALGORITMOS Importância de análise
Capítulo 8. Estruturas de Controle no Nível de Sentença
Capítulo 8 Estruturas de Controle no Nível de Sentença Níveis de fluxo de controle Computações são realizadas por meio da avaliação de expressões e da atribuição dos valores a variáveis Para tornar a computação
Análise de complexidade
Introdução Algoritmo: sequência de instruções necessárias para a resolução de um problema bem formulado (passíveis de implementação em computador) Estratégia: especificar (definir propriedades) arquitectura
Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )
Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista (2.1-2.2) DECOM/UFOP 2013/1 5º. Período Anderson Almeida Ferreira Adaptado do material desenvolvido por Andréa Iabrudi
Construção de Algoritmos II Aula 06
exatasfepi.com.br Construção de Algoritmos II Aula 06 André Luís Duarte Porque mil anos são aos teus olhos como o dia de ontem que passou, e como a vigília da noite. Salmos 90:4 Recursividade e complexidade
Projeto e Análise de Algoritmos
Projeto e Análise de Algoritmos A. G. Silva Baseado nos materiais de Souza, Silva, Lee, Rezende, Miyazawa Unicamp Ribeiro FCUP 18 de agosto de 2017 Conteúdo programático Introdução (4 horas/aula) Notação
Expressões e sentença de atribuição
Expressões e sentença de atribuição Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá cba Este trabalho está licenciado com uma Licença Creative Commons - Atribuição-CompartilhaIgual
I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal.
Capítulo 4 TESTES, ESCOLHAS E MALHAS DE REPETIÇÃO 1. INTRODUÇÃO Em muitos exemplos e exercícios realizados nos capítulos anteriores, não foram raras as vezes em que fizemos uso de elementos disponíveis
7. Introdução à Complexidade de Algoritmos
7. Introdução à Complexidade de Algoritmos Fernando Silva DCC-FCUP Estruturas de Dados Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 1 / 1 Análise de Algoritmos
Capítulo 6 Análise de Algoritmos Capítulo 6
666 Apêndice C Respostas e Sugestões para os Exercícios de Revisão 42. Consulte a Seção 5.4. 43. (a) Escoamento de memória.(b) Porque não há garantia que o cliente irá usá-la devidamente. 44. (a) Contagem
Introdução. Compiladores Análise Semântica. Introdução. Introdução. Introdução. Introdução 11/3/2008
Compiladores Análise Semântica Fabiano Baldo Análise Semântica é por vezes referenciada como análise sensível ao contexto porque lida com algumas semânticas simples tais como o uso de uma variável somente
IGED: Um Ambiente para Ensino de Estruturas de Dados com Análise Automática de Complexidade de Algoritmos
IGED: Um Ambiente para Ensino de Estruturas de Dados com Análise Automática de Complexidade de Algoritmos Erick Jonh F. Costa 1, Jorge Gabriel G. de S. Ramos 1, Yuri de A. Malheiros Barbosa 1, Gilberto
Análise e Projeto de Algoritmos
Análise e Projeto de Algoritmos Prof. Eduardo Barrére www.ufjf.br/pgcc www.dcc.ufjf.br eduardo.barrere@ice.ufjf.br www.barrere.ufjf.br A Disciplina... Lecionada por dois professores: Eduardo Barrére Foco
Semântica Operacional
Semântica Conceitos Semântica é o estudo do significado. Incide sobre a relação entre significantes, tais como palavras, frases, sinais e símbolos, e o que eles representam, a sua denotação. Semântica
Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42
Análise Sintática I Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Abril, 2017 1 / 42 Sumário 1 Introdução 2 Derivações 3 Ambiguidade 4 Análise sintática descendente
Alfabeto, Cadeias, Operações e Linguagens
Linguagens de Programação e Compiladores - Aula 3 1 Alfabeto, Cadeias, Operações e Linguagens 1.Conjuntos Para representar um determinado conjunto é necessário buscar uma notação para representá-lo e ter
n Professor n Duas Avaliações prático-teóricas: n Componente Teórico: 20 pontos n Componente Prático: 15 pontos
Projeto e Análise de Algoritmos Problemas e Algoritmos Altigran Soares da Silva Universidade Federal do Amazonas Instituto de Computação Sobre o Curso Professor Altigran Soares da Silva Professor Associado
Cálculo Numérico BCC760
Cálculo Numérico BCC760 Resolução de Sistemas de Equações Lineares Simultâneas Departamento de Computação Página da disciplina http://www.decom.ufop.br/bcc760/ 1 Introdução! Definição Uma equação é dita
PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação
UNIVERSIDADE FEDERAL DE UBERLÂNDIA FACULDADE DE COMPUTAÇÃO BACHARELADO EM GESTÃO DA INFORMAÇÃO PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação ( X ) SEMESTRAL - ( ) ANUAL CÓDIGO: GGI026 PERÍODO:
ESTRUTURAS DE DADOS prof. Alexandre César Muniz de Oliveira
ESTRUTURAS DE DADOS prof. Alexandre César Muniz de Oliveira 1. Introdução 2. Pilhas 3. Filas 4. Listas 5. Árvores 6. Grafos 7. Complexidade 8. Ordenação 9. Busca Sugestão bibliográfica: ESTRUTURAS DE DADOS
Estruturas de Dados Algoritmos
Estruturas de Dados Algoritmos Prof. Eduardo Alchieri Algoritmos (definição) Sequência finita de instruções para executar uma tarefa Bem definidas e não ambíguas Executáveis com uma quantidade de esforço
Complexidade de Algoritmos
Complexidade de Algoritmos O que é um algoritmo? Sequência bem definida e finita de cálculos que, para um dado valor de entrada, retorna uma saída desejada/esperada. Na computação: Uma descrição de como
Árvore Binária de Busca Ótima
MAC 5710 - Estruturas de Dados - 2008 Referência bibliográfica Os slides sobre este assunto são parcialmente baseados nas seções sobre árvore binária de busca ótima do capítulo 4 do livro N. Wirth. Algorithms
Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio
Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio David Déharbe Programa de Pós-graduação em Sistemas e Computação Universidade Federal do Rio Grande do Norte Centro de Ciências Exatas
Capítulo 7. Expressões e Sentenças de Atribuição
Capítulo 7 Expressões e Sentenças de Atribuição Introdução Expressões são os meios fundamentais de especificar computações em uma linguagem de programação Para entender a avaliação de expressões, é necessário
Programa Analítico de Disciplina SIN213 Projeto de Algoritmos
Programa Analítico de Disciplina Campus Rio Paranaíba - Campus Rio Paranaíba Número de créditos: 6 Teóricas Práticas Total Duração em semanas: 15 Carga horária semanal 4 2 6 Períodos - oferecimento: II
REUSO E REUSABILIDADE
REUSO E REUSABILIDADE Manutenção de Software Profa. Cynthia Pinheiro Antes de mais nada... 2ª Lista de Exercícios Já está disponível no site a 2ª Lista de Exercícios Entrega: dia 03/10, no horário da aula.
Análise e Projeto de Algoritmos
Análise e Projeto de Algoritmos Mestrado em Ciência da Computação Prof. Dr. Aparecido Nilceu Marana Faculdade de Ciências I think the design of efficient algorithms is somehow the core of computer science.
Linguagens de Programação. Marco A L Barbosa
Expressões e sentença de atribuição Linguagens de Programação Marco A L Barbosa cba Este trabalho está licenciado com uma Licença Creative Commons - Atribuição-CompartilhaIgual 4.0 Internacional. http://github.com/malbarbo/na-lp-copl
UNIVERSIDADE DO ESTADO DE SANTA CATARINA - UDESC DCC Departamento de Ciência da Computação Joinville-SC
CURSO: Bacharelado em Ciência da Computação DISCIPLINA: LPG-II - Linguagem de Programação II AULA NÚMERO: 02 DATA: PROFESSOR: Murakami Sumário 1 APRESENTAÇÃO...1 2 DESENVOLVIMENTO...1 2.1 Estrutura condicional
15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias -
Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções 1 Um algoritmo pode ser visto como uma sequência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema.
Máquinas Universais. Máquina de Turing. Celso Olivete Júnior.
Máquinas Universais Máquina de Celso Olivete Júnior olivete@fct.unesp.br http://www2.fct.unesp.br/docentes/dmec/olivete/ Roteiro Hipótese de Church - Máquinas Universais: Máquina de Máquina de : Noção
Comportamento assintótico
ANÁLISE DE ALGORITMOS: PARTE 2 Prof. André Backes 2 Na última aula, vimos que o custo para o algoritmo abaixo é dado pela função f(n) = 4n + 3 1 3 Essa é a função de complexidade de tempo Nos dá uma ideia
MATRIZES - PARTE Definição e Manipulação de Matrizes AULA 21
AULA 21 MATRIZES - PARTE 1 21.1 Definição e Manipulação de Matrizes Sabemos como definir variáveis de um novo tipo de dados, denominado vetor, que representam seqüências de valores de um mesmo tipo. Por
SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca
ÁRVORES SUMÁRIO Fundamentos Árvores Binárias Árvores Binárias de Busca 2 ÁRVORES Utilizadas em muitas aplicações Modelam uma hierarquia entre elementos árvore genealógica Diagrama hierárquico de uma organização
ANÁLISE DE COMPLEXIDADE DOS ALGORITMOS
1/18 ANÁLISE DE COMPLEXIDADE DOS ALGORITMOS Algoritmos 2/18 Algoritmos Algoritmo - sequência de instruções necessárias para a resolução de um problema bem formulado (passíveis de implementação em computador)
Notas de Aula de Algoritmos e Programação de Computadores
Notas de Aula de Algoritmos e Programação de Computadores FLÁVIO KEIDI MIYAZAWA com a colaboração de TOMASZ KOWALTOWSKI Instituto de Computação - UNICAMP Versão 2000.1 Estas notas de aula não devem ser
Introdução à Programação
Introdução à Programação Linguagens de Programação: sintaxe e semântica de linguagens de programação e conceitos de linguagens interpretadas e compiladas Engenharia da Computação Professor: Críston Pereira
Complexidade de algoritmos Notação Big-O
Complexidade de algoritmos Notação Big-O Prof. Byron Leite Prof. Tiago Massoni Engenharia da Computação Poli - UPE Motivação O projeto de algoritmos é influenciado pelo estudo de seus comportamentos Problema
Técnicas de análise de algoritmos
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS Técnicas de análise de algoritmos Algoritmos e Estruturas de Dados I Natália Batista https://sites.google.com/site/nataliacefetmg/ nataliabatista@decom.cefetmg.br
Estatística e Modelos Probabilísticos - COE241
Estatística e Modelos Probabilísticos - COE241 Aula passada Função Distribuição Condicional Calculando Probabilidades condicionando Esperança Condicional Aula de hoje Análise de Comandos de Programação
Síntese de programas utilizando a linguagem Alloy
Universidade Federal de Pernambuco Centro de Informátiva Graduação em Ciência da Computação Síntese de programas utilizando a linguagem Alloy Proposta de Trabalho de Graduação Aluno: João Pedro Marcolino
Linguagens Formais e Autômatos P. Blauth Menezes
Linguagens Formais e Autômatos P. Blauth Menezes blauth@inf.ufrgs.br Departamento de Informática Teórica Instituto de Informática / UFRGS Linguagens Formais e Autômatos - P. Blauth Menezes 1 Linguagens
Cap. 2 Conceitos Básicos em Teoria dos Grafos
Teoria dos Grafos e Aplicações 8 Cap. 2 Conceitos Básicos em Teoria dos Grafos 2.1 Grafo É uma noção simples, abstrata e intuitiva, usada para representar a idéia de alguma espécie de relação entre os
SSC304 Introdução à Programação Para Engenharias
Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Sistemas de Computação Introdução à Para Engenharias Algoritmos e Lógica de GE4 Bio GE4Bio Grupo de Estudos em
Análise de algoritmos. Parte I
Análise de algoritmos Parte I 1 Recursos usados por um algoritmo Uma vez que um procedimento está pronto/disponível, é importante determinar os recursos necessários para sua execução Tempo Memória Qual
Paradigmas de Linguagens de Programação. Expressões e Instruções de Atribuição
Expressões e Instruções de Atribuição Cristiano Lehrer Introdução Expressões são o meio fundamental de especificar computações em uma linguagem de programação: Familiarização com as ordens de avaliação
4. Constantes. Constantes pré-definidas
4. Constantes Constantes pré-definidas O PHP possui algumas constantes pré-definidas, indicando a versão do PHP, o Sistema Operacional do servidor, o arquivo em execução, e diversas outras informações.
Introdução a Algoritmos Parte 08
Universidade Federal do Vale do São Francisco Curso de Engenharia de Computação Introdução a Algoritmos Parte 08 (Baseado no Material do Prof. Marcelo Linder) Prof. Jorge Cavalcanti jorge.cavalcanti@univasf.edu.br
Laços de repetição for, while, do-while
Computação Eletrônica Laços de repetição for, while, do-while Prof: Luciano Barbosa Estruturas de Repetição Imagine um programa que calcula a média de um aluno. Este programa é bastante simples, bastaria:
Comandos de repetição while
Programação de Computadores I UFOP DECOM 2014 1 Aula prática 6 Comandos de repetição while Resumo Nesta aula vamos trabalhar com problemas cuja solução envolve realizar um cálculo ou tarefa repetidas vezes,
Complexidade de Algoritmos
Complexidade de Algoritmos Prof. Diego Buchinger diego.buchinger@outlook.com diego.buchinger@udesc.br Prof. Cristiano Damiani Vasconcellos cristiano.vasconcellos@udesc.br Funções de Complexidade Considere
Gramática. Prof. Yandre Maldonado e Gomes da Costa. Prof. Yandre Maldonado - 1
Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Prof. Yandre Maldonado - 2 Mecanismo gerador que permite definir formalmente uma linguagem; Através de uma gramática
Figura 3.1: Fluxograma do algoritmo da Programação Genética.
3 Programação Genética O termo Programação Genética passou a ser utilizado em 1990 nos trabalhos publicados por Koza [30] e De Garis [31]. A definição de Koza para este termo passou a predominar após a
Gramática. Gramática. Gramática
Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Prof. Yandre Maldonado - 2 Mecanismo gerador que permite definir formalmente uma linguagem; Através de uma gramática
Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17
PCS3616 Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17 Linguagens e Compiladores Programação em linguagem de alto nível Escola Politécnica da Universidade de São Paulo Roteiro 1.
Análise de Algoritmos Estrutura de Dados II
Centro de Ciências Exatas, Naturais e de Saúde Departamento de Computação Análise de Algoritmos Estrutura de Dados II COM10078 - Estrutura de Dados II Prof. Marcelo Otone Aguiar marcelo.aguiar@ufes.br
MODULARIZAÇÃO - PARTE 1
AULA 27 MODULARIZAÇÃO - PARTE 1 Os algoritmos que temos construído até então são muito simples, pois resolvem problemas simples e apresentam apenas os componentes mais elementares dos algoritmos: constantes,
Introdução aos Algoritmos
Introdução aos Algoritmos Aula 05 Diogo Pinheiro Fernandes Pedrosa http://www2.ufersa.edu.br/portal/professor/diogopedrosa diogopedrosa@ufersa.edu.br Universidade Federal Rural do Semiárido Bacharelado
Sumário. Ciência da Computação. Prof. Dr. Leandro Alves Neves. Aula 10. Algoritmos e Programação. Enquanto (Teste no início) Repeat (Teste no final)
Algoritmos e Programação Informática II Ciência da Computação Prof. Dr. Leandro Alves Neves Aula 10 1 Sumário Estruturas de Controle de Fluxo q Repetição Enquanto (Teste no início) Repeat (Teste no final)
Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens
Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens 1 Introdução Estudar computação do ponto de vista teórico é sinônimo de caracterizar
Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos
Plano da aula Compiladores Análise sintática (1) Revisão: Gramáticas Livres de Contexto 1 Introdução: porque a análise sintática? Noções sobre Gramáticas Livres de Contexto: Definição Propriedades Derivações
Análise e Complexidade de Algoritmos
Análise e Complexidade de Algoritmos Professor Ariel da Silva Dias Introdução Apresentação Professor Professor Ariel Dias Apresentação Disciplina O que veremos? www.arieldias.com BlackBoard Apresentação