SlideShare ist ein Scribd-Unternehmen logo
1 von 9
Downloaden Sie, um offline zu lesen
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

Introdução à Análise de Algoritmos
Quanto tempo leva a execução de determinado algoritmo?
Quando temos dois algoritmos que fazem a mesma coisa, qual deles leva menos tempo?
A análise do algoritmo preocupa-se com as questões acima.
É sempre conveniente conhecer ou ter uma medida da eficiência de um algoritmo ao
programá-lo.
O comportamento de alguns algoritmos
Raízes de equação do 2. grau
void raiz(double a,double b,double c,double *x1,double *x2){
...
*x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
*x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
}
Se desconsiderarmos os casos particulares (delta negativo, a=0, etc.), esse algoritmo realiza
sempre o mesmo número de operações.
Podemos afirmar então que o tempo que esse algoritmo leva é uma constante.
t = k
Máximo de uma seqüência de n elementos
float max(float a[], int N) {
int i; float m;
m=a[0];
for (i = 1;i < N; i++) if (m < a[i]) m = a[i];
return m;
}
Esse algoritmo sempre repete um conjunto de operações N-1 vezes.
Podemos afirmar então que seu tempo é proporcional a N-1 mais uma constante.
t = k1 + k2*(N-1)
Conta a quantidade de nulos num vetor de N elementos
int nulos(float a[], int N) {
int i, c;
c = 0;
for (i = 0; i < N; i++) if (a[i]) == 0) c++;
return c;
}
Idem ao anterior. Repetindo N vezes. Portanto o seu tempo é da forma:
Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

t = k1 + k2*N

Verifica se dois vetores de N elementos são iguais
/* devolve 1 se
int compara(int
int i;
for (i = 0;
if (a[i]
return 1;
}

iguais e 0 se diferentes */
a[], int b[], int N) {
i < N; i++)
!= b[i]) return 0;

Neste caso o resultado depende dos dados, pois termina no primeiro elemento diferente
encontrado. No pior caso (todos iguais ou o último diferente) também é proporcional a N.
t = k1+k2*N
Conta os algarismos significativos de um inteiro
int num_algar(int x) {
int c=0;
while (x != 0) {c++; x = x / 10;}
return c;
}
outra forma:
int num_algar(int x) {
int c;
for (c = 0; x > 0; c++, x = x / 10;)
return c;
}
O resultado c é o menor inteiro maior que log x (base 10).
10c-1 <= x <= 10c
O tempo é então proporcional a log x.
t = k1+k2*log(x)
Conta quantos bits significativos tem um inteiro
int num_bits(int x) {
int c=0;
while (x != 0) {c++; x = x / 2;}
return c;
}

Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

outra forma:
int num_bits(int x) {
int c;
for (c = 0; x > 0; c++, x = x / 2;)
return c;
}
O resultado c é o menor inteiro maior que lg x (base 2).
2c-1 <= x <= 2c
O tempo é então proporcional a lg x.
t = k1+k2*lg(x)
Notação:
log x - (base 10)
lg x - (base 2)
ln x - (base e) – logaritmo natural
Observe que podemos dizer que os dois últimos exemplos acima são proporcionais ao
logaritmo, sem mencionar a base, pois:
log N = lg N/lg 10 ou log N = k.lg N
Imprimir tabela de i / j (1<=i<=N; 1<=j<=M)
void imp_tabela (int N, int M) {
int i, j;
for (i = 1;i <= N; i++) {
for (j = 1;j <= M; j++)printf(”%8.3lf
printf(”n”);
}

”,(float)i/(float)j;

O tempo é proporcional a N*M. Um limitante superior é N*N, supondo N o maior deles.
t = k1+k2*N2.
Multiplicar matriz A[NxM] por vetor X[M]
Faça o algoritmo. São dois comandos for encaixados:
O tempo é proporcional a N*M. Um limitante superior é N*N, supondo N o maior deles.
t = k1+k2*N2.

Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

Idem imprimindo a tabela i*j*k (1<=i<=N; 1<=j<=M; 1<=k<=P)
Serão três comandos for encaixados. Neste caso será proporcional a N*M*P.
Podemos considerar N*N*N, supondo N o maior deles.
t = k1+k2*N3.
Multiplicar matriz A[NxM] por matriz X[MxP]
Faça o algoritmo. Serão três comandos for encaixados:
O tempo é proporcional a N*M*P. Um limitante superior é N*N*N, supondo N o maior
deles.
t = k1+k2*N3.
Proporcionalidade dos algoritmos anteriores:
Os algoritmos acima são proporcionais a:
1 – sempre executam as mesmas instruções uma só vez. Dizemos que o tempo de execução
neste caso é uma constante.
N – dependem apenas de um parâmetro que é o número de vezes que um determinado laço
é executado.
log N – Não importa a base, pois log N, lg N ou ln N são proporcionais. Assim não
vamos indicar a base. Vamos dizer apenas que o algoritmo leva um tempo logarítmico para
ser executado. Note também que um algoritmo com essa característica é muito interessante.
Quando N é 1.000 o tempo é proporcional a 3. Quando N fica 1.000 vezes maior
(1.000.000) o tempo apenas dobra (proporcional a 6).
N2 – em geral esses algoritmos têm um for encaixado em outro for. Quando N é 1.000, o
tempo é proporcional a 1.000.000. Quando N dobra o tempo multiplica por 4.
N3 - em geral possuem um for dentro dum um for dentro de um for. Quando N dobra, o
tempo se multiplica por 8.
Outros algoritmos podem ainda serem proporcionais a N.log N, ou exponenciais,
proporcionais a 2N ou 10N.

Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

Um pouco de intuição
É intuitivo que para valores de N grandes, quanto maior a ordem do expoente, mais tempo
leva o algoritmo.
1-constante

log N

N

N.log N

N2

N3

mais tempo

Sobre os algoritmos
O tempo depende dos dados em cada execução do algoritmo.
Pode ser que para um conjunto de dados o algoritmo A1 seja mais rápido que o A2. Para
outro conjunto o tempo pode se inverter.
Um algoritmo pode levar um tempo pequeno quando N é pequeno, mas demorar muito
quando N é grande. Por exemplo, um algoritmo que tem um tempo proporcional a N3.
Às vezes não interessa muito se o algoritmo leva um tempo maior ou menor, pois a
execução numa máquina é tão rápida que não faz diferença usarmos o algoritmo A1 ou A2.
O que realmente dá para se afirmar a respeito do tempo que um algoritmo vai demorar?
A notação O(f(N)) – Ordem de f(N) ou notação Grande-O
Para expressar essa idéia de tempo proporcional a alguma função, foi inventada a notação
O(f(N)) – Ordem de f(N) ou ainda notação Grande-O (big-O notation).
Definição:
Dizemos que g(N) é O(f(N)) se existirem constantes c0 e N0 tais que g(N) < c0f(N) para
todo N>N0. Ou seja, a partir de um determinado N, a função f(N) multiplicada por uma
constante é sempre maior que g(N). Veja o gráfico abaixo.
Outra forma é definir O(f(N)) como um conjunto:
O(f(N)) = { g(N) se existem constantes c0 e N0 tais que g(N) < c0f(N) para todo N>N0 }
Podemos dizer livremente que g(N) = O(f(N)), mas o mais correto é dizer:
g(N) é O(f(N)) ou g(N) ∈ O(f(N)).

Essa definição elimina os termos que contribuem em menor grau para o tempo total.
Também é usada para classificar os algoritmos por um limitante superior.
Veja que c0 e N0 escondem coisas importantes sobre o funcionamento do algoritmo:
Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13




Nada sabemos para N<N0.
c0 pode esconder uma enorme ineficiência do algoritmo – por exemplo, é melhor N2
nano-segundos que log N séculos.

Só interessa o termo de maior ordem.
O(1) é o mesmo que O(2) que é o mesmo que O(K) – constante
O(1+N+N2) é O(N2)
Observe que 1+N+N2 < N2+ N2+ N2 =3 N2 para N> N0
O(N.logN+N2) é O(N2)
Observe que N.logN+ N2 < N2+ N2 = 2 N2 para N>N0
Propriedades:
a) O(f(N)) + O(g(N)) é O(max{f(N), g(N)})
b) O(f(N)).O(g(N)) é O(f(N).g(N))
c) O(k.f(N)) é O(f(N)) desde que k ≠ 0

c0f(N)
g(N)

f(N)

N0

Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

Exemplo de análise de algoritmos
Vejamos um algoritmo simples e algumas características de sua análise.
Algoritmo de busca seqüencial:
/* procura x em a[0], a[1], ... a[N-1] */
int busca(int a[], int x, int N) {
for (i = 0; i < N; i++) if(a[i] == x) return i;
return -1;
}
Existem muitas variações deste algoritmo quando se programa em C, mas todas elas têm
que percorrer o vetor.
Quantas comparações são necessárias até encontrar o elemento procurado ou concluir que
ele não está na tabela?
Melhor caso: 1 - uma só comparação quando x == a[0].
Pior caso: N – quando não encontra ou x == a[N-1].
Caso médio: (1+N)/2 – média entre o pior e o melhor ?
Para considerarmos a média entre o melhor e o pior caso, estamos assumindo uma hipótese
importante. A probabilidade de ser qualquer valor entre 1 e N é a mesma.
De uma maneira geral, a determinação do pior caso dá uma boa informação de como o
algoritmo se comporta e oferece um limitante superior para o tempo que o algoritmo
demandará.
O caso médio é o mais interessante de ser determinado, mas nem sempre é possível, pois
muitas vezes depende de hipóteses adicionais sobre os dados.
Esse algoritmo é O(N) (linear). Para determinar a ordem supõe-se o pior caso.
Outro exemplo
Determinar qual o último elemento do vetor igual a x.
A melhor solução é a busca seqüencial do fim para o começo do vetor.
/* procura x em a[N-1], a[N-2], ... a[0] */
int busca(int a[], int x, int N) {
for (i = N - 1; i <= 0; i--) if(a[i] == x) return i;
return -1;
}
Uma solução menos eficiente seria procurar a partir do início do vetor.

Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

/* procura x em a[0], a[1], ... a[N-1] */
int busca(int a[], int x, int N) {
int k = -1;
for (i = 0; i < N; i++) if(a[i] == x) k=i;
return k;
}
Ambos são O(N), embora a primeira solução seja preferível à segunda. O pior caso de
ambas é o mesmo.
A notação O(f(N)) é a complexidade dos algoritmos
Como já vimos, a notação O(f(N)) ignora pontos importantes sobre o algoritmos:
Como ele funciona para N menores
Se vamos rodar num computador lento ou rápido
Mas do ponto de vista de complexidade, o que se pode afirmar e, portanto o que interessa
sobre o algoritmo é o seu comportamento assintótico, isto é, qual a curva que melhor
descreve o seu comportamento.
Veremos que existem algoritmos com vários comportamentos:
Constantes – O(1)
Lineares – O(N)
Quadráticos – O(N2)
Polinomiais – O(Nk)
Exponenciais - O(kN)
Logarítmicos – O(lg N) ou O(N.lg N)
Alguns exemplos
Vejamos os algoritmos acima:
Raízes de equação do 2. grau
O(1)
Máximo de uma seqüência de n elementos
O(N)
Conta a quantidade de nulos num vetor de N elementos
O(N)
Verifica se dois vetores de N elementos são iguais

Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13
Introdução à Análise de Algoritmos
Mac122 - Marcilio – Revisado 08Out13

O(N)
Conta os algarismos significativos de um inteiro
O(log N)
Conta quantos bits significativos tem um inteiro
O(log N)
Imprimir tabela de i/j (1<=i<=N; 1<=j<=M)
O(N.M) ou O(N2) se N > M
Multiplicar matriz A[NxM] por vetor X[M]
O(N.M) ou O(N2) se N > M
Idem imprimindo a tabela i*j*k (1<=i<=N; 1<=j<=M; 1<=k<=P)
O(N.M.P) ou O(N3) se N > M,P
Multiplicar matriz A[NxM] por matriz X[MxP]
O(N.M.P) ou O(N3) se N > M,P
Imprimir todos os números com N dígitos
O(10N)

Introdução à Análise de Algoritmos
MAC122 – Marcilio – Revisado 08Out13

Weitere ähnliche Inhalte

Was ist angesagt?

Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasDelacyr Ferreira
 
Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsortFlávio Freitas
 
Relações de recorrência
Relações de recorrênciaRelações de recorrência
Relações de recorrênciaPablo Silva
 
Análise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NPAnálise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NPDelacyr Ferreira
 
Programação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaProgramação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaGabriel Albuquerque
 
Apontamento quantica
Apontamento quanticaApontamento quantica
Apontamento quanticaRaiane Sodré
 
Método de Euler Progressivo
Método de Euler Progressivo Método de Euler Progressivo
Método de Euler Progressivo Rafael Lucas
 
Classes de problemas p, np,np completo e np-difícil
Classes de problemas p, np,np completo e np-difícilClasses de problemas p, np,np completo e np-difícil
Classes de problemas p, np,np completo e np-difícilGuilherme Coelho
 
Trabalho de Cálculo Numérico
Trabalho  de Cálculo NuméricoTrabalho  de Cálculo Numérico
Trabalho de Cálculo NuméricoItaylane Malta
 
Geração e Estimação de processos k-factor GARMA
Geração e Estimação de processos k-factor GARMAGeração e Estimação de processos k-factor GARMA
Geração e Estimação de processos k-factor GARMAAishameriane Schmidt
 
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsortFlávio Freitas
 

Was ist angesagt? (19)

000003 complexidade
000003 complexidade000003 complexidade
000003 complexidade
 
0001
00010001
0001
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de Recorrências
 
Algoritmo Shell Sort
Algoritmo Shell SortAlgoritmo Shell Sort
Algoritmo Shell Sort
 
Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsort
 
Relações de recorrência
Relações de recorrênciaRelações de recorrência
Relações de recorrência
 
[Choi oopsla99] apresentacao
[Choi oopsla99] apresentacao[Choi oopsla99] apresentacao
[Choi oopsla99] apresentacao
 
Análise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NPAnálise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NP
 
03 pid d
03 pid d03 pid d
03 pid d
 
Programação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaProgramação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma Máxima
 
Apontamento quantica
Apontamento quanticaApontamento quantica
Apontamento quantica
 
Método de Euler Progressivo
Método de Euler Progressivo Método de Euler Progressivo
Método de Euler Progressivo
 
If672cc mp1 sol
If672cc mp1 solIf672cc mp1 sol
If672cc mp1 sol
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Classes de problemas p, np,np completo e np-difícil
Classes de problemas p, np,np completo e np-difícilClasses de problemas p, np,np completo e np-difícil
Classes de problemas p, np,np completo e np-difícil
 
Trabalho de Cálculo Numérico
Trabalho  de Cálculo NuméricoTrabalho  de Cálculo Numérico
Trabalho de Cálculo Numérico
 
Passo adaptativo stiff
Passo adaptativo stiffPasso adaptativo stiff
Passo adaptativo stiff
 
Geração e Estimação de processos k-factor GARMA
Geração e Estimação de processos k-factor GARMAGeração e Estimação de processos k-factor GARMA
Geração e Estimação de processos k-factor GARMA
 
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsort
 

Andere mochten auch

Andere mochten auch (11)

Ordenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de ChavesOrdenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de Chaves
 
7 slides
7 slides7 slides
7 slides
 
Semana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresSemana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetores
 
Analise Algoritmos
Analise AlgoritmosAnalise Algoritmos
Analise Algoritmos
 
Metodo de Ordenação Selection sort
Metodo de Ordenação Selection sortMetodo de Ordenação Selection sort
Metodo de Ordenação Selection sort
 
Ordenação por inserção
Ordenação por inserçãoOrdenação por inserção
Ordenação por inserção
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetores
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise Assintótica
 
Algoritmos de busca
Algoritmos de buscaAlgoritmos de busca
Algoritmos de busca
 
Análise de Algoritmos
Análise de AlgoritmosAnálise de Algoritmos
Análise de Algoritmos
 
Ordenação
OrdenaçãoOrdenação
Ordenação
 

Ähnlich wie 13 introducao a analise de algoritmos

Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptssuserd654cb1
 
Artigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdfArtigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdfItaloRainier1
 
Algoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdfAlgoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdfCaiqueMiranda7
 
EDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdfEDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdfSimoneSantos16595
 
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NAAula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NACloves da Rocha
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracaoRicardo Bolanho
 
Metódos de Pesquisa em C
Metódos de Pesquisa em CMetódos de Pesquisa em C
Metódos de Pesquisa em Crodolfoeyalana
 
Relatório do projecto computacional grupo 72
Relatório do projecto computacional   grupo 72Relatório do projecto computacional   grupo 72
Relatório do projecto computacional grupo 72Rafael Lucas
 
03-Notacoes O omega teta Complexidade e Corretude.pdf
03-Notacoes O omega teta Complexidade e Corretude.pdf03-Notacoes O omega teta Complexidade e Corretude.pdf
03-Notacoes O omega teta Complexidade e Corretude.pdfYuri Passos
 
Criptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetoniCriptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetonidrbetoni
 
Trabalho de Cálculo numérico
Trabalho de Cálculo numéricoTrabalho de Cálculo numérico
Trabalho de Cálculo numéricoItaylane Malta
 
Ger numaleat(1)
Ger numaleat(1)Ger numaleat(1)
Ger numaleat(1)Iago Lira
 
Comparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de OrdenaçãoComparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de OrdenaçãoLenon Fachiano
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dadosgjpbg
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2Leandro Lopes
 
Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Thaci Santos
 

Ähnlich wie 13 introducao a analise de algoritmos (20)

Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
Artigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdfArtigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdf
 
Algoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdfAlgoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdf
 
EDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdfEDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdf
 
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NAAula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracao
 
Metódos de Pesquisa em C
Metódos de Pesquisa em CMetódos de Pesquisa em C
Metódos de Pesquisa em C
 
Relatório do projecto computacional grupo 72
Relatório do projecto computacional   grupo 72Relatório do projecto computacional   grupo 72
Relatório do projecto computacional grupo 72
 
03-Notacoes O omega teta Complexidade e Corretude.pdf
03-Notacoes O omega teta Complexidade e Corretude.pdf03-Notacoes O omega teta Complexidade e Corretude.pdf
03-Notacoes O omega teta Complexidade e Corretude.pdf
 
Aula2
Aula2Aula2
Aula2
 
Criptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetoniCriptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetoni
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
Trabalho de Cálculo numérico
Trabalho de Cálculo numéricoTrabalho de Cálculo numérico
Trabalho de Cálculo numérico
 
Ger numaleat(1)
Ger numaleat(1)Ger numaleat(1)
Ger numaleat(1)
 
Comparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de OrdenaçãoComparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de Ordenação
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 
Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.
 
Algoritmo0
Algoritmo0Algoritmo0
Algoritmo0
 

Mehr von Ricardo Bolanho

18 algoritmos de busca de palavras em texto
18   algoritmos de busca de palavras em texto18   algoritmos de busca de palavras em texto
18 algoritmos de busca de palavras em textoRicardo Bolanho
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de buscaRicardo Bolanho
 
16 algoritmos de busca em tabelas - hash
16   algoritmos de busca em tabelas - hash16   algoritmos de busca em tabelas - hash
16 algoritmos de busca em tabelas - hashRicardo Bolanho
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binariaRicardo Bolanho
 
14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelasRicardo Bolanho
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivasRicardo Bolanho
 
11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dadosRicardo Bolanho
 
10 alocacao dinamica - listas ligadas
10   alocacao dinamica - listas ligadas10   alocacao dinamica - listas ligadas
10 alocacao dinamica - listas ligadasRicardo Bolanho
 
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoriaRicardo Bolanho
 
7 alocacao sequencial - filas
7   alocacao sequencial - filas7   alocacao sequencial - filas
7 alocacao sequencial - filasRicardo Bolanho
 
6 alocacao sequencial - pilhas
6   alocacao sequencial - pilhas6   alocacao sequencial - pilhas
6 alocacao sequencial - pilhasRicardo Bolanho
 
5 expressoes logicas - operadores - base binaria - operadores de bits
5   expressoes logicas - operadores - base binaria - operadores de bits5   expressoes logicas - operadores - base binaria - operadores de bits
5 expressoes logicas - operadores - base binaria - operadores de bitsRicardo Bolanho
 
3 funcoes vetores matrizes
3   funcoes vetores matrizes3   funcoes vetores matrizes
3 funcoes vetores matrizesRicardo Bolanho
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocosRicardo Bolanho
 
Lógica para computação silva-finger-melo
Lógica para computação   silva-finger-meloLógica para computação   silva-finger-melo
Lógica para computação silva-finger-meloRicardo Bolanho
 
00 essential raymond murphy
00 essential raymond murphy00 essential raymond murphy
00 essential raymond murphyRicardo Bolanho
 

Mehr von Ricardo Bolanho (20)

18 algoritmos de busca de palavras em texto
18   algoritmos de busca de palavras em texto18   algoritmos de busca de palavras em texto
18 algoritmos de busca de palavras em texto
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de busca
 
16 algoritmos de busca em tabelas - hash
16   algoritmos de busca em tabelas - hash16   algoritmos de busca em tabelas - hash
16 algoritmos de busca em tabelas - hash
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binaria
 
14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelas
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivas
 
11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dados
 
10 alocacao dinamica - listas ligadas
10   alocacao dinamica - listas ligadas10   alocacao dinamica - listas ligadas
10 alocacao dinamica - listas ligadas
 
9 structs e ponteiros
9   structs e ponteiros9   structs e ponteiros
9 structs e ponteiros
 
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
 
7 alocacao sequencial - filas
7   alocacao sequencial - filas7   alocacao sequencial - filas
7 alocacao sequencial - filas
 
6 alocacao sequencial - pilhas
6   alocacao sequencial - pilhas6   alocacao sequencial - pilhas
6 alocacao sequencial - pilhas
 
5 expressoes logicas - operadores - base binaria - operadores de bits
5   expressoes logicas - operadores - base binaria - operadores de bits5   expressoes logicas - operadores - base binaria - operadores de bits
5 expressoes logicas - operadores - base binaria - operadores de bits
 
4 char e strings
4   char e strings4   char e strings
4 char e strings
 
3 funcoes vetores matrizes
3   funcoes vetores matrizes3   funcoes vetores matrizes
3 funcoes vetores matrizes
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
 
Lógica para computação silva-finger-melo
Lógica para computação   silva-finger-meloLógica para computação   silva-finger-melo
Lógica para computação silva-finger-melo
 
Projeto 2 aula 5
Projeto 2   aula 5Projeto 2   aula 5
Projeto 2 aula 5
 
Projeto 1 aula 4
Projeto 1   aula 4Projeto 1   aula 4
Projeto 1 aula 4
 
00 essential raymond murphy
00 essential raymond murphy00 essential raymond murphy
00 essential raymond murphy
 

13 introducao a analise de algoritmos

  • 1. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 Introdução à Análise de Algoritmos Quanto tempo leva a execução de determinado algoritmo? Quando temos dois algoritmos que fazem a mesma coisa, qual deles leva menos tempo? A análise do algoritmo preocupa-se com as questões acima. É sempre conveniente conhecer ou ter uma medida da eficiência de um algoritmo ao programá-lo. O comportamento de alguns algoritmos Raízes de equação do 2. grau void raiz(double a,double b,double c,double *x1,double *x2){ ... *x1 = (-b+sqrt(b*b-4*a*c))/(2*a); *x1 = (-b+sqrt(b*b-4*a*c))/(2*a); } Se desconsiderarmos os casos particulares (delta negativo, a=0, etc.), esse algoritmo realiza sempre o mesmo número de operações. Podemos afirmar então que o tempo que esse algoritmo leva é uma constante. t = k Máximo de uma seqüência de n elementos float max(float a[], int N) { int i; float m; m=a[0]; for (i = 1;i < N; i++) if (m < a[i]) m = a[i]; return m; } Esse algoritmo sempre repete um conjunto de operações N-1 vezes. Podemos afirmar então que seu tempo é proporcional a N-1 mais uma constante. t = k1 + k2*(N-1) Conta a quantidade de nulos num vetor de N elementos int nulos(float a[], int N) { int i, c; c = 0; for (i = 0; i < N; i++) if (a[i]) == 0) c++; return c; } Idem ao anterior. Repetindo N vezes. Portanto o seu tempo é da forma: Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 2. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 t = k1 + k2*N Verifica se dois vetores de N elementos são iguais /* devolve 1 se int compara(int int i; for (i = 0; if (a[i] return 1; } iguais e 0 se diferentes */ a[], int b[], int N) { i < N; i++) != b[i]) return 0; Neste caso o resultado depende dos dados, pois termina no primeiro elemento diferente encontrado. No pior caso (todos iguais ou o último diferente) também é proporcional a N. t = k1+k2*N Conta os algarismos significativos de um inteiro int num_algar(int x) { int c=0; while (x != 0) {c++; x = x / 10;} return c; } outra forma: int num_algar(int x) { int c; for (c = 0; x > 0; c++, x = x / 10;) return c; } O resultado c é o menor inteiro maior que log x (base 10). 10c-1 <= x <= 10c O tempo é então proporcional a log x. t = k1+k2*log(x) Conta quantos bits significativos tem um inteiro int num_bits(int x) { int c=0; while (x != 0) {c++; x = x / 2;} return c; } Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 3. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 outra forma: int num_bits(int x) { int c; for (c = 0; x > 0; c++, x = x / 2;) return c; } O resultado c é o menor inteiro maior que lg x (base 2). 2c-1 <= x <= 2c O tempo é então proporcional a lg x. t = k1+k2*lg(x) Notação: log x - (base 10) lg x - (base 2) ln x - (base e) – logaritmo natural Observe que podemos dizer que os dois últimos exemplos acima são proporcionais ao logaritmo, sem mencionar a base, pois: log N = lg N/lg 10 ou log N = k.lg N Imprimir tabela de i / j (1<=i<=N; 1<=j<=M) void imp_tabela (int N, int M) { int i, j; for (i = 1;i <= N; i++) { for (j = 1;j <= M; j++)printf(”%8.3lf printf(”n”); } ”,(float)i/(float)j; O tempo é proporcional a N*M. Um limitante superior é N*N, supondo N o maior deles. t = k1+k2*N2. Multiplicar matriz A[NxM] por vetor X[M] Faça o algoritmo. São dois comandos for encaixados: O tempo é proporcional a N*M. Um limitante superior é N*N, supondo N o maior deles. t = k1+k2*N2. Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 4. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 Idem imprimindo a tabela i*j*k (1<=i<=N; 1<=j<=M; 1<=k<=P) Serão três comandos for encaixados. Neste caso será proporcional a N*M*P. Podemos considerar N*N*N, supondo N o maior deles. t = k1+k2*N3. Multiplicar matriz A[NxM] por matriz X[MxP] Faça o algoritmo. Serão três comandos for encaixados: O tempo é proporcional a N*M*P. Um limitante superior é N*N*N, supondo N o maior deles. t = k1+k2*N3. Proporcionalidade dos algoritmos anteriores: Os algoritmos acima são proporcionais a: 1 – sempre executam as mesmas instruções uma só vez. Dizemos que o tempo de execução neste caso é uma constante. N – dependem apenas de um parâmetro que é o número de vezes que um determinado laço é executado. log N – Não importa a base, pois log N, lg N ou ln N são proporcionais. Assim não vamos indicar a base. Vamos dizer apenas que o algoritmo leva um tempo logarítmico para ser executado. Note também que um algoritmo com essa característica é muito interessante. Quando N é 1.000 o tempo é proporcional a 3. Quando N fica 1.000 vezes maior (1.000.000) o tempo apenas dobra (proporcional a 6). N2 – em geral esses algoritmos têm um for encaixado em outro for. Quando N é 1.000, o tempo é proporcional a 1.000.000. Quando N dobra o tempo multiplica por 4. N3 - em geral possuem um for dentro dum um for dentro de um for. Quando N dobra, o tempo se multiplica por 8. Outros algoritmos podem ainda serem proporcionais a N.log N, ou exponenciais, proporcionais a 2N ou 10N. Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 5. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 Um pouco de intuição É intuitivo que para valores de N grandes, quanto maior a ordem do expoente, mais tempo leva o algoritmo. 1-constante log N N N.log N N2 N3 mais tempo Sobre os algoritmos O tempo depende dos dados em cada execução do algoritmo. Pode ser que para um conjunto de dados o algoritmo A1 seja mais rápido que o A2. Para outro conjunto o tempo pode se inverter. Um algoritmo pode levar um tempo pequeno quando N é pequeno, mas demorar muito quando N é grande. Por exemplo, um algoritmo que tem um tempo proporcional a N3. Às vezes não interessa muito se o algoritmo leva um tempo maior ou menor, pois a execução numa máquina é tão rápida que não faz diferença usarmos o algoritmo A1 ou A2. O que realmente dá para se afirmar a respeito do tempo que um algoritmo vai demorar? A notação O(f(N)) – Ordem de f(N) ou notação Grande-O Para expressar essa idéia de tempo proporcional a alguma função, foi inventada a notação O(f(N)) – Ordem de f(N) ou ainda notação Grande-O (big-O notation). Definição: Dizemos que g(N) é O(f(N)) se existirem constantes c0 e N0 tais que g(N) < c0f(N) para todo N>N0. Ou seja, a partir de um determinado N, a função f(N) multiplicada por uma constante é sempre maior que g(N). Veja o gráfico abaixo. Outra forma é definir O(f(N)) como um conjunto: O(f(N)) = { g(N) se existem constantes c0 e N0 tais que g(N) < c0f(N) para todo N>N0 } Podemos dizer livremente que g(N) = O(f(N)), mas o mais correto é dizer: g(N) é O(f(N)) ou g(N) ∈ O(f(N)). Essa definição elimina os termos que contribuem em menor grau para o tempo total. Também é usada para classificar os algoritmos por um limitante superior. Veja que c0 e N0 escondem coisas importantes sobre o funcionamento do algoritmo: Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 6. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13   Nada sabemos para N<N0. c0 pode esconder uma enorme ineficiência do algoritmo – por exemplo, é melhor N2 nano-segundos que log N séculos. Só interessa o termo de maior ordem. O(1) é o mesmo que O(2) que é o mesmo que O(K) – constante O(1+N+N2) é O(N2) Observe que 1+N+N2 < N2+ N2+ N2 =3 N2 para N> N0 O(N.logN+N2) é O(N2) Observe que N.logN+ N2 < N2+ N2 = 2 N2 para N>N0 Propriedades: a) O(f(N)) + O(g(N)) é O(max{f(N), g(N)}) b) O(f(N)).O(g(N)) é O(f(N).g(N)) c) O(k.f(N)) é O(f(N)) desde que k ≠ 0 c0f(N) g(N) f(N) N0 Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 7. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 Exemplo de análise de algoritmos Vejamos um algoritmo simples e algumas características de sua análise. Algoritmo de busca seqüencial: /* procura x em a[0], a[1], ... a[N-1] */ int busca(int a[], int x, int N) { for (i = 0; i < N; i++) if(a[i] == x) return i; return -1; } Existem muitas variações deste algoritmo quando se programa em C, mas todas elas têm que percorrer o vetor. Quantas comparações são necessárias até encontrar o elemento procurado ou concluir que ele não está na tabela? Melhor caso: 1 - uma só comparação quando x == a[0]. Pior caso: N – quando não encontra ou x == a[N-1]. Caso médio: (1+N)/2 – média entre o pior e o melhor ? Para considerarmos a média entre o melhor e o pior caso, estamos assumindo uma hipótese importante. A probabilidade de ser qualquer valor entre 1 e N é a mesma. De uma maneira geral, a determinação do pior caso dá uma boa informação de como o algoritmo se comporta e oferece um limitante superior para o tempo que o algoritmo demandará. O caso médio é o mais interessante de ser determinado, mas nem sempre é possível, pois muitas vezes depende de hipóteses adicionais sobre os dados. Esse algoritmo é O(N) (linear). Para determinar a ordem supõe-se o pior caso. Outro exemplo Determinar qual o último elemento do vetor igual a x. A melhor solução é a busca seqüencial do fim para o começo do vetor. /* procura x em a[N-1], a[N-2], ... a[0] */ int busca(int a[], int x, int N) { for (i = N - 1; i <= 0; i--) if(a[i] == x) return i; return -1; } Uma solução menos eficiente seria procurar a partir do início do vetor. Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 8. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 /* procura x em a[0], a[1], ... a[N-1] */ int busca(int a[], int x, int N) { int k = -1; for (i = 0; i < N; i++) if(a[i] == x) k=i; return k; } Ambos são O(N), embora a primeira solução seja preferível à segunda. O pior caso de ambas é o mesmo. A notação O(f(N)) é a complexidade dos algoritmos Como já vimos, a notação O(f(N)) ignora pontos importantes sobre o algoritmos: Como ele funciona para N menores Se vamos rodar num computador lento ou rápido Mas do ponto de vista de complexidade, o que se pode afirmar e, portanto o que interessa sobre o algoritmo é o seu comportamento assintótico, isto é, qual a curva que melhor descreve o seu comportamento. Veremos que existem algoritmos com vários comportamentos: Constantes – O(1) Lineares – O(N) Quadráticos – O(N2) Polinomiais – O(Nk) Exponenciais - O(kN) Logarítmicos – O(lg N) ou O(N.lg N) Alguns exemplos Vejamos os algoritmos acima: Raízes de equação do 2. grau O(1) Máximo de uma seqüência de n elementos O(N) Conta a quantidade de nulos num vetor de N elementos O(N) Verifica se dois vetores de N elementos são iguais Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13
  • 9. Introdução à Análise de Algoritmos Mac122 - Marcilio – Revisado 08Out13 O(N) Conta os algarismos significativos de um inteiro O(log N) Conta quantos bits significativos tem um inteiro O(log N) Imprimir tabela de i/j (1<=i<=N; 1<=j<=M) O(N.M) ou O(N2) se N > M Multiplicar matriz A[NxM] por vetor X[M] O(N.M) ou O(N2) se N > M Idem imprimindo a tabela i*j*k (1<=i<=N; 1<=j<=M; 1<=k<=P) O(N.M.P) ou O(N3) se N > M,P Multiplicar matriz A[NxM] por matriz X[MxP] O(N.M.P) ou O(N3) se N > M,P Imprimir todos os números com N dígitos O(10N) Introdução à Análise de Algoritmos MAC122 – Marcilio – Revisado 08Out13