Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouVagner Amaral Rico Alterado mais de 6 anos atrás
2
3.3 Exemplos de aplicação Algoritmo 3.3.1: Máximo e mínimo de tabela.
Função Max_&_min( Tab : D ) Par[ Elmord ] {para máximo e mínimo de tabela} {Entrada: tabela Tab : D. Saída: valores Max, min : Elmord (máximo e mínimo da entrada).} sorte D := vetor [ p..q ] de Elmord ; 1. Max Tab[ p ] ; {candidato a máximo} 2. min Tab[ p ] ; {candidato a mínimo} 3. para i de p + 1 até q faça {varre tabela: de 3 a 6} 4. se Tab[ i ] Max então Max Tab[ i ] ; {atualiza Max} 5. se Tab[ i ] min então min Tab[ i ] ; {atualiza min} 6. fim-para ; {3: i de p + 1 até q} 7. retorne-saída ( Max , min ) ; {dá saída Max e min} 8. fim-Função {fim do algoritmo Max_&_min: máximo e mínimo de tabela} Complexidade de Algoritmos
3
Escolhendo como operação fundamental a comparação entre elementos.
Analisando: cP [ linha 1 ; linha 2 ] = O( 1 ). cP [ linha 4 ] + cP [ linha 5 ] ) = O( 1 ). cP [ para linha 3 … linha 6 ] = O( q - p) . cP [ linha 4; linha 5 ] = = O( n . 1 ) = O( n ). cP [ Máx_&_mín ] = O( O( 1 ).+ cP [para linha linha 6 . cP [ linha 7 ]) = O( 1 + n + 1 ) = O( n ). Complexidade de Algoritmos
4
Algoritmo 3.3.3: Classificação de vetor.
Procedimento Classif_Max( A : V ) {classifica vetor em ordem ascendente} {Entrada: vetor A : V;Saída: vetor A : V ( entrada classificado em ordem ascendente).} sorte V := vetor [ 1..n ] de Elmord ; var {auxiliar} Temp : Elmord {temporária (para troca)} ; 1. para i de 1 até n -1 faça {de 1 a 10} 2. para j de 1 até n - i faça {de 2 a 9} 3. se A[ j ] A[ j + 1 ] {testa inversão} 4. então {troca A[ j ] com A[ j + 1 ]} 5. Temp A[ j ] ; 6. A[ j ] A[ j + 1 ] ; 7. A[ j + 1 ] Temp ; 8. fim-se ; {3: A[ j ] A[ j + 1 ]?} 9. fim-para ; {2: j de 1 até n - i} 10. fim-para ; {1: i de 1 até n} 11. retorne-saída ( A ) ; {dá saída A} 12. fim-Procedimento .{fim de Classif_Max: classificação ascendente} Complexidade de Algoritmos
5
Algoritmo 3.3.4: Loteria esportiva.
Procedimento Loto( Rslt : V, Apst : M ) {teste da loteria esportiva} {Entrada: vetor Rslt : V (resultado de teste), matriz Apst : M (apostador) Saída: vetor Ptos : vetor [ 1..n ] de IN (número de pontos feitos por apostador).} sorte V := vetor [ 1..13 ] de { 1..3 } ; M := matriz [ 1..n, 0..13 ] de Info ; 1. i 1 ; {inicializa número de apostadores} 2. enqto i < n faça {examina apostador: de 2 a 8} 3. Ptos[ i ] 0 ; {inicializa número de pontos do apostador i} 4. para j de 1 até 13 faça {examina palpites: de 4 a 6} 5. se Apst[ i,j ] = Rslt[ j ] então Ptos[ i ] Ptos[ i ] + 1. 6. fim-para ; {4: pontos do apostador i contabilizados} 7. i i + 1 ; {novo apostador} 8. fim-enqto ; {2: contabilizados os pontos de todos apostadores} 9. para i de 1 até n faça {lista ganhadores: de 9 a 11} 10. se Ptos[ i ] = 13 então escreva ( Apst[ i,0 ], "Ganhador, parabéns" ) 11. fim-para ; {9: ganhadores listados} 12. retorne-saída ( Ptos ) ; {dá saída Ptos} 13. fim-Procedimento . {fim do algoritmo Loto: loteria esportiva} Complexidade de Algoritmos
6
Algoritmo 3.3.2: União e interseção de conjuntos.
Função Uni&Int( S, T : M ) Par[ M ] {para a união e interseção de conjuntos} {Entrada: conjuntos S, T : M (a operar). Saída: conjuntos Uni, Int : M (Uni, união S T, e Int, a interseção S T).} sorte M := Conj[ Elm ] {conjuntos de elementos de Elm} ; var {auxiliar} x : Elm {elemento de Elm} ; 1. Uni S ; {inicializa Uni com S} 2. Int ; {inicializa Int com vazio} 3. para cada x T faça {varre conjunto T: de 3 a 8} 4. se x S {testa se x está em S} 5. então Insere( x, Int ) {põe x comum em Int} 6. senão Insere( x, Uni ) ; {põe novo x em Uni} 7. fim-se ; {4: x S?} 8. fim-para ; {3: cada x T} 9. retorne-saída ( Uni, Int ) ; {dá saída Uni e Int} 10. fim-Função . {fim de Uni&Int: união e interseção de conjuntos} Complexidade de Algoritmos
7
= O( | S | + 1 + ( | T | . cP [ se linha 4 … linha 7 ] ) + 1)
Analisando: cP [ Uni&Int ] = =O(cP [ Uni S ]+cP [ Int ]+cP [ para linha3 … linha8 ] )+cP [ linha 9 ] = O( | S | + 1 + ( | T | . cP [ se linha 4 … linha 7 ] ) + 1) Tomando n = max{|S|, |T|} = O( n+1 + ( n . ( cP [ x S ] + MxAO ( cP [ linha 5 ], cP [ linha 6 ] ) ) )+1) = O( n + ( n . ( | S | + MxAO ( 1 ,1 ) ) ) ) = O( n + ( n . ( n + 1 ) ) ) = O( n + n2 ) = O( n2 ). Complexidade de Algoritmos
8
3.4 Princípios básicos A complexidade pessimista de um dado algoritmo dá uma cota superior para os desempenhos sobre entradas com tamanho até n: para entrada d com tam( d ) n, temos desemp[ a ]( d ) cP[ a ]( n ). Por outro lado, a complexidade pessimista é a menor cota superior para os desempenhos sobre entradas com tamanho até n: se desemp[ a ]( d ) f(n) para toda entrada d, tam( d ) n, então cP[ a ]( n ) f(n). Um algoritmo geralmente tem componentes que dão suas contribuições para o desempenho e para a complexidade do algoritmo. Algumas componentes de um algoritmo são sempre executadas. Outras componentes definem alternativas, que são executadas conforme o caso. Além disso, pode ser conveniente encarar uma componente como a restrição de um algoritmo a certas entradas (fornecidas por outras componentes). Complexidade de Algoritmos
9
3.4.1 Componentes conjuntivas
Vamos examinar algoritmos com duas componentes conjuntivas. Uma componente de um algoritmo é dita conjuntiva quando ela é sempre executada em qualquer execução do algoritmo. Consideremos um algoritmo a com duas componentes conjuntivas a1 e a2, o desempenho do algoritmo a sobre entrada d é dado por desemp[ a ]( d ) = desemp[ a1 ]( d ) + desemp[ a2 ]( d ) (c.1) Para d com tam( d ) n, sabemos que desemp[ a ]( d ) cP[ a1 ]( n ) + cP[ a2 ]( n ) cP[ a ]( n ) cP[ a1 ]( n ) + cP[ a2 ]( n ) (c.s) E Máx ( cP[ a1 ] , cP[ a2 ] )( n ) cP[ a ]( n ) (c.i) Complexidade de Algoritmos
10
Máx ( cP[ a1 ] , cP[ a2 ] ) cP[ a ] cP[ a1 ] + cP[ a2 ]
Princípio das componentes conjuntivas Considere um algoritmo a cujas duas componentes princípio:das componentes conjuntivas a1 e a2 são conjuntivas. Então, a complexidade pessimista do algoritmo a tem cotas Máx ( cP[ a1 ] , cP[ a2 ] ) cP[ a ] cP[ a1 ] + cP[ a2 ] Logo a complexidade pessimista do algoritmo a tem ordem ( cP[ a1 ] + cP[ a2 ] ). 3.4.2 Componentes disjuntivas Componentes disjuntivas de um algoritm são executadas em algumas execuções do algoritmo, dependendo do valor da entrada. Consideremos um algoritmo a com duas componentes disjuntivas a1 e a2. Desse modo: desemp[ a ]( d ) = desemp[ a1 ]( d ) ou desemp[ a ]( d ) = desemp[ a2 ]( d ) Complexidade de Algoritmos
11
desemp[ a ]( d ) Máx [ desemp[ a1 ]( d ) , desemp[ a2 ]( d ) ];
Para tam( d ) n desemp[ a ]( d ) Máx [ desemp[ a1 ]( d ) , desemp[ a2 ]( d ) ]; desemp[ a1 ]( d ) cP[ a1 ]( n ) e desemp[ a2 ]( d ) cP[ a2 ]( n ) desemp[ aj ]( d ) Máx [ cP[ a1 ]( n ), cP[ a2 ]( n ) ], para cada j = 1, 2; logo Máx [ desemp[ a1 ]( d ), desemp[ a1 ]( d ) ] Máx [ cP[ a1 ]( n ), cP[ a2 ]( n ) ] Uma cota superior: cP[ a ]( n ) Máx [ cP[ a1 ]( n ), cP[ a2 ]( n ) ] (d.s) Princípio das componentes disjuntivas Considere um algoritmo a de modo que desemp[ a ]( d ) = desemp[ a1 ]( d ) ou desemp[ a ]( d ) = desemp[ a2 ]( d ), para toda entrada d. Então: cP[ a ] Máx ( cP[ a1 ] , cP[ a2 ] ). Logo, a complexidade pessimista do algoritmo a tem ordem MxAO ( f, g ). Complexidade de Algoritmos
12
3.4.3 Especialização por transformação de entradas
Componentes em que a execução de uma altere o valor da entrada para outra Consideremos um algoritmo aF consistindo da especialização de um algoritmo a a entradas transformadas por uma função F. A execução do algoritmo aF sobre entrada d envolve a execução do algoritmo a sobre a versão transformada F( d ) dessa entrada d. Assim, o desempenho do algoritmo aF com entrada d é dado por desemp[ aF ]( d ) = desemp[ a ]( F(d) ) Cota superior para os tamanhos das entradas transformadas para entrada d com tam( d ) n: tam( F(d) ) f( n ) desemp[ aF ]( d ) Máx { desemp[ a ]( d' ) / tam( d' ) ≤ f( n ) } e desemp[ aF ]( d ) cP[ a ]( f(n) ), logo cP[ aF ]( n ) cP[ a ]( f(n) ) (t.s) Complexidade de Algoritmos
13
cP[ aF ]( n ) cP[ a ]( f(n) ).
Princípio da especialização por transformação de entradas O algoritmo aF resulta da especialização de um algoritmo a a entradas transformadas por uma função F, de modo que desemp[ aF ]( d ) = desemp[ a ]( F(d) ), para qualquer entrada d. Suponha que a função f : dá uma cota superior para os tamanhos das entradas transformadas (i. e. tam( F(d) ) f( n ), para toda entrada d com tam( d ) n). Então: cP[ aF ]( n ) cP[ a ]( f(n) ). Esses três princípios servem de base para a análise de complexidade pessimista de algoritmos. Complexidade de Algoritmos
14
3.5 Resumo do capítulo A finalidade deste capítulo é introduzir uma metodologia para analisar a complexidade pessimista (i. e. no pior caso) de um algoritmo com base em sua estrutura. A complexidade do algoritmo é obtida, passo a passo, a partir das complexidades de suas componentes. Algumas componentes de um algoritmo são sempre executadas (as conjuntivas), outras (as disjuntivas) definem alternativas, que são executadas conforme o caso. Cada componente executada dá sua contribuição para a complexidade do algoritmo. Princípio das componentes conjuntivas cP[ a ] ( cP[ a1 ] + cP[ a2 ] ). Princípio das componentes disjuntivas cP[ a ] Máx ( cP[ a1 ] , cP[ a2 ] ). Portanto, a complexidade pessimista do algoritmo a tem ordem MxAO MxAO ( f , g ). Complexidade de Algoritmos
15
Princípio da transformação de entradas cP[ a ] ( cP[ a ]( f(n) ) ).
Esses três princípios são básicos para a análise de complexidade pessimista. Os conceitos de absorção e máximo assintótico (em ordem) são motivados pelas ideias de reduzir a complexidade de um algoritmo às ordens das suas partes, originando algumas simplificações. A ideia de uma componente de um algoritmo absorver outra aplica-se quando ambas são sempre executadas. Para o caso de alternativas, quando se executa ora uma ora outra dessas componentes, aparece a idéia de máximo assintótico em ordem. A complexidade de uma parte pode ser "absorvida" pela complexidade de outra: a ideia é que a segunda domina a primeira, dando a contribuição principal para a soma. Para funções f e g de em +, dizemos que f é absorvida por g sse f é ( g ). Complexidade de Algoritmos
16
Se f é absorvida por g, sua soma pontual f + g é ( g ).
Princípio da absorção Se f é absorvida por g, sua soma pontual f + g é ( g ). O máximo assintótico em ordem, MxAO( f, g) de duas funções f e g de em deve ser uma boa cota superior - em sentido assintótico - para as ordens de ambas. Frequentemente, toma-se como máximo assintótico a soma ou o máximo pontuais. Complexidades pessimistas de cada uma das principais estruturas algorítmicas: Atribuição: v e: cP[ v e ] = ( cP[ e ] + cP[ e ] ); onde cP[ e ] e cP[ e ] são as complexidades pessimistas da avaliação da expressão e e da transferência do valor resultante, respectivamente. Condicional se b então S senão T fim-se: cP [ se b então S senão T fim-se ] = ( cP[ b ] + MxAO ( cP[ S ] , cP[ T ] ) ); onde MxAO dá um máximo assintótico em ordem das complexidades das partes. Complexidade de Algoritmos
17
cP[ S ; T ]( n ) = ( cP [ S ]( n ) + cP[ T ]( s(n) ) );
Seqüência S ; T: cP[ S ; T ]( n ) = ( cP [ S ]( n ) + cP[ T ]( s(n) ) ); onde s( n ) dá o tamanho máximo da saída de S para entradas com tamanho até n, i. e. s( n ) := Máx { tam( S(d) ) / tam( d ) n }. IIeração definida para i de j até m faça S fim-para: cP [ para i de j até m faça S fim-para ]( n ) = onde m( n ) := Máx { m( d ) / tam(d) n }, j( n ) := mín { j( d ) / tam(d) n }, e a função s : é como no caso de sequência acima. Complexidade de Algoritmos
18
Iteração indefinida enqto b faça S fim-enqto:
cP [ enqto b faça S fim-enqto ]( n ) = onde s : é como acima, e h(n) dá o número máximo de iterações para entradas com tamanho até n, i. e. h( n ) := Máx { H( d ) / tam(d) n }, com H( d ):= mín { i / b( Si(d) ) }. Complexidade de Algoritmos
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.