Você está na página 1de 41

Anlise de Algoritmos

Parte 1
Prof. Tlio Toffolo
http://www.toffolo.com.br

BCC202 Aula 04
Algoritmos e Estruturas de Dados I

Horrios de monitoria (correo)


Monitor: Diego Cotta Silveira
HORRIO
08h56509h
09h56510h
10h56511h
11h56512h
12h56513h
13h56514h
14h56515h
15h56516h
16h56517h
17h56518h
18h56519h
19h56520h
20h56521h

SEGUNDA

TERA

QUARTA

Monitoria
Monitoria
Monitoria
Monitoria
Monitoria
Monitoria

QUINTA

SEXTA

SBADO

Monitoria
Monitoria
Monitoria
Monitoria
Monitoria
Monitoria

Qual a diferena entre um


algoritmo e um programa?

Como escolher o algoritmo mais


adequado para uma situao?

Anlise de Algoritmos
Analisar um algoritmo consiste em verificar o que?
Tempo de Execuo
Espao/memria ocupada

Esta anlise necessria para escolher o algoritmo mais


adequado para resolver um dado problema.
especialmente importante em reas como pesquisa
operacional, otimizao, teoria dos grafos, estatstica,
probabilidades, entre outras.
5

Clculo do Custo
Clculo do Custo pela Execuo do Algoritmo
Tal medidas bastante inadequada e o resultado no
pode ser generalizado;
Os resultados so dependentes do compilador, que pode
favorecer algumas construes em detrimento de outras;
Os resultados dependem do hardware;
Quando grandes quantidades de memria so utilizadas, as
medidas de tempo podem depender deste aspecto.

Clculo do Custo
Clculo do Custo pela Execuo do Algoritmo
Apesar disso, h argumentos a favor de se obterem
medidas reais de tempo.
Ex.: quando h vrios algoritmos distintos para resolver um
mesmo tipo de problema, todos com um custo de execuo
dentro de uma mesma ordem de grandeza.

Anlise de Algoritmos
Possibilidade de analisar:
Um algoritmo particular.
Uma classe de algoritmos.

Anlise de Algoritmos
Anlise de um algoritmo particular.
Qual o custo de usar um dado algoritmo para
resolver um problema especfico?
Caractersticas que devem ser investigadas:
Anlise do nmero de vezes que cada parte do
algoritmo deve ser executada (tempo)
Estudo da quantidade de memria necessria
(espao).

Anlise de Algoritmos
Anlise de uma classe de algoritmos.
Qual o algoritmo de menor custo possvel para
resolver um problema particular?
Toda uma famlia de algoritmos investigada.
Procura-se identificar um que seja o melhor possvel.
Coloca-se limites para a complexidade computacional
dos algoritmos pertencentes classe.

10

Custo de um Algoritmo
O menor custo possvel para resolver problemas de uma
classe nos d a dificuldade inerente para resolver o problema.
Quando o custo de um algoritmo igual ao menor
custo possvel, o algoritmo timo para a medida de
custo considerada.
Podem existir vrios algoritmos timos para resolver o mesmo
problema.
Se a mesma medida de custo aplicada a diferentes
algoritmos, ento possvel compar-los e escolher o mais
adequado.
11

Custo de um Algoritmo
Utilizaremos um modelo matemtico baseado em um
computador idealizado.
Deve ser especificado o conjunto de operaes e seus
custos de execues.
mais usual ignorar o custo de algumas operaes e
considerar apenas outras mais significativas.
Ex.: algoritmos de ordenao. Consideramos o nmero
de comparaes entre os elementos do conjunto a ser
ordenado e ignoramos as demais operaes.
12

Funo de complexidade
Para medir o custo de execuo de um algoritmo vamos
definir uma funo de complexidade ou funo de
custo f.
Funo de complexidade de tempo: f(n) mede o
tempo necessrio para executar um algoritmo em um
problema de tamanho n.
Funo de complexidade de espao: f(n) mede a
memria necessria para executar um algoritmo em um
problema de tamanho n.
13

Funo de complexidade
Utilizaremos f para denotar uma funo de
complexidade de tempo daqui para a frente.
A complexidade de tempo na realidade no representa
tempo diretamente
Representa o nmero de vezes que determinadas operaes
relevantes so executadas.

14

Exemplo: maior elemento


Considere o algoritmo para encontrar o maior elemento de um vetor
de inteiros A[n]; n 1.
int Max(int* A, int n) {
int i, Temp;

Temp = A[0];
for (i = 1; i < n; i++)
if (Temp < A[i])
Temp = A[i];
return Temp;
}

Seja f uma funo de complexidade tal que f(n) o nmero de


comparaes envolvendo os elementos de A, se A contiver n
elementos.
Qual a funo f(n)?
15

Exemplo: maior elemento


Teorema: Qualquer algoritmo para encontrar o maior
elemento de um conjunto com n elementos, n 1, faz pelo
menos n -1 comparaes.
Prova: Cada um dos n - 1 elementos tem de ser investigado
por meio de comparaes, que menor do que algum outro
elemento.
Logo, n-1 comparaes so necessrias.

O teorema acima nos diz que, se o nmero de


comparaes for utilizado como medida de custo,
ento a funo Max do programa anterior tima.
16

Tamanho da entrada de dados


A medida do custo de execuo de um algoritmo
depende principalmente do tamanho da entrada
dos dados.
comum considerar o tempo de execuo de um
programa como uma funo do tamanho da entrada.
Para alguns algoritmos, o custo de execuo uma
funo da entrada particular dos dados, no apenas do
tamanho da entrada.

17

Tamanho da entrada de dados


No caso da funo Max do programa do exemplo, o
custo uniforme sobre todos os problemas de
tamanho n.
J para um algoritmo de ordenao isso no
ocorre: se os dados de entrada j estiverem quase
ordenados, ento pode ser que o o algoritmo trabalhe
menos.

18

Melhor caso, pior caso e caso mdio


Melhor caso: menor tempo de execuo sobre todas as
entradas de tamanho n.
Pior caso: maior tempo de execuo sobre todas as
entradas de tamanho n.
Caso mdio (ou caso esperado): mdia dos tempos de
execuo de todas as entradas de tamanho n.

Melhor caso <= Caso mdio <= Pior caso


19

Anlise do melhor caso, pior caso e caso mdio


Na anlise do caso mdio esperado, supe-se uma distribuio
de probabilidades sobre o conjunto de entradas de tamanho n
e o custo mdio obtido com base nessa distribuio.
A anlise do caso mdio geralmente muito mais difcil de
obter do que as anlises do melhor e do pior caso.

comum supor uma distribuio de probabilidades em que todas


as entradas possveis so igualmente provveis.
Na prtica isso nem sempre verdade.

20

Exemplo: registros de um arquivo


Considere o problema de acessar os registros de um
arquivo.
Cada registro contm uma chave nica que utilizada
para recuperar registros do arquivo.
O problema: dada uma chave qualquer, localize o
registro que contenha esta chave.
O algoritmo de pesquisa mais simples o que faz a
pesquisa sequencial.

21

Exemplo: registros de um arquivo


Seja f uma funo de complexidade f(n)
Seja f(n) o nmero de registros consultados no arquivo
(nmero de vezes que a chave de consulta comparada
com a chave de cada registro).

Melhor caso:
O registro procurado o primeiro consultado !!!
f(n) = 1

22

Exemplo: registros de um arquivo


Pior caso:
registro procurado o ltimo consultado ou no est presente no
arquivo;
f(n) = n

Caso mdio:
O caso mdio nem sempre to simples de calcular;
Como faremos neste problema???

23

Exemplo: registros de um arquivo


No estudo do caso mdio, vamos considerar que toda
pesquisa recupera um registro.
Se pi for a probabilidade de que o i-simo registro seja
procurado, e considerando que para recuperar o i-simo
registro so necessrias i comparaes, ento:
f(n) = 1 x p1 + 2 x p2 + 3 x p3 + ... + n x pn

24

Exemplo: registros de um arquivo


Para calcular f(n) basta conhecer a distribuio de
probabilidades pi.
Se cada registro tiver a mesma probabilidade de ser
acessado que todos os outros, ento

pi = 1/n, 1 i n

25

Exemplo: registros de um arquivo


Para calcular f(n) basta conhecer a distribuio de
probabilidades pi.

pi = 1/n, 1 i n
A anlise do caso esperado revela que uma pesquisa com
sucesso examina aproximadamente metade dos
registros.

26

Exemplo: registros de um arquivo


Melhor caso:
O registro procurado o primeiro consultado !!!
f(n) = 1

Pior caso:
registro procurado o ltimo consultado ou no est presente no
arquivo;
f(n) = n

Caso mdio:
f(n) = (n+1)/2

27

Exemplo: maior e menor elemento (1)


Considere o problema de encontrar o maior e o menor elemento de
um vetor de inteiros A[n]; n 1.
Um algoritmo simples pode ser derivado do algoritmo apresentado
no programa para achar o maior elemento.
void MaxMin1(int* A, int n, int* pMax, int* pMin) {
int i;
*pMax = A[0];
*pMin = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax)
*pMax = A[i];
if (A[i] < *pMin)
*pMin = A[i];
}
}
28

Qual a funo de complexidade?

void MaxMin1(int* A, int n, int* pMax, int* pMin) {


int i;

*pMax = A[0];
*pMin = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax)
*pMax = A[i];
2*(n-1)
if (A[i] < *pMin)
*pMin = A[i];
}
}

29

Qual a funo de complexidade?


Seja f(n) o nmero de comparaes entre os elementos de A, se A
contiver n elementos.
Logo f(n) = 2(n-1) para n > 0, para o melhor caso, pior caso e
caso mdio.
void MaxMin1(int* A, int n, int* pMax, int* pMin) {
int i;
*pMax = A[0];
*pMin = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax)
*pMax = A[i];
if (A[i] < *pMin)
*pMin = A[i];
}
}
30

Exemplo: maior e menor elemento (2)


MaxMin1 pode ser facilmente melhorado: a comparao
A[i] < *pMin s necessria quando a comparao A[i]
> *pMax d falso.
void MaxMin2(int* A, int n, int* pMax, int* pMin) {
int i;
*pMax = A[0];
*pMin = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax)
*pMax = A[i];
else if (A[i] < *pMin)
*pMin = A[i];
}
}

31

Qual a funo de complexidade?


Melhor caso:
quando os elementos esto em ordem crescente;
f(n) = n 1

Pior caso:
quando o maior elemento o primeiro no vetor;
f(n) = 2(n 1)

Caso mdio:
No caso mdio, A[i] maior do que Max a metade das vezes.
f(n) = 3n/2 3/2

32

Exemplo: maior e menor elemento (3)


Considerando o nmero de comparaes realizadas, existe a
possibilidade de obter um algoritmo mais eficiente:
1. Compare os elementos de A aos pares, separando-os em dois
subconjuntos (maiores em um e menores em outro), a um custo de
n/2 comparaes.
2. O mximo obtido do subconjunto que contm os maiores
elementos, a um custo de n/2 -1 comparaes
3. O mnimo obtido do subconjunto que contm os menores
elementos, a um custo de n/2 -1 comparaes

33

Exemplo: maior e menor elemento (3)


Os elementos de A so comparados dois a dois. Os elementos
maiores so comparados com *pMax e os elementos menores so
comparados com *pMin.
Quando n mpar, o elemento que est na posio A[n-1]
duplicado na posio A[n] para evitar um tratamento de exceo.
Para esta implementao:

no pior caso, melhor caso e caso mdio

34

Exemplo: maior e menor elemento (3)


void MaxMin3(int* A, int n, int* pMax, int* pMin) {
int i, FimDoAnel;

if ((n % 2) > 0) { A[n] = A[n-1]; FimDoAnel = n; }
else
{ FimDoAnel = n-1; }

if (A[0] > A[1]) { *pMax = A[0]; *pMin = A[1]; }
else
{ *pMax = A[1]; *pMin = A[0]; }

for (i=2; i<FimDoAnel; i+=2) {
if (A[i] > A[i+1]) {
if (A[i]
> *pMax) *pMax = A[i];
if (A[i+1] < *pMin) *pMin = A[i+1];
}
else {
if (A[i]
< *pMin) *pMin = A[i];
if (A[i+1] > *pMax) *pMax = A[i+1];
}
}
}

Comparao 1

Comparao 2
Comparao 3
Comparao 4
Comparao 3
Comparao 4

35

Qual a funo de complexidade?


Quantas comparaes so feitas em MaxMin3?
1. comparao feita 1 vez
2. comparao feita n/2 - 1 vezes
3. e 4. comparaes feitas n/2 1 vezes

f(n) = 1 + n/2 1 + 2 * (n/2 1)


f(n) = (3n 6)/2 + 1
f(n) = 3n/2 3 + 1 = 3n/2 - 2
36

Comparao entre os algoritmos MaxMin

A tabela apresenta uma comparao entre os algoritmos dos programas


MaxMin1, MaxMin2 e MaxMin3, considerando o nmero de comparaes
como medida de complexidade.
Os algoritmos MaxMin2 e MaxMin3 so superiores ao algoritmo MaxMin1.
O algoritmo MaxMin3 superior ao algoritmo MaxMin2 com relao ao pior
caso e bastante prximo quanto ao caso mdio.
37

Exemplo: exerccio da primeira aula


f(n) = 7
int nroNotas(int v[], int valor)
{
v[0] = valor/50;
valor = valor%50;
v[1] = valor/10;
valor = valor%10
v[2] = valor/5;
valor = valor%5;
v[3] = valor;
}

38

Exemplo: exerccio da primeira aula


f(n) = 4 + 4 + 3*NmeroNotas
int nroNotas(int v[], int valor) {
v[0] = 0; v[1] = 0; v[2] = 0; v[3] = 0;
while (valor > 50) {
v[0]++;
valor = valor - 50;
}
while (valor > 10) {
v[1]++;
valor = valor - 10;
}
while (valor > 5) {
v[2]++;
valor = valor - 5;
}
while (valor > 1) {
v[3]++;
valor = valor - 1;
}
}
39

Perguntas?

Exerccio
void exercicio1 (int n)
{
int i, a;
a = 0; i = 0;
while (i < n) {

a += i;
i += 2;
}
}

void exercicio2 (int n)


{
int i, j, a;
a = 0;
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
a += i + j;
}

41

Você também pode gostar