Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Análise da Complexidade de
Algoritmos
(revisões)
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
www.fe.up.pt/∼rcamacho/cadeiras/AED2
Rui Camacho
LIACC/FEUP Universidade do Porto
rcamacho@fe.up.pt
Fevereiro 2005
Análise de Algoritmos
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
I Tempo e Espaço
I Exemplos
I Notação O()
Crescimento de funções
I Comparar crescimento
I Comparação de funções em
pontos particulares: muito Função Designação
dependente dos coeficientes c Constante
I Comparação relevante: taxas log N Logaritmo
de crescimento log2 N Quadrado do
I Avaliar taxa de crescimento Logaritmo
N Linear
I em funções com vários termos N log N N log N
o crescimento é determinado N2 Quadrática
pelo termo de crescimento N3 Cúbica
mais rápido 2N Exponencial
I Coeficientes constantes
influenciam o andamento
inicial
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Análise de Algoritmos
Considerações gerais
Regras
1. se T1(n) = O( f(n) ) e T2(n) = O( g(n) )
I T1(n) + T2(n) = max( O( f(n) ), O( g(n) ) )
I T1(n) * T2(n) = O( f(n) * g(n) )
2. se T(x) é um polinómio de grau n, T(x) = Θ (xn )
3. logk n = O(n), para qualquer k (logaritmos crescem devagar)
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Notação O(*)
Subsequência Máxima
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Subsequência Máxima
Número de operações
I Operações no ciclo
interior
I inicialização
Operações de incremento da soma:
k=i (N - tamanho do vector)
I teste k <= j
I incremento Número de ternos (i, j, k) com
1≤i≤j≤k≤N
da soma
é N (N-1) (N-2) /6
thisSum += logo O(N3 ) para o algoritmo
a[k]
I incremento Ciclos exteriores têm efeito multi-
plicativo sobre operações no ciclo
k++ interior
I Operações
dominantes O(N) operações em cada ciclo en-
caixado logo O(N3 ) para o algoritmo
I teste e
incrementos
I inicialização
Rui Camacho Algoritmos e Estruturas de Dados II – LEIC
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
/**
* Cubic maximum contiguous subsequence sum algorithm.
* seqStart and seqEnd represent the actual best sequence.
*/
public static int maxSubSum1(int [] a){
int maxSum = 0;
Novos Algoritmos
I Linear
I Requer melhor uso das
caracterı́sticas do problema
I Observações
I Quadrático
I Observação: soma
I Se Ai,j é uma
dassubsequências no ciclo interior subsequência com
é repetida custo negativo, Ai,q
I Cada soma pode ser obtida com q>j não é a
apartir da anterior subsequência máxima
I as subsequências
I o ciclo interior reduz-se
a 1 operação -tempo contı́guas da máxima
constante têm custo negativo
I quando se encontra
I passa-se de O(N3 ) para
O(N2 ) umasubsequência de
custo negativo pode
recomeçar-se a
pesquisa noelemento
Rui Camacho Algoritmos e Estruturas de Dados II – LEIC
seguinte
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Subsequência Máxima
– quadrático
/**
* Quadratic maximum contiguous subsequence sum algorithm.
* seqStart and seqEnd represent the actual best sequence.
*/
public static int maxSubSum2(int [] a){
int maxSum = 0;
/**
* Recursive maximum contiguous subsequence sum algorithm.
* Finds maximum sum in subarray spanning a[left..right].
* Does not attempt to maintain actual best sequence.
*/
private static int maxSumRec(int [] a, int left, int right){
int maxLeftBorderSum = 0, maxRightBorderSum = 0;
int leftBorderSum = 0, rightBorderSum = 0;
int center = ( left + right ) / 2;
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
/**
* Linear-time maximum contiguous subsequence sum algorithm.
* seqStart and seqEnd represent the actual best sequence.
*/
public static int maxSubSum3(int [] a){
int maxSum = 0;
int thisSum = 0;
Subsequência Máxima
– recursivo (métodos auxiliares)–
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Acesso Comentário
Pilha Apenas ao elemento mais recente Muito rápido
O(1)
Fila Apenas ao elemento menos recente Muito rápido
O(1)
Lista Ligada Qualquer item O(N)
Árvore de Qualquer item por nome ou ordem Caso médio; em árvores
Pesquisa O(log N) especiais é pior caso
Tabela de Qualquer item por nome Quase garantido
Dispersão O(1)
Fila de Acesso ao mı́nimo: O(1) Inserção: O(1) caso médio,
Prioridade Apagar mı́nimo: O(log N) O(log N) pior caso
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Subsequência Máxima
– recursivo (teste)–
maxSum = maxSubSum1(a);
System.out.println(”Max sum is ” +maxSum+ ”; it goes”
+ ” from ” + seqStart + ” to ” +seqEnd);
maxSum = maxSubSum2(a);
System.out.println(”Max sum is ” +maxSum+ ”; it goes”
+” from ” + seqStart + ” to ” + seqEnd );
maxSum = maxSubSum3(a);
System.out.println(”Max sum is ” + maxSum + ”; it goes”
+” from ” + seqStart + ” to ” + seqEnd );
maxSum = maxSubSum4(a);
System.out.println(”Max sum is ” + maxSum);
}
}
Revisões – Java
Revisões – Complexidade
Revisões – Árvores Binárias de Pesquisa
Pesquisa Binária
import Supporting.*;
import Exceptions.*;
import Supporting.Comparable;
if(a[mid].compares(x) < 0)
low = mid + 1;
else if(a[mid].compares(x) ¿ 0)
high = mid - 1;
else return mid;
}