Você está na página 1de 5

Reviso e Introduo

Tipos de dados
ySimples: Caracteres (char), Inteiros (int), Reais (float), Booleanos (bool), ... yCompostos: Cadeias, Vetores, ...
y

Operao: Aritmticas, Insero, Remoo, Ordenao, Mximo, Mnimo, Inverso, Transposio, etc.

Tipos abstratos de dados


ySeparao conceitual entre implementao e utilizao de estruturas de dados yDados e operaes sobre os dados encapsuladas em um nico componente yE.g. Listas, Pilhas, rvores, Nmeros Complexos, ...

Avaliao de desempenho de um algoritmo


Mtodos Empricos
y y

Dificuldade para reproduzir experimentos (ambientes multitarefa, compiladores, sistemas operacionais, etc). Necessidade de implementao do algoritmo.

Mtodos Analticos
y y y

Aproximaes atravs de modelos matemticos. No depende de implementaes. Resultados podem no ser relevantes na prtica.

Anlise de complexidade de algoritmos (introduo bastante informal)


y y y y y y

Estimativa do tempo de execuo (passos - operaes atmicas) Tamanho de um problema Pior caso, melhor caso e caso mdio Anlise assinttica Ordem O, Omega e Theta (link interessante) Algumas classes importantes de funes: o O(1) - Constante o O(logn) - Logartmico o O(n) - Linear ou Polinomial de Ordem 1 o O(n) - Polinomial de Ordem 2 o O(n) - Polinomial de Ordem 3 n o O(2 ) - Exponencial

Algoritmo A B C D

Complexidade f(n)=1000 f(n)=200logn f(n)=50n f(n)=n


n

2 1000 200 100 4 4

10 1000 600 500 100 1024

100 1000 ~ 1.200 5.000 10.000 10


30

10.000 1000 ~ 2.600 500.000 100.000.000 103010

E f(n)=2 Observaes
y y y

1 dia ~ 1014 ns 1 ano ~ 1016ns 2000 anos ~ 10 19 ns Grfico ilustrando comportamento assinttico de certas classes de funes

Para gerar o grfico acima utilizando o SciLab faa download do arquivo assintotico.sci e execute-o utilizando o comando exec(assintotico.sci) Exemplo: Algoritmo: Busca Elemento Entrada: S[1],...,S[n] e elemento x a ser procurado. Saida: Booleano indicando se x est ou no no vetor. FuncaoBusca(S[],x) para i:=1,...,n faca ; c1

se S[i] = x entao retorna Sim retorna No

; c2 ; c3 ; c4

Complexidade melhor caso = O(1) Complexidade pior caso = O(n) Complexidade caso mdio = O(n) [demonstrao utiliza estatstica]. Clculo pior caso: f(n) = (n+1)*c1 + n*c2 + 0*c3 + 1*c4 ; c1=c2=...cm = 1 = (n+1)*1 + n*1 + 0 +1 = 2n + 2 = O(n) Prova: c = 3 e n' = 2 Clculo melhor caso: f(n)=1+1+1+0=3=O(1) Algumas das propriedades das funes O (Big O) Se f = O(g) e g = O(h) entao f = O(h) n = O(n) n = O(n) logn = O(n) 1 = O(n) n = O(2^n) O(g+h) = O(g) + O(h) O(kg) = kO(g) = O(g) f = 3n + n^3 + logn = O(n) + O(n) + O(logn) = O(n)+O(n)+O(n) = 3O(n) = O(n).

Algoritmos timos
O Limite inferiorg de um problema P uma funo tal que a complexidade (no pior caso), de qualquer algoritmo que resolva o problema P, est limitada inferiormente, assintoticamente, pela funo g. (denota-se por Omega(g) a classe de funes limitadas inferiormente por g). Qualquer algoritmo com complexidade O(g) chamado de timo (sempre em relao a algum problema P). Note que o algoritmo timo est limitado superiormente (big O) e inferiormente (Omega) por g.

Resultados e constataes interessantes (que sero aprofundadas em disciplinas especficas na rea da teoria da computao):
y y

Existem algoritmos timos para alguns problemas importantes. Existem problemas importantes inerentemente exponenciais.

Existem problemas importantes para os quais no se conhece algoritmos que no sejam exponenciais, embora tambm no se tenha demonstrado a impossibilidade desses algoritmos existirem.

Outro exemplo de clculo de complexidade


Algoritmo: Ordenao por insero. Entrada: S[1]...S[n] Saida: Vetor S ordenado.

funcaoOrdenacao-por-Insercao(S) para j:=2,...,n faca ; c1 chave := S[j] ; c2 i := j - 1 ; c3 enquanto i > 0 e S[i] > chave faca ; c4 S[i+1] := S[i] ; c5 i := i - 1 ; c6 A[i+1] := chave ; c7

void Ordena(int * S, int n) { intchave,i,j; for(j=2;j<=n;++j) { chave = S[j]; i = j - 1; while(i>0 && S[i]>chave) { S[i+1] = S[i]; --i; } S[i+1] = chave; } }

Exemplo Execuo: _5 2* 4 6 1 3 2 _5 4* 6 1 3 2 4 5 _6* 1 3 _2 4 5 6 1* 3 1 2 _4 5 6 3* 1 2 3 4 5 6 Complexidade do melhor caso: (while sempre falha) c1*n + c2*(n-1) + c3*(n-1) + c4*Sum(j:=2,...,n de t(j)) + c5*Sum(j:=2,....n de t(j)-1) + c6*Sum(...,t(j)-1) + c7*(n-1) = n+3*(n-1)+Sum(t(j))+2*Sum(t(j)-1) = Melhor caso: t(j) = 1 para j:=2,...n por isto Sum(t(j)) = Sum(j:=2,...,n de 1) = n - 1 Sum(t(j)-1) = Sum(0) = 0 n+3n-3+(n-1)+(n-2) = 6n-6 = O(n)

Complexidade no pior caso: (while falha em i >0) Apenas t(j) muda. t(j) = j , para j := 2,...,n Sum(j:=2,...,n de j) = Sum(j:=1,...,n de j) - 1 = n/2*(n+1)-1 Sum(j:=2,...,n de j-1) = Sum(j:=1,...,n-1 de j) = n*(n-1)/2