Beruflich Dokumente
Kultur Dokumente
Joo Pascoal Faria (verso original) Ana Paula Rocha (verso 2003/2004) Lus Paulo Reis (verso 2005/2006)
Introduo
Algoritmo: conjunto claramente especificado de instrues a seguir para resolver um problema Anlise de algoritmos:
provar que um algoritmo est correcto determinar recursos exigidos por um algoritmo (tempo, espao, etc.)
comparar os recursos exigidos por diferentes algoritmos que resolvem o mesmo problema (um algoritmo mais eficiente exige menos recursos para resolver o mesmo problema) prever o crescimento dos recursos exigidos por um algoritmo medida que o tamanho dos dados de entrada cresce
Complexidade temporal de um programa ou algoritmo: tempo que demora a executar (tempo de execuo)
T(n) - tempo de execuo em funo do tamanho (n) da entrada
Notao de O grande
Na prtica, difcil (seno impossvel) prever com rigor o tempo de execuo de um algoritmo ou programa
Para obter o tempo a menos de:
constantes multiplicativas (normalmente estas constantes so tempos de execuo de operaes atmicas) parcelas menos significativas para valores grandes de n
Identificam-se as operaes dominantes (mais frequentes ou muito mais demoradas) e determina-se o nmero de vezes que so executadas (e no o tempo de cada execuo, que seria uma constante multiplicativa) Exprime-se o resultado com a notao de O grande
4
Notao de O grande
Definio: T(n) = O(f(n)) (ler: T(n) de ordem f(n)) se e s se existem constantes positivas c e n0 tal que T(n) cf(n) para todo o n>n0 Exemplos:
ck nk + ck-1 nk-1 + + c0 = O(nk) log2 n = O(log n)
(no se indica a base porque mudar de base multiplicar por constante)
(ci - constantes)
4 = O(1)
n log n
(constante)
Termo Dominante
Suponha que se usa N3 para estimar N3+350N2 + N Para N = 10000
Valor real = 1 003 500 010 000 Valor estimado = 1 000 000 000 000 Erro = 0.35% (no significativo)
InsertionSort(v, n) :
faz InsertSorted(,1,), InsertSorted(,2,), ...,
InsertSorted(,n-1,)
10
Melhor caso:
n n/2 n/2 n/4 n/4 n/4
n
... 1 1
n-2 n-3
1+log 2 n
n/4
...
1 1 1 1 1 1 1 1
profundidade de recurso: 1+log 2 n (sem contar com a possibilidade de um profundidade de recurso: n elemento ser excludo dos sub-arrays tempo de execuo total (somando esquerdo e direito) totais de linhas): tempo de execuo total (uma vez que a soma de cada linha n): T(n) = O[n+n+(n-1) + ... +2] T(n) = O[(1+log2n) n] = O(n log n) = O[n+(n-1)(n + 2)/2] = O(n2)
12
13
Insertion sort
Mtodo de ordenao por partio (quick sort) na prtica o mais eficiente, excepto para arrays pequenos (at cerca 20 elementos), em que o mtodo de ordenao por insero (insertion sort) melhor!
14
16
17
Como melhorar
Remover um ciclo Ciclo mais interior no necessrio thisSum para prximo j pode ser calculado facilmente a partir do antigo valor de thisSum
18
template <class Comparable> Comparable maxSubSum2(const vector<Comparable> &vec) { Comparable maxSum = 0; for (int i = 0 ; i < vec.size(); i++) { Comparable thisSum = 0; for (int j = i; j < vec.size(); j++) { thisSum += vec[j]; if (thisSum > maxSum) maxSum = thisSum; } } return maxSum; }
19
possivel melhorar?
Algoritmo linear melhor : tempo de execuo proporcional a tamanho de entrada (difcil fazer melhor)
Se Aij uma subsequncia com custo negativo, Aiq com q>j no a subsequncia mxima
20
10
template <class Comparable> Comparable maxSubSum3(const vector<Comparable> &vec) { Comparable thisSum = 0, maxSum = 0; for (int j=0; j < vec.size(); j++) { thisSum += vec[j]; if (thisSum > maxSum) maxSum = thisSum; else if (thisSum < 0) thisSum = 0; return maxSum; }
21
Calcula as trs hipteses e determina o mximo a) e b) calculados recursivamente c) realizado em dois ciclos:
percorrer a 1 metade da direita para a esquerda, comeando no ltimo elemento percorrer a 2 metade da esquerda para a direita, comeando no primeiro elemento
22
11
23
12
25
13