Академический Документы
Профессиональный Документы
Культура Документы
Estruturas de Dados,
Análise de Algoritmos e
Complexidade Estrutural
§ D.E. Knuth
The art of computer programming
Vol. 3: Sorting and searching
Bibliografia complementar
§ A. Drozdek
Estrutura de dados e algoritmos em C++
§ N. Ziviani
Projeto de Algoritmos
§ Aulas de P. Feofiloff
www.ime.usp.br/~pf/analise_de_algoritmos/lectures.html
§ Simulação de algoritmos
www.cs.usfca.edu/~galles/visualization/Algorithms.html
www.cs.princeton.edu/courses/archive/spr10/cos226/lectures.html
www.jasonpark.me/AlgorithmVisualizer/?ref=producthunt
Primeiro bimestre
§ Ordem de funções
§ Algoritmos recursivos
§ Estruturas de dados elementares
§ Árvores balanceadas
§ Ordenação
§ Busca de padrões
§ Algoritmos em grafos
§ Paradigmas de programação
§ Algoritmos paralelos
1) Ordem de funções
7000
§ Execute esse programa 6000
com diversas instâncias do
Tempo (ms)
5000
problema (entradas com
valores e tamanhos 4000
variados). 3000
2000
§ Meça o tempo real dessas 1000
execuções. 0
0 50 100
§ Desenhe um gráfico com os Tamanho da entrada
resultados obtidos.
Tempo de execução
§ O tempo de execução de um
algoritmo varia (e normalmente
melhor caso cresce) com o tamanho da
caso médio
entrada do problema.
pior caso
120
§ Além disso, para instâncias de
100 mesmo tamanho, também há
Tempo de execução
80
variação no tempo de execução.
60
§ Geralmente, o tempo médio é
difícil de determinar.
40
§ Costuma-se estudar os tempos
20
máximos (pior caso):
0
1000 2000 3000 4000 § é mais fácil de analisar;
Tamanho da entrada
§ é crucial para a qualidade das
aplicações.
Análise teórica de complexidade
§ Exemplos de taxas de
crescimento: 1E+30
1E+28 Cúbica
§ Linear ≈ n 1E+26
1E+24 Quadrática
§ Quadrática ≈ n2 1E+22
Linear
1E+20
§ Cúbica ≈ n3 1E+18
T (n )
1E+16
1E+14
1E+12
§ No gráfico log-log ao 1E+10
1E+8
lado, a inclinação da 1E+6
1E+4
reta corresponde à 1E+2
1E+0
taxa de crescimento 1E+0 1E+2 1E+4 1E+6 1E+8 1E+10
da função.
n
Taxas de crescimento
§ Exemplos:
§ 102n + 105: é uma função linear
§ 105n2 + 108n: é uma função quadrática
§ 10-9n3 + 1020n2: é uma função cúbica
Notação O (Big-Oh)
100
§ Exemplo: 2n + 10 é O(n)
10
§ 2n + 10 ≤ cn
§ (c - 2)n ≥ 10 1
§ n ≥ 10/(c - 2) 1 10 100 1.000
n
§ Uma possível escolha: c = 3 e n0 = 10
10 n2 + 10 log n = 2 n2 – 3
Um exemplo
§ Qualquer c escolhido 10
poderia ser superado por
1
n: basta escolher n0 = c+1 1 10 100 1.000
n
Outros exemplos
13
16
19
22
25
28
31
34
1
200.000
Sim!
150.000
100.000
50.000 f(n)
20 n2
0
1
7
10
13
16
19
22
25
28
31
34
n
5.000
4 n2
4.000
Sim?
3.000
2.000 2 n2
Será???
1.000 f(n)
-
1
10
13
16
19
22
25
28
31
34
n
90.000
80.000
70.000
4 n2
60.000
Não!!!
50.000
40.000
30.000 2 n2
20.000
f(n)
10.000
-
1
13
25
37
49
61
73
85
97
3
10
12
13
n
O(n3)
O(n2)
O(n)
Algumas dicas sobre a notação O
§ No uso da notação O, consideramos apenas
valores suficientemente grandes de n, ou seja,
n®∞
§ Se p(n) é um polinômio de grau k, então p(n) é
O(nk)
§ Pode-se descartar seus termos de menor ordem,
inclusive as constantes.
§ Convém utilizar a menor ordem:
§ “2n é O(n)” é preferível a “2n é O(n2)”
§ “3n + 5 é O(n)” é preferível a “3n + 5 é O(3n)”
Exemplos
5
log2 N
4
Tempo de execução
2 log N
C
1
0
0
0
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
10
Entrada: N
Constante: c Logarítimico: log N Log- quadrado: log2 N
Comparações entre funções
90
N log N
80
Tempo de execução
70
60
50 N
40
30
20
10
log2 N
log N
0 Constante
0 1 5 10 15 20 25 30 35 40 45 50
Entrada: N
Constante: c Logarítmico: log N Log-quadrado: log2 N Linear: N N log N
Comparações entre funções
35000
30000
Tempo de execução
25000
20000 2N
15000
10000
5000 N3
N2
0
0 1 5 10 15
Entrada: N
Quadrática: N2 Cúbica: N3 Exponencial: 2N
Comparações entre funções
§ A partir da notação O, é possível estabelecer
uma hierarquia entre as funções:
Constante O(1)
Logarítmica O(log n)
Linear O(n)
n.log n O(n.log n) Maior
ordem
Quadrática O(n2)
Cúbica O(n3)
Polinomial O(nk), com k ≥ 4
Exponencial O(kn), com k > 1
Evidentemente, as funções lineares, quadráticas e cúbicas
também são polinomiais ...
Análise assintótica de algoritmos
§ A análise assintótica de algoritmos descreve o tempo
de execução em notação O.
§ Para realizar a análise assintótica de um algoritmo:
§ Calcula-se o número de operações primitivas executadas
como função do tamanho da entrada.
§ Expressa-se esta função na notação O.
§ Exemplo:
§ O algoritmo arrayMax executa no máximo 6n-1 operações
primitivas.
§ Dizemos que o algoritmo arrayMax gasta tempo O(n), ou
seja, sua complexidade de tempo é linear.
Notação O na análise de algoritmos