Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Trabalho Da Disciplina ED1 - Parte 2 e 3

Fazer download em docx, pdf ou txt
Fazer download em docx, pdf ou txt
Você está na página 1de 6

Trabalho da Disciplina ED1 – parte 2 e parte 3

Prof. André Constantino da Silva

Título da atividade: performance das estruturas de dados


Número de pessoas por grupo: 3 ou 4 membros
Valor da parte 2:
- Coleta de exposição dos dados da memória dinâmica: 3,0 do trabalho disciplinar
- Discussão comparando os dados das implementações usando memória sequencial com
alocação dinâmica: 4,0 do trabalho disciplinar

Objetivo geral: o objetivo do trabalho disciplinar é compreender que, para uma mesma
estrutura de dados, há tempos de execuções diferentes para as mesmas operações quando
comparado as soluções que utilizam memória sequencial ou memória dinâmica.

Objetivo da parte 2: o objetivo da segunda parte do trabalho é coletar o tempo de execução


(medidos em clocks) ao realizar as operações básicas do tipo de dados escolhido pelo grupo
considerando alocação de memória dinâmica, elaborando o texto para expor os dados
coletados.

Objetivo da parte 3: A terceira parte do trabalho tem como objetivo comparar os resultados
coletados sobre o tempo de execução entre as estruturas implementadas usando memória
sequencial (parte 1 do trabalho) e memória dinâmica (parte 2).

Instruções para a Parte 2

Passos:
1) Baixar e alterar o código da estrutura de dados correspondente.
2) executar três vezes o programa considerando 1.000 números
- Inserir elementos na estrutura (ao inserir o elemento deve ser exibido na tela do
usuário)
- Listar os elementos na estrutura
- Remover os elementos da estrutura (ao remover o elemento deve ser exibido na tela
do usuário)
Observação: anotar o tempo de execução (em clocks) para cada uma das funções
chamadas na ordem definida no roteiro.
3) executar o passo 2 considerando 3.000, 5.000, 10.000 e 25.000 números, anotando o tempo
(emitido pela alteração no código) separadamente.

Sugestão: usar a seguinte tabela

Tabela de Tempo de Execução em Clocks


Operação Quantidade de Elementos
1.000 3.000 5.000 10.000 25.000
No. da Bateria 1 2 3 M 1 2 3 M 1 2 3 M 1 2 3 M 1 2 3 M
Inserção
Remoção
Listagem
Onde M é a média dos tempos que deverá ser calculado após obter os resultados das três
baterias de testes.
4) Continuar a elaboração do relatório de dados coletados para a entrega conforme modelo
em anexo, parte destacada em vermelho. Copiar a Parte 1 do trabalho e colocar aqui na Parte
2 (entregando assim, todas as partes juntas) para que seja mais fácil comparar os dados e
obter os resultados.

Nesta segunda parte do trabalho, cada grupo deverá continuar o estudo sobre a estrutura de
dados da primeira parte: lista, fila ou pilha. Ou seja, NÃO mudar de estrutura.

Dica 1: para a geração de números aleatórios na linguagem C é possível utilizar a função rand()
da biblioteca stdlib.h . Entretanto, essa função gera números reais aleatórios. Como sugestão
para geração de números inteiros aleatórios, utilize a função a seguir:

// A função RandomInteger devolve um inteiro


// aleatório entre low e high inclusive,
// ou seja, no intervalo fechado low..high.
// Vamos supor que 0 <= low <= high < RAND_MAX.
// (O código foi copiado da biblioteca random de
// Eric Roberts.)

int RandomInteger (int low, int high)


{
int k;
double d;
d = (double) rand () / ((double) RAND_MAX + 1);
k = d * (high - low + 1);
return low + k;
}

Dica 2: para poder calcular a quantidade de clocks que uma função irá demorar para ser
executada, utilize a função clock da biblioteca time.h conforme exemplo a seguir.

typedef long clock_t;

/* A função clock devolve o tempo de CPU decorrido desde o


// início da execução do seu programa. O tempo é medido em
// ciclos do relógio interno. Cada CLOCKS_PER_SEC ciclos
// correspondem aproximadamente a 1 segundo.
// Cuidado: Depois de aproximadamente 35 minutos, ocorre
// overflow.
*/
int main() {
int i;
double start, finish, elapsed;
start = (double) clock ();

//neste exemplo, irá calcular o número de clocks


necessários
//para imprimir os números de 1 a 5000
for(i = 0; i < 5000; i++)
printf("\n%d", i);

finish = (double) clock ();


elapsed = finish - start;
printf("\nTempo decorrido: %f", elapsed);
}

Instruções para a Parte 3

1) O grupo deverá analisar e comparar com a Tabela 1 com a Tabela 2. Analisando o campo
média, observe: Em quais quantidades de elementos e em quais operações a implementação
usando memória sequencial teve tempo menor? Em quais quantidades de elementos e em
quais operações a implementação usando memória dinâmica teve tempo menor?
2) Discutir considerando o tempo de execução, as seguintes hipóteses:

- Para a fila
F1. Considerando a operação inserir em uma fila, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação
na implementação com memória dinâmica.
F2. Considerando a operação remover em uma fila, o tempo de execução desta operação
implementada em memória dinâmica é menor do que o tempo de execução desta operação na
implementação com memória sequencial.
F3. Considerando a operação imprimir em uma fila, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação
na implementação com memória dinâmica.

- Para a pilha
P1. Considerando a operação inserir em uma pilha, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação
na implementação com memória dinâmica.
P2. Considerando a operação remover em uma pilha, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação
na implementação com memória dinâmica.
P3. Considerando a operação imprimir em uma pilha, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação
na implementação com memória dinâmica.

- Para a lista
L1. Considerando a operação inserir em uma lista, e considerando a posição do elemento a ser
inserido definida aleatoriamente, o tempo de execução desta operação implementada em
memória dinâmica é menor do que o tempo de execução desta operação na implementação
com memória sequencial.
L2. Considerando a operação remover em uma lista, e considerando a posição do elemento a
ser removido definida aleatoriamente, o tempo de execução desta operação implementada
em memória dinâmica é menor do que o tempo de execução desta operação na
implementação com memória sequencial.
L3. Considerando a operação imprimir em uma lista, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação
na implementação com memória dinâmica.
Modelo de Relatório de Estudo de Estrutura de Dados
Estudo da Estrutura de Dados ( ) Lista ( ) Fila ( ) Pilha

Alunos: ____________________________________
____________________________________
____________________________________
____________________________________

Turma: ADS módulo 3 – COLOCAR SEMESTREº semestre de COLOCAR ANO

Introdução
Estrutura de dados é um modo particular de armazenar e organizar os dados em um
computador de modo que possam ser usados eficientemente. Existem diferentes formas de
organização, que são adequadas a diferentes tipos de aplicação e algumas são altamente
especializadas, destinando-se a algumas tarefas específicas. Destacamos neste trabalho a
estrutura de dados COLOCAR NOME DA ESTRUTURA, EXPLICAR A ESTRUTURA.
A eficiência da estrutura pode ser mensurada por meio do tempo de execução (por
exemplo, em milissegundos ou por clocks do processador) e, em alguns casos, o número de
movimentações que ela realiza para a inserção ou remoção de um novo elemento na estrutura.
Entretanto, essas variáveis variam conforme a solução de implementação usada, podendo
utilizar memória sequencial ou memória dinâmica. Cabe ao programador conhecer as diferenças
e eficiência de cada implementação para poder escolher a melhor solução para o seu programa.

Objetivo
Este trabalho visa apresentar dados relacionados ao tempo de execução das operações
básicas da estrutura de dados COLOCAR NOME DA ESTRUTURA considerando a
implementação que utiliza memória sequencial e que utiliza memória dinâmica, com o objetivo
de se compreender a eficiência das duas implementações.

Metodologia
Para obter os dados de eficiência das duas versões da estrutura de dados proposta,
definiu-se coletar o tempo de execução em unidades de clock de processador. Como essa
unidade varia conforme os recursos dos processadores modernos, optou-se por executar cada
teste três vezes e calcular a média das mensurações realizadas, que será utiliza durante a
discussão dos dados.
Este trabalho optou por implementar as duas soluções em linguagem C, cujo código
das operações inserir, remover e listar usando memória sequencial estão disponíveis a seguir:

/Colocar código aqui/


Código de inserção de elemento na estrutura de dados selecionada.

/Colocar código aqui/


Código de remoção de elemento na estrutura de dados selecionada.

/Colocar código aqui/


Código de listagem dos elementos na estrutura de dados selecionada.

O código a seguir apresenta as operações de inserir, remover e listar usando alocação


dinâmica da memória:

/Colocar código aqui/


Código de inserção de elemento na estrutura de dados selecionada.

/Colocar código aqui/


Código de remoção de elemento na estrutura de dados selecionada.

/Colocar código aqui/


Código de listagem dos elementos na estrutura de dados selecionada.

Apresentação dos Dados


Primeiramente iremos apresentar os dados coletados para a solução que utiliza
memória sequencial para, em seguida, apresentar os dados para a solução que utiliza a memória
dinâmica.

Dados coletados do algoritmo com a estrutura de dados usando memória sequencial


A Tabela 1 apresenta o tempo de execução em clocks considerando a estrutura de
dados em estudo e dividas na quantidade de elementos que a estrutura podia suportar: 1.000,
3.000, 5.000, 10.000 e 50.000 elementos.

Tabela 1 – Tempo de execução em clocks na estrutura de dados com 1.000, 3.000, 5.000, 10.000
e 25.000 elementos considerando as operações de inserção, remoção e listagem para a
implementação da estrutura de dados usando memória sequencial

Tabela de Tempo de Execução em Clocks


Operação Quantidade de Elementos
1.000 3.000 5.000 10.000 25.000
No. da Bateria 1 2 3 M 1 2 3 M 1 2 3 M 1 2 3 M 1 2 3 M
Inserção
Remoção
Listagem
Onde M é a média dos tempos que deverá ser calculado após obter os resultados das três
baterias de testes.

Dados coletados do algoritmo com a estrutura de dados usando alocação dinâmica da


memória
A Tabela 2 apresenta o tempo de execução em clocks considerando a estrutura de
dados em estudo e divididas na mesma quantidade de elementos coletadas anteriormente: 1.000,
3.000, 5.000, 10.00 e 50.000 elementos.

Tabela 2 – Tempo de execução em clocks na estrutura de dados com 1.000, 3.000, 5.000, 10.000
e 25.000 elementos considerando as operações de inserção, remoção e listagem para a
implementação da estrutura de dados usando alocação dinâmica

Tabela de Tempo de Execução em Clocks


Operação Quantidade de Elementos
1.000 3.000 5.000 10.000 25.000
No. da Bateria 1 2 3 M 1 2 3 M 1 2 3 M 1 2 3 M 1 2 3 M
Inserção
Remoção
Listagem
Onde M é a média dos tempos que deverá ser calculado após obter os resultados das três
baterias de testes.

Discussão dos dados e conclusão


Nesta parte o grupo deverá analisar os dados coletados e comparar a Tabela 1 com a
Tabela 2. O grupo deverá verificar se as hipóteses a seguir são verdadeiras a partir dos dados
analisados:
- Para a fila
F1. Considerando a operação inserir em uma fila, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação na
implementação com memória dinâmica.
F2. Considerando a operação remover em uma fila, o tempo de execução desta operação
implementada em memória dinâmica é menor do que o tempo de execução desta operação na
implementação com memória sequencial.
F3. Considerando a operação imprimir em uma fila, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação na
implementação com memória dinâmica.

- Para a pilha
P1. Considerando a operação inserir em uma pilha, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação na
implementação com memória dinâmica.
P2. Considerando a operação remover em uma pilha, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação na
implementação com memória dinâmica.
P3. Considerando a operação imprimir em uma pilha, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação na
implementação com memória dinâmica.

- Para a lista
L1. Considerando a operação inserir em uma lista, e considerando a posição do elemento a ser
inserido definida aleatoriamente, o tempo de execução desta operação implementada em
memória dinâmica é menor do que o tempo de execução desta operação na implementação com
memória sequencial.
L2. Considerando a operação remover em uma lista, e considerando a posição do elemento a ser
removido definida aleatoriamente, o tempo de execução desta operação implementada em
memória dinâmica é menor do que o tempo de execução desta operação na implementação com
memória sequencial.
L3. Considerando a operação imprimir em uma lista, o tempo de execução desta operação
implementada em memória sequencial é menor do que o tempo de execução desta operação na
implementação com memória dinâmica.

Também responda as seguintes questões, considerando o tempo médio (colunas M) de cada


uma das quantidades exercitadas: Em quais operações e casos (1.000, 3.000, 5.000, 10.000 e
50.000) a implementação usando memória sequencial foi mais rápida? Em quais operações e
casos a implementação usando memória dinâmica foi mais rápida?
Ao final, o grupo deve elaborar “dicas” de quando usar a implementação usando
memória sequencial ou usando a memória dinâmica.

Você também pode gostar