Académique Documents
Professionnel Documents
Culture Documents
Estruturas de Dados
Complexidade de Algoritmos
- Complexidade de tempo
- Interpretao da complexidade de tempo
- Clculo da complexidade de tempo
Introduo
O estudo de Estruturas de Dados
basicamente o estudo de mtodos de
organizao de grandes quantidades
de dados. Estes mtodos incluem:
formas de organiz-los (estruturas);
tcnicas para manipul-los
(algoritmos bsicos).
Introduo
Pilhas, Listas e Filas so estruturas de dados tpicas;
para manipular estas estruturas - inserir elementos,
retirar elementos e ordenar elementos - necessitamos
de algoritmos;
estes algoritmos podem ser implementados de muitas
maneiras. Algumas simples e diretas, outras no to
simples - porm engenhosas - e outras ainda
complicadas e envolvendo muitas operaes;
quando trabalhamos com quantidades muito grandes
de dados, um projeto ruim de algoritmo para
manipular uma estrutura de dados pode resultar em
um programa que apresenta um tempo de execuo
invivel.
Introduo
Quando estudamos algoritmos, um
aspecto que devemos considerar, alm
de sua correo, a anlise da sua
eficincia.
A anlise de algoritmos pode ser
definida como o estudo da estimativa
do tempo de execuo dos
algoritmos (M. A. Weiss).
Idias bsicas
Um algoritmo um conjunto finito de
passos que devem ser seguidos com
um conjunto de dados de entrada para
se chegar soluo de um problema;
um problema, geralmente, pode ser
resolvido por muitos algoritmos
diferentes;
exemplo: clculo da potncia xn de um
nmero inteiro x.
Idias bsicas
//Verso iterativa.
inteiro potncia(x, n)
inteiro y, i;
incio
i <- n;
y <- 1;
enquanto (i > 0) faa
y <- y * x;
i <- i - 1;
fim enquanto
retorne y;
fim
Idias bsicas
//Verso recursiva.
inteiro potncia_recursiva(x, n)
inteiro y;
incio
se (n = 1) ento
retorne x;
y <- potncia_recursiva (x, (n / 2));
se (mpar(n)) ento
retorne x*y*y;
seno
retorne y*y;
fim se
fim
Idias bsicas
O fato de existir um algoritmo para
resolver um problema no implica
necessariamente que este problema
possa realmente ser resolvido na
prtica. H restries de tempo e de
espao de memria.
Exemplo: calcular todas as possveis
partidas de xadrez.
Idias bsicas
Um algoritmo uma idia abstrata de como
resolver um determinado problema. Ele , a
princpio, independente da mquina que o
executar e de suas caractersticas.
Um programa uma implementao de um
algoritmo em uma linguagem particular que
ser executado em um computador particular.
Um programa est sujeito s limitaes fsicas
da mquina onde ser executado, como
capacidade de memria, velocidade do
processador e dos perifricos, entre outras.
Idias bsicas
O tempo que a execuo de um programa toma
uma grandeza fsica que depende:
do tempo que a mquina leva para executar
uma instruo ou um passo de programa;
da natureza do algoritmo, isto , de quantos
passos so necessrios para se resolver o
problema para um dado;
do tamanho do conjunto de dados que
constitui o problema.
Problema bsico na Anlise de Algoritmos
Necessitamos definir uma forma de criar
uma medida de comparao entre
diferentes algoritmos que resolvem um
mesmo problema, para:
podermos saber se so viveis;
podermos saber qual o melhor algoritmo
para a soluo do problema.
Problema bsico na Anlise de Algoritmos
Para fazermos isso, abstramos de um
computador em particular e
assumimos que a execuo de todo e
qualquer passo de um algoritmo leva
um tempo fixo e igual a uma unidade de
tempo:
o tempo de execuo em um computador
particular no interessante;
muito mais interessante uma comparao
relativa entre algoritmos.
Problema bsico na Anlise de Algoritmos
Modelo de computao
as operaes so todas executadas
seqencialmente;
a execuo de toda e qualquer operao
toma uma unidade de tempo;
a memria do computador infinita.
Assim nos sobram duas grandezas:
tempo = nmero de operaes executadas;
quantidade de dados de entrada.
Complexidade de Tempo
Podemos expressar de forma abstrata a
eficincia de um algoritmo descrevendo
o seu tempo de execuo como uma
funo do tamanho do problema
(quantidade de dados). Isto chamado
de complexidade de tempo.
Exemplo: ordenao de um Vetor.
Primeiro caso: Bubblesort
Bubblesort o mais primitivo dos mtodos
de ordenao de um vetor. A idia
percorrer um vetor de n posies n
vezes, a cada vez comparando dois
elementos e trocando-os caso o
primeiro seja maior que o segundo.
Primeiro caso: Bubblesort
//Mtodo da bolha.
Bubblesort(a[], n)
inteiro i, j, x;
incio
para i de 1 at n faa
para j de 2 at n faa
se (a[j-1] > a[j]) ento
x <- a[j-1];
a[j-1] <- a[j];
a[j] <- x;
fim se
fim para
fim para
fim
Primeiro caso: Bubblesort
A comparao (a[j-1] > a[j]) vai ser
executada n*(n-1) vezes. No caso de
um vetor na ordem inversa, as
operaes da atribuio triangular
podero ser executadas at 3*n*(n-1)
vezes, j que uma troca de elementos
no significa que um dos elementos
trocados tenha encontrado o seu lugar
definitivo.
Segundo caso: StraightSelection
O mtodo da seleo direta uma forma
intuitiva de ordenarmos um vetor:
escolhemos o menor elemento do vetor
e o trocamos de posio com o primeiro
elemento.
Depois comeamos do segundo e
escolhemos novamente o menor dentre
os restantes e o trocamos de posio
com o segundo e assim por diante.
Segundo caso: StraightSelection
StraightSelection(a[], n)
inteiro i, j, k, x;
incio
para i de 1 at n-1 faa
k <- i;
x <- a[i];
para j de i+1 at n faa
se (a[j] < x) ento
k <- j;
x <- a[k];
fim se
fim para
a[k] <- a[i];
a[i] <- x;
fim para
fim
Segundo caso: StraightSelection
Neste algoritmo o nmero de vezes que a
comparao (a[j] < x) executada
expresso por (n-1)+(n-2)+...+2+1 =
(n/2)*(n-1).
O nmero de trocas a[k] <- a[i]; a[i] <- x
realizado no pior caso, onde o vetor
est ordenado em ordem inversa,
somente n-1 vezes, num total de 2*(n-
1).
Interpretao
Como j foi dito, a nica forma de se
poder comparar dois algoritmos
descrevendo o seu comportamento
temporal em funo do tamanho do
conjunto de dados de entrada. Assim:
Talgoritmo = f(n), onde n o tamanho
do conjunto de dados.
Interpretao
Se tomarmos as operaes de troca de
valores como critrio-base, podemos
dizer que:
inteiro somaCubos(inteiro n)
inteiro i, somaParcial;
incio
1 somaParcial <- 0;
2 para i de 1 at n faa
3 somaParcial <- somaParcial + i * i * i;
4 fim para
5 retorne somaParcial;
fim
Clculo da Complexidade de Tempo
Anlise:
as declaraes no tomam tempo nenhum;
a linha 4 tambm no toma tempo nenhum;
as linhas 1 e 5 contam uma unidade de tempo cada;
a linha 3 conta 4 unidades de tempo (2 multiplicaes,
uma adio e uma atribuio) e executada n vezes,
contando com um total de 4n unidades de tempo;
a linha 2 possui custos implcitos de inicializar i, testar
se menor que n e increment-lo. Contamos 1 unidade
para sua inicializao, n + 1 para todos os testes e n
para todos os incrementos, o que perfaz 2n + 2
unidades de tempo;
o total perfaz 6n + 4 unidades de tempo, o que indica
que o algoritmo O(n), da Ordem de Complexidade n,
ou seja, linear.
Regras para o clculo
Laos: o tempo de execuo de um lao , no mximo, a
soma dos tempos de execuo de todas as instrues
dentro do lao (incluindo todos os testes) multiplicado pelo
nmero de iteraes.
Exemplo: O(n2)
para i de 1 at n faa
para j de 1 at n faa
k <- k + 1;
fim para
fim para
Regras para o clculo
Instrues Consecutivas: estes simplesmente somam, sendo os
termos de ordem menor da soma ignorados.
se cond ento
expressso1
seno
expresso2
fim se
inteiro FatorialIterativo(inteiro n)
inteiro i, fatorial;
incio
fatorial <- 1;
para i de 2 at n faa
fatorial <- fatorial * i;
fim para
retorne fatorial;
fim
inteiro Fibonacci(inteiro n)
incio
se n <= 1 ento
retorne 1
seno
retorne (Fibonacci(n-1) + Fibonacci(n-2));
fim se
fim
v1->v3
v2->v3
v4 3 v4->v3
v4->v3 = v4->v1->v3->v2
Exerccio: clculo de complexidade
Agora, por exemplo, para determinar a
rota de v2 para v1, toma-se R[2,1] = v5,
R[5,1] = v4, R[4,1] = v1.
Logo, a rota de v2 para v1 :
v2 v5 v4 v1
Exerccio: clculo de complexidade
Algoritmo de Floyd modificado
Considere a matriz de custos D[n,n]
definida como no algoritmo de
Floyd. O algoritmo produzir uma
matriz A[n,n], com comprimentos
dos menores caminhos e ainda
uma matriz R[n,n] que fornece o
vrtice k, que o primeiro vrtice a
ser visitado no menor caminho de vi
at vj.
Exerccio: clculo de complexidade
FloydModificado()
incio
para i = 1 at n faa
para j = 1 at n faa
A[i,j] <- D[i,j];
R[i,j] <- 0;
fim para
fim para
para i = 1 at n faa
A[i,i] <- 0;
fim para
para k = 1 at n faa
para i = 1 at n faa
para j = 1 at n faa
se A[i,k] + A[k,j] < A[i,j] ento
A[i,j] <- A[i,k] + A[k,j];
R[i,j] <- k;
fim para
fim para
fim para
fim
Exerccio: clculo de complexidade
2. Torres de Hanoi
2.1. Considere o Problema das Torres de Hanoi com 3
Pinos na sua verso iterativa, como visto em aula:
um programa que itera sempre sobre duas jogadas: a
menor pea e outra possvel de ser movida
Voc viu que para 2 discos, houve 3 movimentaes de
disco e para 3 discos o algoritmo executou 7
movimentaes.
Qual essa tendncia ? Ser que esse comportamento
continuar seguindo essa tendncia?
Calcule a complexidade do algoritmo das torres de Hanoi
Exerccio: clculo de complexidade
2. Torres de Hanoi
2.2. Considere o Problema das Torres de Hanoi
implementado por voc em aula:
Mantendo o nmero de pilhas (pinos) constante, voc pode
escolher um nmero arbitrrio de discos.
Modifique o programa para poder mensurar o tempo de
execuo.
Use as funes ftime(), ctime(), difftime().
Observe que difftime() s tem sentido se o programa rodar mais
de um segundo, o que no acontecer para valores baixos.
Rode o programa para 2, 3, 6, 7,10, 30, 50, 100, 200, 300,
500, 1000, 2000, 10.000, 50.000,100.000 e 500.000 discos.
Exerccio: clculo de complexidade
2. Torres de Hanoi
Ao final o programa
dever chamar o
programa unix gnuplot
com o arquivo de
tempos como
parmetro para que
um grfico dos tempos
seja mostrado na tela.
Para tanto esse
arquivo dever ser
gerado na sintaxe do
gnuplot, detalhada no
manual do gnuplot.