slides - Facom

Propaganda
Introdução à Análise de Algoritmos
Marcelo K. Albertini
23 de Outubro de 2014
Aula de hoje
Nesta aula veremos:
Análise empı́rica de algoritmos
2/1
Análise empı́rica de algoritmos
Custo = memória + tempo
Quanto espaço de memória o algoritmo vai consumir?
Quanto tempo levar o algoritmo?
3/1
Análise empı́rica de algoritmos
Custo = memória + tempo
Quanto espaço de memória o algoritmo vai consumir?
Quanto tempo levar o algoritmo?
Como atribuir custo/estimar tempo de operações
uniforme - todas as operações tem o mesmo custo fixo T
atribuições de valores, cópias de variáveis, chamadas de funções
operações lógico-aritméticas
proporcional - operações tem custo proporcional ao número de
bits sendo operados
3/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
8
9
// l e r i n t e i r o p o s i t i v o ”n ”. . .
i f ( n > 10) {
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ;
}
f o r ( i n t i = 1 ; i < 1 0 ; i ++) {
f o r ( i n t j = 1 ; j < i ; j ++) {
System . o u t . p r i n t l n ( i ∗ j ) ;
}
}
4/1
Ordenação
Como ordenar cartas de baralho?
Como ordenar depósitos em um banco?
Como estimar a duração?
Qual é o modelo de aumento de custo com o aumento de
entradas?
Como extrapolar o resultado?
5/1
Definição de um problema
Exemplo: problema de ordenação crescente
Entrada: uma sequência de n números a1 , a2 , a3 , . . . , an
Saı́da: uma reordenação b1 , b2 , . . . , bn , tal que bi < bj se i < j
A solução: um algoritmo
correto: se para cada instância de entrada, o algoritmo conclui
com a saı́da correta
se o é algoritmo é correto então ele resolve o problema
6/1
Análise empı́rica de algoritmos
Custo = memória + tempo
Quanto espaço de memória o algoritmo vai consumir?
Quanto tempo levar o algoritmo?
7/1
Análise empı́rica de algoritmos
Custo = memória + tempo
Quanto espaço de memória o algoritmo vai consumir?
Quanto tempo levar o algoritmo?
Como atribuir custo/estimar tempo de operações
uniforme - todas as operações tem o mesmo custo fixo T
atribuições de valores, cópias de variáveis, chamadas de funções
operações lógico-aritméticas
proporcional - operações tem custo proporcional ao número de
bits sendo operados
7/1
Avaliação empı́rica
A avaliação empı́rica permite
avaliação do desempenho em uma determinada configuração
de computador/linguagem
considera custos não aparentes: custo de alocação de
memória, sobrecarga de chamada de funções
comparar computadores
comparar linguagens
reconhecer modelo de desempenho para casos difı́ceis de
avaliação matemática de algoritmos
8/1
Avaliação empı́rica
Dificuldades
necessário implementar o algoritmo
resultados dependem do computador utilizado e de eventos
ocorridos no momento de avaliação
difı́cil de generalizar
9/1
Avaliação matemática
A avaliação matemática
uso de algoritmo em um “computador” idealizado
simplificação para considerar somente os custos dominantes
10/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
8
9
10
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 10) {
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ;
}
f o r ( i n t i = 0 ; i < n ; i ++) {
f o r ( i n t j = 0 ; j < i ; j ++) {
System . o u t . p r i n t l n ( i ∗ j ) ;
}
}
11/1
Avaliação de custos em um algoritmo
1 // E n t r a d a : i n t e i r o p o s i t i v o ”n ”
2 // S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
3 i f ( n > 10) {
12/1
Avaliação de custos em um algoritmo
1 // E n t r a d a : i n t e i r o p o s i t i v o ”n ”
2 // S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
3 i f ( n > 1 0 ) { // 1 vez , c u s t o c1
4
12/1
Avaliação de custos em um algoritmo
1 // E n t r a d a : i n t e i r o p o s i t i v o ”n ”
2 // S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
3 i f ( n > 1 0 ) { // 1 vez , c u s t o c1
4 System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
5
12/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
12/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z e s , c3 + nc1 + nc4
12/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
8
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
12/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9
12/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10
12/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10 }
Custos
comparação c1 , impressão c2 , atribuição c3 , incremento c4 ,
multiplicação c5
12/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10 }
Custos: pior caso – quando o algoritmo executar tudo
T (n) =
13/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10 }
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 +
13/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10 }
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 + c2 +
13/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10 }
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 + c2 + (c3 + nc1 + nc4 ) +
13/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10 }
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 + c2 + (c3 + nc1 + nc4 ) + (c3 + mc1 + mc4 ) +
13/1
Avaliação de custos em um algoritmo
1
2
3
4
5
6
7
// E n t r a d a : i n t e i r o p o s i t i v o ”n ”
// S aı́ d a : i m p r i m i r m u l t i p l i c a ç õ e s de 0 a ”n ”
i f ( n > 1 0 ) { // 1 vez , c u s t o c1
System . o u t . p r i n t l n ( ” I s t o pode d e m o r a r . . . ”) ; c2
}
f o r ( i n t i = 0 ; i < n ; i ++) { // n v e z eP
s , c3 + nc1 + nc4
f o r ( i n t j = 0 ; j < i ; j ++) { // m = nj=1 j v e z e s ,
c3 + mc1 + mc4
8
System . o u t . p r i n t l n ( i ∗ j ) ; // c2 + c5
9 }
10 }
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 + c2 + (c3 + nc1 + nc4 ) + (c3 + mc1 + mc4 ) + m ∗ (c2 + c5 )
13/1
Avaliação de custos em um algoritmo
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 +c2 +(c3 +nc1 +nc4 )+(c3 +mc1 +mc4 )+m∗(c2 +c5 ))
14/1
Avaliação de custos em um algoritmo
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 +c2 +(c3 +nc1 +nc4 )+(c3 +mc1 +mc4 )+m∗(c2 +c5 ))
se todos custos forem considerados iguais a “c”:
14/1
Avaliação de custos em um algoritmo
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 +c2 +(c3 +nc1 +nc4 )+(c3 +mc1 +mc4 )+m∗(c2 +c5 ))
se todos custos forem considerados iguais a “c”:
T (n) = c + c + (c + nc + nc) + (c + mc + mc) + m ∗ (c + c))
14/1
Avaliação de custos em um algoritmo
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 +c2 +(c3 +nc1 +nc4 )+(c3 +mc1 +mc4 )+m∗(c2 +c5 ))
se todos custos forem considerados iguais a “c”:
T (n) = c + c + (c + nc + nc) + (c + mc + mc) + m ∗ (c + c))
T (n) = 2c + (c + 2nc) + (c + 2mc) + 2mc
14/1
Avaliação de custos em um algoritmo
Custos: pior caso – quando o algoritmo executar tudo
T (n) = c1 +c2 +(c3 +nc1 +nc4 )+(c3 +mc1 +mc4 )+m∗(c2 +c5 ))
se todos custos forem considerados iguais a “c”:
T (n) = c + c + (c + nc + nc) + (c + mc + mc) + m ∗ (c + c))
T (n) = 2c + (c + 2nc) + (c + 2mc) + 2mc
T (n) = 4c + 2nc + 4mc
14/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4mc
15/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4mc
Quanto é m ?
P
m = nj=1 j =
1 + 2 + 3 + 4 + 5 + . . . + (n − 3) + (n − 2) + (n − 1) + n =
15/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4mc
Quanto é m ?
P
m = nj=1 j =
1 + 2 + 3 + 4 + 5 + . . . + (n − 3) + (n − 2) + (n − 1) + n =
(n + 1) + (2 + (n − 1)) + (3 + (n − 2)) + . . . + (n + 1)
15/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4mc
Quanto é m ?
P
m = nj=1 j =
1 + 2 + 3 + 4 + 5 + . . . + (n − 3) + (n − 2) + (n − 1) + n =
(n + 1) + (2 + (n − 1)) + (3 + (n − 2)) + . . . + (n + 1)
Somamos n/2 pares de números (n + 1)
15/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4mc
Quanto é m ?
P
m = nj=1 j =
1 + 2 + 3 + 4 + 5 + . . . + (n − 3) + (n − 2) + (n − 1) + n =
(n + 1) + (2 + (n − 1)) + (3 + (n − 2)) + . . . + (n + 1)
Somamos n/2 pares de números (n + 1)
m = n2 (n + 1)
15/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4mc
Quanto é m ?
P
m = nj=1 j =
1 + 2 + 3 + 4 + 5 + . . . + (n − 3) + (n − 2) + (n − 1) + n =
(n + 1) + (2 + (n − 1)) + (3 + (n − 2)) + . . . + (n + 1)
Somamos n/2 pares de números (n + 1)
m = n2 (n + 1)
15/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4mc
Quanto é m ?
P
m = nj=1 j =
1 + 2 + 3 + 4 + 5 + . . . + (n − 3) + (n − 2) + (n − 1) + n =
(n + 1) + (2 + (n − 1)) + (3 + (n − 2)) + . . . + (n + 1)
Somamos n/2 pares de números (n + 1)
m = n2 (n + 1)
Custo do algoritmo é
T (n) = 4c + 2nc + 4( n2 (n + 1))c
15/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4( n2 (n + 1))c
Qual é o custo dominante do algoritmo?
16/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4( n2 (n + 1))c
T (n) = 4c + 2nc + 2n(n + 1)c
Qual é o custo dominante do algoritmo?
16/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4( n2 (n + 1))c
T (n) = 4c + 2nc + 2n(n + 1)c
T (n) = 4c + 2nc + 2n2 c + 2nc
Qual é o custo dominante do algoritmo?
16/1
Avaliação de custos em um algoritmo
Custo do algoritmo é
T (n) = 4c + 2nc + 4( n2 (n + 1))c
T (n) = 4c + 2nc + 2n(n + 1)c
T (n) = 4c + 2nc + 2n2 c + 2nc
T (n) = 4c + 4cn + 2cn2
Qual é o custo dominante do algoritmo?
16/1
Complexidade de tempo
Custo do algoritmo de multiplicação de números
A função que descreve o custo do nosso algoritmo é
T (n) = 4c + 4cn + 2cn2 .
17/1
Complexidade de tempo
Custo do algoritmo de multiplicação de números
A função que descreve o custo do nosso algoritmo é
T (n) = 4c + 4cn + 2cn2 .
Complexidade de tempo
Para descrever a complexidade usamos somente o custo
dominante: 2cn2 .
17/1
Complexidade de tempo
Custo do algoritmo de multiplicação de números
A função que descreve o custo do nosso algoritmo é
T (n) = 4c + 4cn + 2cn2 .
Complexidade de tempo
Para descrever a complexidade usamos somente o custo
dominante: 2cn2 .
Porquê?
Existe um número n = a a partir do qual o custo 2ca2 é sempre
superior a 4ca, tornando-o pouco importante.
17/1
Complexidade de tempo
Custo do algoritmo de multiplicação de números
A função que descreve o custo do nosso algoritmo é
T (n) = 4c + 4cn + 2cn2 .
Complexidade de tempo
Para descrever a complexidade usamos somente o custo
dominante: 2cn2 .
Porquê?
Existe um número n = a a partir do qual o custo 2ca2 é sempre
superior a 4ca, tornando-o pouco importante.
Ordem de crescimento
Dizemos que a complexidade de pior caso do nosso algoritmo é
O(n2 ).
17/1
Estudo de complexidade de algoritmos
Dois fatores
Tempo de execução
Espaço de memória necessário
Motivações
qual é o menor custo possı́vel?
é possı́vel resolver o problema em tempo hábil?
18/1
Caso hipotético
Problema
Um banco tem 10 milhões clientes.
Cada cliente faz em média 4 transações diárias.
19/1
Caso hipotético
Problema
Um banco tem 10 milhões clientes.
Cada cliente faz em média 4 transações diárias.
Relatório
O banco precisa entregar um relatório diário para o Banco Central,
com uma relação ordenada de todas as transações.
19/1
Caso hipotético
Problema
Um banco tem 10 milhões clientes.
Cada cliente faz em média 4 transações diárias.
Relatório
O banco precisa entregar um relatório diário para o Banco Central,
com uma relação ordenada de todas as transações.
Infraestrutura
O computador do banco é dedicado ao problema e resolve
operações lógico-aritméticas na taxa de 230 (∼ 1 bilhão) operações
por segundo.
19/1
Ordenação interna
ordenar em memória
Pré-condições: vetor em memória principal, inicializado com
elementos
20/1
Ordenação interna
ordenar em memória
Pré-condições: vetor em memória principal, inicializado com
elementos
Pós-condições: vetor com elementos em ordem crescente (ou
decrescente)
20/1
Ordenação interna
ordenar em memória
Pré-condições: vetor em memória principal, inicializado com
elementos
Pós-condições: vetor com elementos em ordem crescente (ou
decrescente)
Como fica ordenado?
20/1
Algoritmo de ordenação
Definição de ordenação
Sequência de comparações e trocas de posição entre elementos
para obter vetor ordenado.
21/1
Algoritmo de ordenação
Definição de ordenação
Sequência de comparações e trocas de posição entre elementos
para obter vetor ordenado.
Complexidade
Quantas trocas, comparações (complexidade de tempo) e variáveis
auxiliares (de espaço) são necessárias?
21/1
Outras iterações
22/1
Bubblesort - Ordenação em “bolhas”
Como programar um algoritmo de ordenação simples?
Ideia
Comparar pares consecutivos de elementos e trocá-los de posição
caso o primeiro seja maior que o segundo.
1 if
2
3
4
5 }
( vetor
aux =
vetor [
vetor [
[ i ] > v e t o r [ i +1]) {
vetor [ i ] ;
i ] = v e t o r [ i +1];
i +1] = aux ;
23/1
Bubblesort - Ordenação em “bolhas”
Como programar um algoritmo de ordenação simples?
Ideia
Comparar pares consecutivos de elementos e trocá-los de posição
caso o primeiro seja maior que o segundo.
1 if
2
3
4
5 }
( vetor
aux =
vetor [
vetor [
[ i ] > v e t o r [ i +1]) {
vetor [ i ] ;
i ] = v e t o r [ i +1];
i +1] = aux ;
Variável auxiliar aux é essencial.
23/1
Algoritmo Bubblesort: versão simplificada
1 b u b b l e s o r t ( i n t v e t o r [ ] , i n t nelem ) {
24/1
Algoritmo Bubblesort: versão simplificada
1 b u b b l e s o r t ( i n t v e t o r [ ] , i n t nelem ) {
2
i n t i , i t e r a c a o , aux ;
24/1
Algoritmo Bubblesort: versão simplificada
1 b u b b l e s o r t ( i n t v e t o r [ ] , i n t nelem ) {
2
i n t i , i t e r a c a o , aux ;
3
4
/∗ c o n t r o l e do número de i t e r a ç õ e s ( n − 1 ) ∗/
5
f o r ( i t e r a c a o = 0 ; i t e r a c a o < nelem −1; i t e r a c a o ++){
24/1
Algoritmo Bubblesort: versão simplificada
1 b u b b l e s o r t ( i n t v e t o r [ ] , i n t nelem ) {
2
i n t i , i t e r a c a o , aux ;
3
4
/∗ c o n t r o l e do número de i t e r a ç õ e s ( n − 1 ) ∗/
5
f o r ( i t e r a c a o = 0 ; i t e r a c a o < nelem −1; i t e r a c a o ++){
6
/∗ r e p e t i c a o i n t e r n a , p e r c o r r e v e t o r ( n − 1 ) ∗/
7
f o r ( i = 0 ; i < nelem − 1 ; i ++){
24/1
Algoritmo Bubblesort: versão simplificada
1 b u b b l e s o r t ( i n t v e t o r [ ] , i n t nelem ) {
2
i n t i , i t e r a c a o , aux ;
3
4
/∗ c o n t r o l e do número de i t e r a ç õ e s ( n − 1 ) ∗/
5
f o r ( i t e r a c a o = 0 ; i t e r a c a o < nelem −1; i t e r a c a o ++){
6
/∗ r e p e t i c a o i n t e r n a , p e r c o r r e v e t o r ( n − 1 ) ∗/
7
f o r ( i = 0 ; i < nelem − 1 ; i ++){
8
i f ( v e t o r [ i ] > v e t o r [ i +1]) {
24/1
Algoritmo Bubblesort: versão simplificada
1 b u b b l e s o r t ( i n t v e t o r [ ] , i n t nelem ) {
2
i n t i , i t e r a c a o , aux ;
3
4
/∗ c o n t r o l e do número de i t e r a ç õ e s ( n − 1 ) ∗/
5
f o r ( i t e r a c a o = 0 ; i t e r a c a o < nelem −1; i t e r a c a o ++){
6
/∗ r e p e t i c a o i n t e r n a , p e r c o r r e v e t o r ( n − 1 ) ∗/
7
f o r ( i = 0 ; i < nelem − 1 ; i ++){
8
i f ( v e t o r [ i ] > v e t o r [ i +1]) {
9
/∗ é n e c e s s á r i a uma t r o c a ∗/
10
aux = v e t o r [ i ] ;
11
v e t o r [ i ] = v e t o r [ i +1];
12
v e t o r [ i +1] = aux ;
13
}
14
}
15
}
16 }
24/1
Um problema de ordenação
Se o algoritmo é o Bubblesort, o banco:
25/1
Um problema de ordenação
Se o algoritmo é o Bubblesort, o banco:
a) conseguirá tranquilamente fazer o relatório a tempo;
25/1
Um problema de ordenação
Se o algoritmo é o Bubblesort, o banco:
a) conseguirá tranquilamente fazer o relatório a tempo;
b) deverá comprar um computador melhor;
25/1
Um problema de ordenação
Se o algoritmo é o Bubblesort, o banco:
a) conseguirá tranquilamente fazer o relatório a tempo;
b) deverá comprar um computador melhor;
c) deverá contratar um programador melhor.
25/1
Caso bancário
Avaliação:
Ordem do Bubblesort:
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort:
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
Operações necessárias: (4 × 107 )2
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
Operações necessárias: (4 × 107 )2
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
Operações necessárias: (4 × 107 )2
Capacidade do computador: 230 operações por segundo
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
Operações necessárias: (4 × 107 )2
Capacidade do computador: 230 operações por segundo
Tempo necessário em minutos: (4 × 107 )2 /230
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
Operações necessárias: (4 × 107 )2
Capacidade do computador: 230 operações por segundo
Tempo necessário em minutos: (4 × 107 )2 /230
26/1
Caso bancário
Avaliação:
Ordem do Bubblesort: O(n2 )
Elementos a ordenar: número de transações n = 4 × 107
Operações necessárias: (4 × 107 )2
Capacidade do computador: 230 operações por segundo
Tempo necessário em minutos: (4 × 107 )2 /230
= 17 dias, 4 horas, 55 minutos e 16 segundos
26/1
Notação de complexidade
Função de complexidade (de tempo ou espaço)
Para um problema de tamanho n, buscamos uma função f (n) que
descreve o componente principal do nosso custo
Conflito de interesses
Frequentemente, quando a complexidade de tempo diminui, a
complexidade de espaço aumenta
27/1
Notação
Melhor caso: Ω
Menor custo de um algoritmo (tempo ou espaço) para todas as
entradas (problema) de tamanho n
Pior caso: O
Maior custo possı́vel de um algoritmo (tempo ou espaço) para
todas as entradas (problema) de tamanho n.
28/1
Notação
Melhor caso: Ω
Menor custo de um algoritmo (tempo ou espaço) para todas as
entradas (problema) de tamanho n
Pior caso: O
Maior custo possı́vel de um algoritmo (tempo ou espaço) para
todas as entradas (problema) de tamanho n.
O custo nunca é menor que no melhor caso e nunca maior do que
no pior caso.
28/1
Caso médio
Caso médio ou esperado
O conjunto de entradas n é descrito por uma distribuição de
probabilidades.
Qual é a função de custo, considerando a probabilidade de cada
entrada de tamanho n?
29/1
Exemplos
Problema
Verificar se um dado número está em um vetor.
Entrada: vetor com n números.
Saı́da: Afirmativo, se número buscado está entre os n números do
vetor. Negativo, caso contrário.
30/1
Exemplos
Problema
Verificar se um dado número está em um vetor.
Entrada: vetor com n números.
Saı́da: Afirmativo, se número buscado está entre os n números do
vetor. Negativo, caso contrário.
Algoritmo
Comparar cada número do vetor com o número buscado. Dar a
resposta afirmativa assim que encontrá-lo.
30/1
Análise de casos
Casos
Melhor caso: notação Ω
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
Ω(n) = 1, i.e., f (n) ≥ c ∗ Ω(n)
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
Ω(n) = 1, i.e., f (n) ≥ c ∗ Ω(n)
Pior caso: notação O
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
Ω(n) = 1, i.e., f (n) ≥ c ∗ Ω(n)
Pior caso: notação O
f (n) = 2n + 1 operações
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
Ω(n) = 1, i.e., f (n) ≥ c ∗ Ω(n)
Pior caso: notação O
f (n) = 2n + 1 operações
O(n) = n, i.e., f (n) ≤ c ∗ O(n)
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
Ω(n) = 1, i.e., f (n) ≥ c ∗ Ω(n)
Pior caso: notação O
f (n) = 2n + 1 operações
O(n) = n, i.e., f (n) ≤ c ∗ O(n)
Notação Θ: quando O(n) = Ω(n)
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
Ω(n) = 1, i.e., f (n) ≥ c ∗ Ω(n)
Pior caso: notação O
f (n) = 2n + 1 operações
O(n) = n, i.e., f (n) ≤ c ∗ O(n)
Notação Θ: quando O(n) = Ω(n)
Caso médio: distribuição de probabilidade uniforme
31/1
Análise de casos
Casos
Melhor caso: notação Ω
f (n) = 2 operações
Ω(n) = 1, i.e., f (n) ≥ c ∗ Ω(n)
Pior caso: notação O
f (n) = 2n + 1 operações
O(n) = n, i.e., f (n) ≤ c ∗ O(n)
Notação Θ: quando O(n) = Ω(n)
Caso médio: distribuição de probabilidade uniforme
1+2+3+4+...+n
n
31/1
Análise assintótica
Casos
Notação limitante inferior Ω
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
Notação limitante superior O
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
Notação limitante superior O
f (n) = 5n operações
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
Notação limitante superior O
f (n) = 5n operações
O(n) = n, i.e., f (n) ≤ cn
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
Notação limitante superior O
f (n) = 5n operações
O(n) = n, i.e., f (n) ≤ cn
Notação limitante superior e inferior iguais
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
Notação limitante superior O
f (n) = 5n operações
O(n) = n, i.e., f (n) ≤ cn
Notação limitante superior e inferior iguais
c1 ∗ Θ(n) ≤ f (n) ≤ c2 ∗ Θ(n)
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
Notação limitante superior O
f (n) = 5n operações
O(n) = n, i.e., f (n) ≤ cn
Notação limitante superior e inferior iguais
c1 ∗ Θ(n) ≤ f (n) ≤ c2 ∗ Θ(n)
não há no caso de busca de número em vetor
32/1
Análise assintótica
Casos
Notação limitante inferior Ω
f (n) = 1 operação
Ω(n) = 1, i.e., f (n) ≥ c ∗ n
Notação limitante superior O
f (n) = 5n operações
O(n) = n, i.e., f (n) ≤ cn
Notação limitante superior e inferior iguais
c1 ∗ Θ(n) ≤ f (n) ≤ c2 ∗ Θ(n)
não há no caso de busca de número em vetor
Não utiliza-se notação para casos médios
32/1
Exemplo: avaliação assintótica
Exemplo 1
f (n) = n2 + n + c
n2 = g (n) = O(f (n))
n2 domina assintoticamente os outros termos
33/1
Exemplo: avaliação assintótica
Exemplo 1
f (n) = n2 + n + c
n2 = g (n) = O(f (n))
n2 domina assintoticamente os outros termos
Exemplo 2
f (n) = n + log (n) + c
O(n)
n domina assintoticamente os outros termos
33/1
Exemplo: avaliação assintótica
Exemplo 1
f (n) = n2 + n + c
n2 = g (n) = O(f (n))
n2 domina assintoticamente os outros termos
Exemplo 2
f (n) = n + log (n) + c
O(n)
n domina assintoticamente os outros termos
Exemplo 3
f (n) = n! + n2 + c
O(n!)
n! domina assintoticamente os outros termos
33/1
Orientações
Desprezar constantes
f (n) = 100000000 ∗ n + 999999999
O(f (n)) = n
Desprezar termos de menor grandeza
Atenção
Complexidade assintótica menor não indica que o algoritmo sempre
é o melhor. Se as constantes forem significativas, na prática é
melhor considerá-las.
34/1
Classes de problemas
O(1) < O(log (n)) < O(n) < O(nlog (n)) < O(n2 ) < O(n3 ) <
O(2n )
O(1): ordem constante
35/1
Classes de problemas
O(1) < O(log (n)) < O(n) < O(nlog (n)) < O(n2 ) < O(n3 ) <
O(2n )
O(1): ordem constante
O(log (n)): ordem logaritmica
35/1
Classes de problemas
O(1) < O(log (n)) < O(n) < O(nlog (n)) < O(n2 ) < O(n3 ) <
O(2n )
O(1): ordem constante
O(log (n)): ordem logaritmica
O(n): ordem linear
35/1
Classes de problemas
O(1) < O(log (n)) < O(n) < O(nlog (n)) < O(n2 ) < O(n3 ) <
O(2n )
O(1): ordem constante
O(log (n)): ordem logaritmica
O(n): ordem linear
O(nlog (n)): ordem tı́pica de soluções em “pedaços”, e.g.,
árvores
35/1
Classes de problemas
O(1) < O(log (n)) < O(n) < O(nlog (n)) < O(n2 ) < O(n3 ) <
O(2n )
O(1): ordem constante
O(log (n)): ordem logaritmica
O(n): ordem linear
O(nlog (n)): ordem tı́pica de soluções em “pedaços”, e.g.,
árvores
O(n2 ): ordem quadrática. “um laço dentro de outro”
35/1
Classes de problemas
O(1) < O(log (n)) < O(n) < O(nlog (n)) < O(n2 ) < O(n3 ) <
O(2n )
O(1): ordem constante
O(log (n)): ordem logaritmica
O(n): ordem linear
O(nlog (n)): ordem tı́pica de soluções em “pedaços”, e.g.,
árvores
O(n2 ): ordem quadrática. “um laço dentro de outro”
O(2n ): ordem exponencial. Impraticável.
35/1
Classes de problemas
O(1) < O(log (n)) < O(n) < O(nlog (n)) < O(n2 ) < O(n3 ) <
O(2n )
O(1): ordem constante
O(log (n)): ordem logaritmica
O(n): ordem linear
O(nlog (n)): ordem tı́pica de soluções em “pedaços”, e.g.,
árvores
O(n2 ): ordem quadrática. “um laço dentro de outro”
O(2n ): ordem exponencial. Impraticável.
O(n!): ordem fatorial. Pior que exponencial.
35/1
Exercı́cio: maior valor de um vetor
Qual é a função que descreve o custo e a ordem de crescimento de
pior caso do seguinte algoritmo?
1
2
3
4
5
6
7
8
9
10
11
12
13
// E n t r a d a : v e t o r com n úmeros i n t e i r o s
// S aı́ d a : m a i o r v a l o r do v e t o r
i n t max ( i n t a [ ] ) {
i n t i , maior ;
maior = a [ 0 ] ;
f o r ( i = 1 ; i < a . l e n g t h ; i ++){
i f ( maior < a [ i ] ) {
maior = a [ i ] ;
}
}
r e t u r n ( maior ) ;
}
36/1
Exercı́cio: busca número em vetor
Qual é a função que descreve o custo e a ordem de crescimento de
pior caso do seguinte algoritmo?
1 // E n t r a d a : a [] − v e t o r o r d e n a d o de n úmeros i n t e i r o s , n
− número s e n d o buscado , i n f − l i m i t e i n f e r i o r de
b u s c a no v e t o r a [ ] , s u p − l i m i t e s u p e r i o r de b u s c a
no v e t o r a [ ]
2 // S aı́ d a : f a l s e s e não e n c o n t r o u , t r u e c a s o c o n t r á r i o
3 p u b l i c s t a t i c boolean busca ( i n t a [ ] , i n t n , i n t i n f ,
i n t sup ) {
4 i f ( i n f > sup ) {
5
return ( false ) ;
6 } else {
7
i n t m = ( i n t ) ( i n f+s u p ) / 2 ;
8
i f ( a [m] == n )
9
return ( true ) ;
10
11
i f ( n> a [m] ) {
12
r e t u r n ( b u s c a ( a , n , m+1 , s u p ) ) ;
13
} else {
14
r e t u r n ( b u s c a ( a , n , i n f , m−1) ) ;
15
}
16
}
17 }
18 }
37/1
Download