Análise de Complexidade

6
Disciplina de Teoria da Computação Trabalho sobre Complexidade de Algoritmos complexidade de seus componentes básicos atribuição, sequência, condicional, for e while Docente: Simone Costa Alunos: Thiago Davison Gonçalves, Leonardo Campos Soares, Wagner Ishizaka Penny, Wilson Cardoso

description

Teoria da Computação - Análise de complexidade

Transcript of Análise de Complexidade

  • Disciplina de Teoria da Computao

    Trabalho sobre Complexidade de Algoritmos

    complexidade de seus componentes bsicos

    atribuio, sequncia, condicional, for e while

    Docente: Simone Costa

    Alunos: Thiago Davison Gonalves, Leonardo Campos Soares, Wagner Ishizaka Penny, Wilson Cardoso

  • Complexidade das Estruturas Algortmicas

    til utilizar uma metodologia para analisar a complexidade de um algoritmo, passo a passo, a partir da complexidade de cada uma de suas componentes. Somando-se a complexidade de cada estrutura que compe um algoritmo obtm-se a complexidade do algoritmo. Sero consideradas a seguir as estruturas: Atribuio: a := b ou a b; Sequncia: a ; b ; Condicional: if a then b else c ; Iterao definida (ou incondicional): for k = i to j do a ; Iterao indefinida (ou condicional): while a do b ; A descrio das metodologias utiliza as seguintes notaes: c(a)Complexidadedeanopiorcaso

    (n)Tamanhodeentrada

    Ser considerada a complexidade pessimista ou de pior caso nas anlises a seguir realizadas. 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) polinmios, n2 e n3 respectivamente. Neste caso a complexidade de menor grau absorvida pela de maior grau. Desta forma, complexidade(a) absorvida por complexidade(b), ou seja, n2 absorvida por n3. A seguir cada uma das estruturas algortmicas citadas analisada e definida uma expresso para a complexidade.

  • Atribuio A atribuio uma estrutura sintaticamente simples e apresentada na forma: a := b ou a b A complexidade associada a esta estrutura depende do tipo dos dados envolvidos. c (a := b) = c(:=) + c (b) A atribuio pode ser uma operao simples, como a atribuio de um valor a uma varivel, ou uma atribuio mais complexa, como a insero de um nodo num grafo, a atualizao de uma matriz, dentre outros. A atribuio pode ainda requerer uma avaliao de b, que pode ser uma expresso ou uma funo. Nestes casos, existe um esforo computacional associado a operao de atribuio c(:=) propriamente dita e um esforo associado avaliao de b. Sequncia Esta estrutura tem a seguinte forma: a ; b ; A complexidade da sequncia a soma das complexidades das componentes. A execuo de a, entretanto, pode alterar o volume de dados para b, ento: c(a ; b) (n) = c(a) (n) + c(b) (t(n)) onde, t(n) o tamanho da entrada aps a execuo de a, dado que antes da execuo era n. O valor t(n) pode ser menor, maior ou igual a n. 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 avaliao da condio a mais a complexidade de b ou a complexidade de c, conforme o critrio 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 mxima entre b e c. Ou seja; c(if a then b else c) = c(a) + max(c(b),c(c)) Ocorre, porm, que max no tem uma interpretao padro nesse caso, que c(b) e c(c) no so simples naturais, mas sim funes de em . Se tomarmos a complexidade de b e c com funes f(n) e g(n), frequentemente, a partir de certo ponto, f(n) fica sempre maior do que g(n), ou vice-versa. Ento, parece razovel tomar f ou g como max(f,g), conforme o caso. Entretanto, pode acontecer, como no exemplo abaixo, que no exista essa dominncia. Para exemplificar este situao, pode-se imaginar um algoritmo que manipula grafos e efetua duas operaes, uma cuja complexidade depende exclusivamente do nmero de arestas e outra cuja complexidade varia exclusivamente com o nmero de nodos. A funo da entrada do algoritmo tem duas componentes: nmero de arestas e nmero de nodos, combinados de alguma forma (somados, por exemplo). O algoritmo constitui-se de um condicional cujo ramo then efetua uma das operaes, por exemplo aquela dependente do nmero de arestas, e o ramo else efetua a outra operao. Aumentando o nmero de arestas, aumenta somente a complexidade do ramo then e efetua uma das operaes, por exemplo aquela dependente do nmero de arestas, e o ramo else efetua a outra operao. Aumentando o nmero de arestas, aumenta somente a complexidade do ramo then e aumentando o nmero 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 mximo ponto a ponto pode ser usado, i.e., a funo: max(f,g)(n) := max(f(n),g(n)). Uma soluo simplista, mas muitas vezes usada, utilizar como mximo a soma ponto a ponto das duas funes: max (f,g) = f + g, com ( f+g )(n) := f(n) + g(n). Na verdade, h vrias possveis escolhas para mximo assinttico de funes de naturais. Para definir o mximo entre funes preciso ter uma relao de ordem entre elas. A estrutura condicional tambm pode apresentar-se num modo mais simples sem a presena do else: if a then b neste caso, a complexidade desta estrutura simplificada para: c(if a then b) = c(a) + c(b)

  • Iterao Definida ou Incondicional (For) O caso mais simples de iterao incondicional (ou definida) : for k = i to j do a A execuo da iterao causa a execuo de a (j-i+1) vezes, com o valor de k variando de i at j. Considerando-se que os valores de i e j no so alterados na execuo de a, o nmero de iteraes determinado como (j-i+1). Pode ocorrer, entretanto, a situao onde a complexidade de execuo de a varia a cada iterao, por exemplo, alterando o tamanho da entrada, ento tem que ser considerada a complexidade de cada iterao executada. Por estas razes, a complexidade desta estrutura tem dois casos a serem considerados: Se a complexidade de execuo de a no varia durante a iterao: c(for k = i to j do a) = (j-i+1).c(a) De modo geral, se a complexidade da execuo de a varia durante a iterao, a ordem da complexidade de pior caso ser determinado por uma cota assinttica superior:

    c(for k=i to j do a)(n) = O( c(a).( )))(j(n)

    k=i(n)(n)s(ki(n))

    onde s uma funo de tamanho mximo, s(n):=Max {tam(a(d)) / tam(d) n}, sendo d a entrada que pode ter tamanho at n. Iterao Condicional (ou Indefinida) (While) As estruturas de iterao condicional (ou indefinida), podem assumir vrias formas. A forma estudada ser o while, mas o tratamento para as demais estruturas similar. Estrutura while a do b Neste tipo de iterao b ser executado sucessivamente enquanto a condio a for satisfeita, possivelmente com alterao no volume dos dados. Como o nmero de iteraes no est definido eventualmente o lao pode no parar e ficar em loop, entretanto, em termos de anlise de complexidade sero estudadas apenas iteraes que terminam. A complexidade do while no pior caso tambm uma ordem assinttica superior, dada por:

  • c(while a do b)(n) = O( c(a)( + (c(a)( (n)+c(b) (n))))(n)sh(n) h(n)1

    i=0si si

    onde h(n):=Max{H(d) N / tam(d) n} sendo d a entrada e H(d) o nmero de vezes que b precisa ser executado para que o teste a d valor falso.