3. ANÁLISE DE COMPLEXIDADE PESSIMISTA

Documentos relacionados
Complexidade de Algoritmos. Edson Prestes

Complexidade de Algoritmos. Edson Prestes

Análise de Complexidade de Algoritmos. mario alexandre gazziro

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

Comportamento Assintótico. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Aula 1. Teoria da Computação III

BCC202 - Estrutura de Dados I

1 a Lista Professor: Claudio Fabiano Motta Toledo Estagiário PAE: Jesimar da Silva Arantes

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

ANÁLISE DE ALGORITMOS: PARTE 3

BCC202 - Estrutura de Dados I

Construção de Algoritmos II Aula 06

Complexidade de Algoritmos

Quantidade de memória necessária

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

André Vignatti DINF- UFPR

Pra início de conversa... O que é um algoritmo? Exemplos de algoritmos. Como podemos descrever algoritmos? Como podemos descrever algoritmos?

Análise de Algoritmos

Aula 02 Notação Assintótica p. 4. Usodanotação O. Notação O. Notação O, Ω, ΘeExemplos. Intuitivamente... O(f(n)) funções que não crescem mais

Melhores momentos AULA 1. Algoritmos p.38/86

André Vignatti DINF- UFPR

Medida do Tempo de Execução de um Programa

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

ALGORITMOS AVANÇADOS UNIDADE I Análise de Algoritmo - Notação O. Luiz Leão

Projeto e Análise de Algoritmos

Área que visa determinar a complexidade (custo) de um algoritmo, com isso é possível:

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

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

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

ANÁLISE DE COMPLEXIDADE DOS ALGORITMOS

Lista de Exercícios 6 Funções

Complexidade de Algoritmos

Análise de Algoritmos

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

BCC202 - Estrutura de Dados I

Comportamento assintótico

Lista de Exercícios 6: Soluções Funções

2. Complexidade de Algoritmos

Lista 1. 8 de abril de Algorithms: Capítulo 0, exercícios 1 e 2. Tardos: Todos exercícios do cap 2 do livro texto, exceto 7 e 8 letra b.

Introdução à Análise Algoritmos

Análise de Algoritmos Estrutura de Dados II

FACULDADE CAMPO LIMPO PAULISTA BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto a Análise de Algoritmos I Lista de Exercícios 1

Complexidade de Algoritmos

Análise de Complexidade de Algoritmos

Otimização em Grafos

Projeto e Análise de Algoritmos

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO. 4 a Lista de Exercícios Gabarito de algumas questões.

Introdução à Ciência da Computação II

7. Introdução à Complexidade de Algoritmos

Análise de algoritmos

Análise e Projeto de Algoritmos

ANÁLISE DE ALGORITMOS: PARTE 4

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

ALGORITMOS AVANÇADOS Lista de Exercícios 01. Luiz Leão

Classes, Herança e Interfaces

Complexidade de algoritmos Notação Big-O

7. Introdução à Complexidade de Algoritmos

Algoritmos e Programação I

Algoritmos e Estrutura de Dados. Aula 04 Recorrência Prof. Tiago A. E. Ferreira

Elementos de Análise Assintótica

Algoritmos - 3. Alexandre Diehl. Departamento de Física - UFPel

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

INF 1010 Estruturas de Dados Avançadas

Melhores momentos AULA PASSADA. Complexidade Computacional p. 136

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Algoritmos 3/17/ Algoritmos como área de estudo e investigação

Análise de algoritmos

Algoritmos Avançados Análise de Complexidade

COMPLEXIDADE DE ALGORITMOS

ANÁLISE DE ALGORITMOS

Análise de Algoritmos

Técnicas de análise de algoritmos

Projeto e Análise de Algoritmos

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

Algoritmos e Programação

INF 1010 Estruturas de Dados Avançadas

Análise e Projeto de Algoritmos

Definimos a soma de seqüências fazendo as operações coordenada-a-coordenada:

Transcrição:

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 de um algoritmo seria mais eficaz se a complexidade fosse um fator integrante do projeto do mesmo. Apesar de a complexidade ser uma medida muito particular à classe do algoritmo que está sendo analisado, alguns aspectos do cálculo da complexidade não dependem do que faz o algoritmo. Entre as medidas de complexidade, a complexidade no pior caso é o critério de avaliação mais utilizado. Serão estudadas, uma a uma, as principais estruturas algorítmicas a seguir: o Atribuição: v e, o Seqüência (ou composição): S ; T, o Condicional: se b então S senão T (ou se b então S), o Iteração definida (ou incondicional): para i de j até m faça S, o Iteração indefinida (ou condicional): enqto b faça S. Na seção 2 do capítulo 2 (cf. 2.2.1), introduzimos as seguintes variantes para o critério pessimista de complexidade de um algoritmo a: c P = [ a ](n) := Máx { desemp[ a ](d) IN / tam(d) = n }, c P < [ a ](n) := Máx { desemp[ a ](d) IN / tam(d) < n }; onde desemp[ a ](d) := custo(exec[ a ](d)). Neste capítulo daremos ênfase à variante c P < [a](n), onde vários resultados podem ser adaptados para a variante c P = [a](n). Entre as medidas de complexidade, a complexidade no pior caso é o critério de avaliação mais utilizado. Visão geral do capítulo 3.1 Preliminares e conceitos auxiliares. Introduz algumas idéias básicas importantes e conceitos auxiliares, como os de absorção e máximo assintótico em ordem, que serão usadas a seguir. 3.2 Equações de complexidade pessimista. Estuda a complexidade de cada uma das principais estruturas algorítmicas, estabelecendo equações, ilustradas por exemplos simples. 3.3 Exemplos de aplicação. Ilustra a metodologia da seção 3.2, aplicando-a a alguns exemplos de algoritmos. 3.1 PRELIMINARES E CONCEITOS AUXILIARES A motivação é reduzir o desempenho - e a complexidade - de um algoritmo à informações sobre suas partes. Podemos operar ponto a ponto com funções. Consideremos funções f e g de um conjunto D no conjunto IR+, onde definimos sua soma pontual por: ( f + g )(d) := f(d) + g(d), para cada d D. Definimos, ainda, seu máximo e mínimo pontuais, respectivamente, por: Máx ( f, g )(d) := Máx { f(d), g(d) } e mín ( f, g )(d) := mín { f(d), g(d) }. 3.1.1 Idéias básicas: componentes de algoritmos A complexidade de um algoritmo poderá ser obtida a partir das complexidades das suas partes. Em geral, cada componente executada dá sua contribuição para o desempenho e a complexidade do algoritmo.

Torna-se conveniente classificar as componentes de um algoritmo em conjuntivas ou disjuntivas, conforme sejam sempre executadas ou não. Por exemplo, no (trecho de) algoritmo j i + 1 ; k i - 1, essas duas atribuições são suas componentes conjuntivas. Por outro lado, essas duas atribuições são as componentes disjuntivas do (trecho de) algoritmo se i j então j i + 1 senão k i - 1. Consideremos um algoritmo a 0 com duas componentes a 1 e a 2. Para entradas de tamanho até n, a complexidade pessimista, pela sua própria definição, dá uma cota superior para o desempenho: para uma entrada d com tam(d) < n, sabemos que desemp[ a j ](d) < c P < [ a j ](n), para j = 0, 1, 2. Para o caso de componentes conjuntivas, na execução do algoritmo a 0 sobre entrada d, temos esforços computacionais associados às execuções das duas componentes a 1 e a 2. Assim, o desempenho do algoritmo a 0,com entrada d é dado por: desemp[ a 0 ](d) = desemp[ a 1 ](d) + desemp[ a 2 ](d) (3.1.1). Como as complexidades pessimistas dão cotas superiores para os desempenhos, temos: desemp[ a 0 ](d) < c P < [ a 1 ](n) + c P < [ a 2 ](n). Assim, pela definição de complexidade pessimista, obtemos a seguinte cota superior: c P < [ a 0 ](n) < c P < [ a 1 ](n) + c P < [ a 2 ](n). Por outro lado, pela equação (3.1.1) os desempenhos das partes dão cotas inferiores: desemp[ a j ](d) < desemp[ a 0 ](d), para cada j = 1, 2. De novo, como a complexidade pessimista é cota superior para o desempenho, temos: desemp[ a i ](d) < c P < [ a 0 ](n), para cada i = 1, 2. Assim, pela definição de complexidade pessimista, obtemos as seguintes cotas inferiores: c P < [ a j ](n) < c P < [ a 0 ](n), para cada j = 1, 2. Portanto, da definição de máximo pontual, vem a seguinte cota inferior para c P < [ a 0 ]: Máx ( c P < [ a 1 ], c P < [ a 2 ] )(n) < c P < [ a 0 ](n). Princípio das partes conjuntivas Para o caso de componentes conjuntivas, com o exemplo do algoritmo anterior, a complexidade pessimista do algoritmo a 0 tem cotas. Máx ( c P < [ a 1 ], c P < [ a 2 ] ) < c P < [ a 0 ] < c P < [ a 1 ] + c P < [ a 2 ]. Logo, a complexidade pessimista do algoritmo a 0 tem ordem Θ ( c P < [ a 1 ] + c P < [ a 2 ] ). Consideremos agora um algoritmo a 0 com duas componentes a 1 e a 2 disjuntivas. Neste caso, temos esforços computacionais associados às execuções ora da componente a 1, ora da componente a 2. Assim, para cada entrada d, temos: desemp[ a 0 ](d) = desemp[ a 1 ](d) ou desemp[ a 0 ](d) = desemp[ a 2 ](d) (3.1.2). Como as complexidades pessimistas dão cotas superiores para os desempenhos, temos: desemp[ a 0 ](d) < c P < [ a 1 ](n) ou desemp[ a 0 ](d) < c P < [ a 2 ](n). Assim, pela definição de máximo pontual, obtemos a seguinte cota superior: desemp[ a 0 ](d) < Máx (c P < [ a 1 ], c P < [ a 2 ] )(n). Portanto, pela definição de complexidade pessimista, obtemos a seguinte cota superior: c P < [ a 0 ](n) < Máx (c P < [ a 1 ], c P < [ a 2 ] )(n). Por outro lado, como a complexidade pessimista é cota superior para o desempenho, da expressão (3.1.2) temos: se desemp[ a 0 ](d) = desemp[ a 1 ](d), então: desemp[ a 1 ](d) < c P < [ a 0 ](n); se desemp[ a 0 ](d) = desemp[ a 2 ](d), então: desemp[ a 2 ](d) < c P < [ a 0 ](n). Assim, para qualquer entrada d com tam(d) < n, temos a seguinte cota inferior: Máx { desemp[ a 1 ](d), desemp[ a 2 ](d) } < c P < [ a 0 ](n). Logo, para o pior caso de entradas com tamanho até n, temos a cota inferior: Máx { Máx { desemp[ a 1 ](d), desemp[ a 2 ](d) } / tam(d) < n } < c P < [ a 0 ](n).

Mas, pode-se mostrar que Máx { c P < [ a 1 ](n), c P < [ a 2 ](n) } é uma cota inferior para: Máx { Máx { desemp[ a 1 ](d), desemp[ a 1 ](d) } / tam(d) < n }. Portanto, a definição de máximo pontual, vem a ser cota inferior para c P < [ a 0 ]: Máx ( c P < [ a 1 ], c P < [ a 2 ] )(n) < c P < [ a 0 ](n). Princípio das partes disjuntivas Para o caso de componentes disjuntivas, com o exemplo do algoritmo anterior, a complexidade pessimista do algoritmo a 0 tem cotas. c P < [ a 0 ] = Máx ( c P < [ a 1 ], c P < [ a 2 ] ). Logo, a complexidade pessimista do algoritmo a 0 tem ordem Ω ( c P < [ a 0 ] ). 3.2.2 Conceitos auxiliares Os conceitos de absorção e máximo assintótico (em ordem) são motivados por idéias de reduzir a complexidade de um algoritmo às ordens das suas partes. A idéia de uma componente de um algoritmo absorver outra se aplica quando ambas as componentes são conjuntivas. Para o caso de componentes disjuntivas, aparece a idéia de máximo assintótico, que será considerada em seguida. Uma complexidade é absorvida por outra, por exemplo, se ambas são polinômios na mesma variável. Nesse caso, a complexidade de menor grau é absorvida. Assim, n é absorvida por n 2. Também, n. logn é absorvida por n 2. Dadas funções f e g de IN em IR+, dizemos que f é absorvida por g, sse, f é O( g ). Isto significa que: ( c IR+) ( n 0 IN) ( n > n 0 ): f(n) < c. g(n). Princípio da absorção Para funções f e g de IN em IR+, se f é absorvida por g, sua soma pontual f + g é Θ ( g ). Assim, como n. logn é absorvida por n 2, a soma ( n. logn + n 2 ) é Θ ( n 2 ). Máximo assintótico Considerando funções f e g de IN em IR+, vamos a seguir examinar algumas expressões mais simples para a ordem do máximo pontual Máx ( f, g )(n) := Máx { f(n), g(n) }. Pode acontecer, no entanto, que não exista uma dominância. Quando isso acontece, uma solução simplista, mas muitas vezes usada, é utilizar para a ordem do máximo pontual Máx ( f, g ) a soma pontual, dada por ( f + g )(n) := f(n) + g(n). Inicialmente, é claro que o máximo assintótico deve ser comutativo. (i): MxAO ( f, g ) = MxAO ( g, f ). Devemos também requerer que as funções sejam dominadas. (ii): f = O( MxAO ( f, g ) ) e g = O( MxAO ( f, g ) ). Podemos exigir que o máximo assintótico seja a melhor cota superior. (iii): MxAO ( f, g ) = O( h ), sempre que f = O( h ) e g = O( h ). Podemos requerer também a seguinte propriedade. (iv): MxAO ( f, g ) = g, sempre que ( n 0 IN) ( n > n 0 ): f(n) < g(n). Consideremos, por sua vez, funções f e g de IN em IN. O que devemos esperar de seu máximo assintótico MxAO ( f, g )?

3.2 EQUAÇÕES DE COMPLEXIDADE PESSIMISTA Precisamos das complexidades das componentes básicas e saber como combinar complexidades de componentes. Vamos analisar a complexidade de cada uma das principais estruturas algorítmicas. Daremos ênfase à variante c P < [a], cuja notação simplificaremos para c P [a]. Vários resultados podem ser adaptados para a variante c P = [a]. 3.2.1 Atribuição Exemplo 3.2.1. Considere as atribuições a seguir: a) Para variáveis inteiras i e j: i 0 {inicialização} ; j i {transferência}. Ambas têm complexidade constante: Θ (1). b) Para lista v de inteiros e variável inteira m: m Max(v) {valor máximo}. Esta atribuição envolve (sendo n o comprimento da lista em v): - determinar o máximo da lista v, com complexidade Θ (n); - transferir este valor, com complexidade Θ (1). Sua complexidade tem ordem linear: Θ (n). c) Para listas u, v e w: u v {transfere lista}; w Reversa(v) {inverte lista}. A atribuição de transferência de cada elemento da lista v, tendo complexidade O (n), para uma lista u com comprimento n. A atribuição w Reversa(v) envolve: - inverter a lista v, com complexidade Θ (n); - transferir os elemento da lista invertida, com complexidade Θ (n). Sua complexidade tem ordem n + n, i. e. O (n). Assim, o desempenho da atribuição v e, com entrada d é dado por: desemp[ v e ](d) = cálc[ e ](d) + transf[ e(d) ]. Complexidade pessimista da atribuição A complexidade pessimista da atribuição v e tem cotas: Máx ( c P [ e ], c P [ e ] ) < c P [ v e ] < c P [ e ] + c P [ e ]. Logo, a ordem da complexidade pessimista da atribuição v e é dada por: c P [ v e ] = O ( c P [ e ] + c P [ e ] ). Exemplo 3.2.2. Para listas u e v de inteiros, temos: c P [ u Ordene(v) ] = O ( c P [ Ordene ] + c P [ Ordene(v) ] ). Supondo que Ordene é um algoritmo com tempo O ( n 2 ), teremos: c P [ u Ordene(v) ] = O ( n 2 + n ) = O ( n 2 ). Note que, se a operação fundamental é a comparação, então: c P [ u Ordene(v) ] = O ( c P [ Ordene ] ). 3.2.2 Seqüência (ou composição) Exemplo 3.2.3. Considere as seqüências a seguir: a) Para variáveis inteiras i e j: i 0 ; j i. Sua complexidade tem ordem 1 + 1: Θ ( 1 ).

b) Para lista v de inteiros e variável inteira m: m Max(v) ; m m + 1. Sua complexidade tem ordem n + 1: O ( n ). c) Para listas u, v e w: u v ; w Reversa(v). Sua complexidade tem ordem n + n: Θ ( n ). Assim, o desempenho da seqüência S ; T com entrada d é dado por: desemp[ S ; T ](d) = desemp[ S ](d) + desemp[ T ](S(d)). Exemplo 3.2.4. Considere o trecho de algoritmo: v Reversa(u) ; w Ordene(v), onde Reversa e Ordene têm complexidades Θ(n) e O(n 2 ), respectivamente. O algoritmo composto tem complexidade de ordem n + n 2, i. e. O ( n 2 ). Complexidade da seqüência com perservação (assintótica) de tamanho Se S preserva tamanho assintoticamente, então a complexidade pessimista da seqüência S ; T tem cotas: Máx ( c P [ S ], c P [ T ] ) < c P [ S ; T ] < c P [ S ] + c P [ T ]. A ordem da complexidade pessimista da seqüência S ; T é dada por: c P [ S ; T ] = O ( c P [ S ] + c P [ T ] ). Exemplo 3.2.5. Dados algoritmos Prim(u) e Buscab(a,v), considere a seqüência: v Prim(u) ; Buscab( a, v ). Vamos supor que: - Prim(u) dá como saída a primeira metade da lista em u, com comprimento n / 2, e tem complexidade Θ ( n ); - Buscab( a, v ) procura a na lista v, com complexidade O ( logm ), para lista v com comprimento m. Assim, o algoritmo composto tem complexidade de ordem: n + log n / 2, ou seja O ( n ). Complexidade pessimista da seqüência (em geral) Para entradas com tamanho até n, i. e. s(n) := Máx { tam(s(d)) / tam(d) < n }, a complexidade pessimista da seqüência S ; T tem cotas: Máx ( c P [ S ](n), c P [ T ](s(n)) ) < c P [ S ; T ](n) < c P [ S ](n) + c P [ T ](s(n)). Logo, a complexidade pessimista da seqüência S ; T é dada por: c P [ S ; T ](n) = O ( c P [ S ](n) + c P [ T ](s(n)) ). Exemplo 3.2.6. Considere a seqüência: v Prim(u) ; w Fin(u) ; v Ordene(v) ; w Ordene(w) ; u Concat( v, w ). Vamos supor que: - Prim é como no exemplo 3.2.5 e, analogamente, Fin dá a segunda metade de sua entrada; - Ordene tem complexidade quadrática; - Concat( v, w ) dá como saída a concatenação das listas v e w, com complexidade O ( p + q ). Assim, o algoritmo composto tem complexidade de ordem: n + n + n 2 2 + n 2 2 + ( n 2 + n 2 ), ou seja O ( n2 ).

3.2.3 Condicionais Exemplo 3.2.7. Considere as estruturas condicionais a seguir: a) Para variável inteira i: se i = 0 então i i + 1. Esta estrutura condicional envolve: - determinar se o valor de i é 0, com complexidade Θ ( 1 ); - se sim, executar a atribuição i i + 1, com complexidade Θ ( 1 ). Sua complexidade tem ordem constante: Θ ( 1 ). b) Para lista v de inteiros e variável inteira m: se m = 0 então m Max(v). Esta atribuição envolve: - determinar se o valor de m é 0, com complexidade Θ ( 1 ); - se sim, executar a atribuição m Max(v), com complexidade Θ ( n ). Sua complexidade, no pior caso, tem ordem linear: Θ ( n ). Assim, o desempenho desemp[ se b então S ](d) da estrutura condicional se b então S, com entrada d é dado por: aval[ b ](d) + desemp[ S ](d) caso o valor de b em d seja verdadeiro; aval[ b ](d) caso o valor de b em d seja falso. Complexidade da estrutura condicional simples A complexidade pessimista de se b então S tem cotas: c P [ b ] < c P [ se b então S ] < c P [ b ] + c P [ S ]. Logo, a ordem da complexidade pessimista de se b então S é dada por: c P [ se b então S ] = O ( c P [ b ] + c P [ S ] ). Exemplo 3.2.8. Dados algoritmos Max e Ordene, (ex. 3.2.1 e 3.2.2), considere o seguinte trecho de algoritmo, para lista v de inteiros: se Max(v) = 0 então v Ordene(v). Para esta estrutura condicional temos: c P [ se Max(v) = 0 então v Ordene(v) ] = = O ( c P [ Max(v) = 0 ] + c P [ v Ordene(v) ] ). Como seus componentes têm complexidades pessimistas: c P [ Max(v) = 0 ] = O ( n ) e c P [ v Ordene(v) ] = O ( n 2 ); a ordem da complexidade pessimista desta estrutura condicional é: c P [ se Max(v) = 0 então v Ordene(v) ] = O ( n + n 2 ) = O( n 2 ). Exemplo 3.2.9. Considere as estruturas condicionais a seguir: a) Para variáveis inteiras i e j: se i j então i i + j senão j i + 1. Esta estrutura condicional envolve: - saber se os valores de i e j são diferentes, tem complexidade Θ ( 1 ); - se sim, executar a atribuição i i + j, com complexidade Θ ( 1 ); - se não, executar a atribuição j i + 1, com complexidade Θ ( 1 ). Sua complexidade tem ordem constante: Θ ( 1 ). b) Para listas u e v (de inteiros): se u = v então v Prim(u) senão u Ordene(v). Esta estrutura condicional envolve: - determinar se as listas u e v são iguais, com complexidade O ( n ); - se sim, executar a atribuição v Prim(u), com complexidade O ( n ); - se não, executar a atribuição u Ordene(v), com complexidade O(n 2 ). Sua complexidade, no pior caso, tem ordem quadrática: O ( n 2 ).

Assim, a estrutura condicional se b então S senão T, com entrada d tem desempenho desemp[ se b então S senão T ](d) dado por: aval[ b ](d) + desemp[ S ](d) aval[ b ](d) + desemp[ T ](d) caso o valor de b em d seja verdadeiro; caso o valor de b em d seja falso. Complexidade pessimista da estrutura condicional composta A complexidade pessimista de se b então S senão T tem as cotas: inferior : Máx ( c P [ b ], c P [ S ], c P [ T ] ) < c P [ se b então S senão T ]; superior : c P [ se b então S senão T ] < c P [ b ] + MxAO ( c P [ S ], c P [ T ] ). A ordem da complexidade pessimista de se b então S senão T é dada por: c P [ se b então S senão T ] = O ( c P [ b ] + MxAO ( c P [ S ], c P [ T ] ). Exemplo 3.2.10. Dados algoritmos Max, Reversa e Ordene (ex. 3.2.1 e 3.2.2), considere o seguinte trecho de algoritmo, para lista v de inteiros: se Max(v) > 0 então v Reversa(v) senão v Ordene(v). Para esta estrutura condicional temos: c P [ se Max(v) > 0 então v Reversa(v) senão v Ordene(v) ] = = O ( c P [ Max(v) > 0 ] + MxAO ( c P [ v Reversa(v) ],c P [ v Ordene(v) ] ) ). Suas componentes têm as seguintes complexidades pessimistas: c P [ Max(v) > 0 ] = O ( n ); c P [ v Reversa(v) ] = O ( n ) e c P [ v Ordene(v) ] = O ( n 2 ). Assim, temos o seguinte máximo assintótico em ordem de complexidades: MxAO ( c P [ v Reversa(v) ], c P [ v Ordene(v) ] ) = = MxAO ( n, n 2 ) = O( n 2 ). A ordem da complexidade pessimista desta estrutura condicional é: c P [ se Max(v) > 0 então v Reversa(v) senão v Ordene(v) ] = = O( n + n 2 ) = O( n 2 ).