Академический Документы
Профессиональный Документы
Культура Документы
pole Digital
Instituto Metro
A seguir serao apresentado dois problemas computacionais, para os quais voce deve projetar
pelo menos dois algoritmos diferentes (i.e. complexidade distintas) e medir seu desempenho
temporal por meio de an alise emprica.
1 Problema da soma m
axima de uma subsequ
encia
O problema da soma m
axima de uma subsequ
encia pode ser definido como:
Por conveniencia, a soma maxima de uma subsequencia e zero se todos os inteiros forem
negativos. Por exemplo, para a entrada (2, 11, 4, 13, 5, 2), a resposta e 20 (A2 ate A4 ).
Para solucionar este problema existem, pelo menos, quatro algoritmos com complexidade
temporal distinta. Procure desenvolver pelos menos dois destes algoritmos.
2 Problema da compactac
ao de um arranjo
O problema da compactac ao de um arranjo consiste em percorrer um arranjo com n umeros
inteiros e retirar dele todos os elementos nulos ou negativoseste processo e denominado
de compactacao. A remocao, na verdade, consiste em mover os elementos positivos para a
frente do vetor, preservando sua ordem relativa. Ao final da operacao, o arranjo podera ter
seu tamanho l ogico redefinido, caso alguma compactacao tenha de fato ocorrido.
Por exemplo, para um vetor com os elementos (2, 11, 4, 0, 5, 21) com 6 elementos, a
compactacao resultaria no vetor (11, 21) com apenas 2 elementos.
Para este problema existem, pelo menos, duas solucoes de complexidade distintas. A
primeira, mais ingenua, possui complexidade quadratica e consiste na seguinte estrategia:
3 Tarefa
Projete e implemente, no mnimo, dois algoritmos de complexidades distintas para cada um
dos problemas descritos nas Sec oes 1 e 2. A seguir, realize testes empricos comparativos entre
seus desempenhos para pelo menos 25 entradas diferentes.
Sugere-se o uso de uma escala logartmica para determinar o n umero de dados para a
i i i
instancia de entrada. Exemplos de escala sao 2 , e e 10 , com i [0, 25]. Claro, voce nao
necessariamente precisa utilizar todos os valores de n sugeridos aqui. Procure adequar os
valores de n aqui sugeridos de acordo com capacidade de processamento da maquina usada
nos experimentos. Pode ser que para determinados algoritmos uma entrada com n = 1015
leve alguns dias para ser processada!
Para cada algoritmo armazene os tempos de 100 execucoes aleatorias de cada instancia
com tamanho n. Depois calcule a media aritmetica dos tempos das 100 execucoes: este sera
o tempo medio da execucao do algoritmo para uma instancia do problema com tamanho n.
Apos coletar e calcular a media dos tempos de execucao para todos os tamanhos de instancia
n, gere um grafico mostrando uma curva de crescimento (n no eixo X e tempo de execucao
no eixo Y ) para cada algoritmo. Faca o mesmo tipo de comparacao considerando o n umero
de passos executados da operacao dominante.
Em seguida, elabore um relat orio tecnico com i) uma introduc ao, explicando o proposito
do relatorio; ii) uma secao descrevendo o m etodo seguido, ou seja quais foram os materiais
utilizados (caracterizacao tecnica do computador utilizado, linguagem de programacao ado-
tada, tipo e versao do sistema operacional, compilador empregado, algoritmo implementado,
etc.) e metodologia de comparacao seguida (tempo, passos, memoria); iii) os resultados al-
cancados (graficos e tabelas) e, por fim; iv) a discuss ao dos resultados: O que voce descobriu?
Aconteceu algo inesperado? Se sim, por que? Afinal, qual o algoritmo mais eficiente? Que
funcao matematica melhor se aproxima do grafico gerado? A analise emprica e compatvel
com a analise matematica?
P
agina 2
IMD0029 Estruturas de Dados B
asicas I Lista de exerccios, 2015.1
Um relat orio tecnico de algum valor academico deve ser escrito de tal maneira que possibi-
lite que uma outra pessoa que tenha lido o relatorio consiga reproduzir o mesmo experimento.
Este e o princpio cientfico da reprodutibilidade.
Note que para realizar uma comparacao correta entre algoritmos, os mesmos valores ge-
rados (randomicamente1 ) para cada tamanho n devem ser fornecidos como entrada para os
dois algoritmos que estao sendo comparados.
Os graficos podem ser gerados usando uma planilha eletronica ou programas de geracao
de graficos, como o gnuplot que costuma vir instalado em sistemas linux.
Timing e Randomizac
ao (C++98)
Para a medicao do tempo decorrido na execucao de um determinado trecho de codigo e
oes diferentes. A primeira, time , captura o tempo de relogio
possvel utilizar-se de duas func
decorrido entre o incio e o fim do trecho. A segunda, clock , captura o n umero de ciclos
de processador decorridos entre o incio e o fim da marcacao portanto e possvel obter o
tempo aproximado de processamento real.
O Codigo 1 demonstra o uso das duas formas de medicao de tempo em um program. O
trecho a ser medido esta destacado em vermelho e vai da linha 18 ate 26.
A geracao de n
umeros rand omicos ou aleatorios e feita atraves de uma funcao, rand() , da
biblioteca padrao do C++. Esta funcao retorna n umeros inteiros entre zero e uma constante
numerica identificada por RAND MAX . Note, contudo, que a funcao rand() e um gerador de
n
umeros pseudo-aleat orios. Isto quer dizer que a sequencia de n umeros gerados sera sempre a
mesma.
Para aumentar a flexibilidade de tal geracao, permitindo que uma sequencia de n umeros seja
diferente a cada execucao, e necessario invocar previamente uma outra funcao denominada de
srand() . Esta funcao permite fornecer uma semente para a geracao de n umeros aleatorios:
diferentes sementes implicam em diferentes sequencias de n umeros aleatorios.
Mas como gerar uma semente diferente a cada execucao? (caso contrario estaramos
com o mesmo problema de gerar sementes aleatorias!) A resposta e utilizar a funcao time
(vista anteriormente) para recuperar qual o valor do relogio do sistema expresso em segundos
decorridos `a partir de meia noite das 00:00 horas de 1o de janeiro de 1970 UTC (Tempo
Universal Coordenado). Como a cada execucao o tempo sera diferente (o tempo decorrido em
segundos continua aumentando), tem-se a garantia (parcial) da geracao de n umeros aleatorios.
O Codigo 2 demonstra um programa que faz uso destas funcoes para gerar n umeros aleatorios.
1
Para informaco
es sobre como gerar n
umeros rand
omicos consulte o final deste documento.
P
agina 3
IMD0029 Estruturas de Dados B
asicas I Lista de exerccios, 2015.1
Considerac
oes Finais
O trabalho deve ser desenvolvido em duplas e submetido via Sigaa de acordo com a data
estabelecida na turma virtua. Voce deve submeter um u
nico arquivo (zip) contendo todos os
programar desenvolvidos, organizados em subpastas para cada problema, bem como o relatorio
no formato PDF.
FIM
P
agina 4
IMD0029 Estruturas de Dados B
asicas I Lista de exerccios, 2015.1
C
odigo 2 Programa para gerar n
umeros aleatorios.
1 # include < ctime >
2 # include < iostream >
3 u s i n g std :: cout ;
4 u s i n g std :: endl ;
5
6 # define NTrials 10 // Number of trials
7
8 v o i d randomize ( v o i d ) { srand (( i n t ) time ( NULL )); }
9
10 i n t randInt ( i n t low , i n t high ) {
11 i n t k;
12 double d;
13
14 d = ( d o u b l e ) rand () / (( d o u b l e ) RAND_MAX + 1);
15 k = ( i n t ) ( d * ( high - low + 1));
16 r e t u r n ( low + k );
17 }
18
19 i n t main () {
20 cout << " >> On this computer , RAND \ _MAX = " << RAND_MAX << endl ;
21 cout << " >> " << NTrials << " calls to rand ( same seed ):\ n " ;
22 f o r ( i n t i = 0; i < NTrials ; i ++ )
23 cout << rand () << endl ;
24
25 randomize ();
26 cout << " \n > > " << NTrials << " calls to rand ( time - based seed ):\ n " ;
27 f o r ( i n t i = 0; i < NTrials ; i ++ )
28 cout << rand () << endl ;
29
30 cout << " \n > > " << NTrials << " calls to rand ( range [1 -10]):\ n " ;
31 f o r ( i n t i = 0; i < NTrials ; i ++ )
32 cout << randInt (1 ,10) << endl ;
33
34 r e t u r n ( EXIT_SUCCESS );
35 }
P
agina 5