Trabalho 2 Matriz Esparsa

Documentos relacionados
SCC-502 Algoritmos e Estruturas de Dados 1 M. Cristina/Jorge. Trabalho Rec Codificação de Huffman

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

BCC202 - Estrutura de Dados I

Algoritmos e Programação

Matrizes esparsas: definição

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Aula 9 Oficina de Programação Matrizes. Profa. Elaine Faria UFU

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Algoritmos e Estruturas de Dados I

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Prova 2 - Computação

AULA 14 ESTRUTURA DE DADOS

Linguagem C: Listas Encadeadas

Filas. Prof. Túlio Toffolo BCC202 Aula 12 Algoritmos e Estruturas de Dados I

Matrizes. DCC 119 Algoritmos

Aula 04. Agregados Homogêneos. Agregados Heterogêneos. Matrizes

Algoritmos e Programação

LÓGICA DE PROGRAMAÇÃO (C) VETORES E MATRIZES. Professor Carlos Muniz

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Aula 06 Introdução à Programação Matrizes

Lista de Exercícios de Algoritmos - 04 Para cada um dos exercícios abaixo, faça um programa (em laboratório) que teste a função.

Matrizes (Vetores Bidimensionais)

Listas e matrizes esparsas. SCC122 Estruturas de Dados

Alocação Dinâmica em C

MC-102 Aula 21 Registros

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Programação: Vetores

CCO 016 / COM 110 Fundamentos de Programação

Exercícios Repetição

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída

Matrizes. Marina Andretta. 17 de abril de 2017 ICMC-USP. Marina Andretta (ICMC-USP) sme0230-ipc 17 de abril de / 30

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

TAD: Tipo Abstrato de Dados (parte 2)

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Atividade de laboratório listas encadeadas simples

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

INF 1620 Estruturas de Dados Semestre Segundo Trabalho: Jogo de Caça-Palavras

Se a senha tem de 2 a 30 caracteres. Se tiver mais ou menos caracteres, ela não será válida e deve mostrar a mensagem de erro abaixo:

Questão 1: O histograma deve ser: [0, 1, 4, 2, 0, 3, 0,, 0, 2] Exemplo: Para a matriz

LINGUAGEM C: ARRAY: VETORES E MATRIZES

Computação I (MAB120) DCC/UFRJ

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

TAD: Tipo Abstrato de Dados (parte 2)

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira Anilton Joaquim da Silva

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

Introdução a Programação. Listas Encadeadas

Algoritmos e Estruturas de dados

INF 1620 P3-02/07/02 Questão 1 Nome:

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

INF 1620 P2-01/11/03 Questão 1 Nome:

Linguagem C: Ponteiros - Alocação Dinâmica

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

INF 1620 P4-13/12/01 Questão 1 Nome:

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Vetores Unimensionais

INF 1620 P4-06/12/02 Questão 1 Nome:

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Métodos Computacionais. Tipos Estruturados

Faculdade de Computação

Transcrição:

Trabalho 2 Matriz Esparsa SCC-502 Algoritmos e Estruturas de Dados 1 M. Cristina/Jorge 1 Introdução O trabalho deverá ser feito individualmente e submetido para o sistema SSP (Sistema de Submissão de Programas), do ICMC. Data de entrega: 05 de novembro de 2013. 1.1 Instruções de submissão Para entrar no sistema e submeter os trabalhos, seguir os passos: 1. Entre no site <https://ssp.icmc.usp.br/>; 2. Faça login/cadastro no site; 3. Matricule-se na disciplina SCC0502 - Algoritmos e Estruturas de dados (M. Cristina) (2013/2-Turma A) 4. Clique em Submeter exercicio -> "Trabalho 2. Matriz Esparsa"; 5. Submeta seu exercício; 6. O sistema fará a correção automática do seu programa, seguindo alguns casos de teste (padrões de entrada e saída) e apresentará o número de acertos e erros. Você pode submeter o programa quantas vezes desejar (até o prazo de entrega). 1.2 Critério de Avaliação Dados: N acertos = Número de casos de teste corretos; N casos = Número total de casos de teste; T 2 = Nota do trabalho 2. T 2 = Nacertos 10 N casos 1

2 Descrição do Trabalho Matrizes esparsas são matrizes em que a maioria das posições são preenchidas por zeros. Para estas matrizes, podemos economizar um espaço signicativo de memória se apenas os termos diferentes de zero forem armazenados. Operações como a adição e a multiplicação de matrizes também podem ser feitas em tempo muito menor se não armazenarmos as posições que contém zeros. Uma maneira eciente de representar estruturas com tamanho variável e/ou desconhecido é através de alocação encadeada, utilizando listas. Cada coluna da matriz será representada por uma lista linear. Da mesma maneira, cada linha da matriz também será representada por uma lista linear. 1 0 0 0 0 0 0 4 0 0 Por exemplo, considere a matriz A = 0 0 2 4 0 0 0 0 0 0 0 0 0 0 3 Sua representação como lista é apresentada abaixo:

Considere que a estrutura para armazenar a matriz esparsa será: typedef struct t_celula{ struct t_celula *direita, *abaixo; int linha, coluna; float valor; Celula; typedef struct { Celula *cabeca; int nlin,ncol; Matriz; Seu programa deve, para cada caso de teste: 1. Ler duas matrizes esparsas; 2. Realizar a multiplicação das duas matrizes; 3. Imprimir a matriz resultante na tela; 4. Apagar as matrizes alocadas da memória; 5. Cumprir as especicações de Entrada e Saída, descritas nas seções?? e??.

3 Entrada A entrada deve ser lida do teclado (stdin). A entrada contém vários casos de teste. A primeira linha de cada caso de teste corresponde à entrada da primeira matriz (M 1 ) e contem três números inteiros, L 1, C 1 e N 1, representando o número de linhas (L 1 ), o número de colunas (C 1 ) e o número de elementos a serem inseridos na matriz (N 1 ). As próximas N 1 linhas contêm dois números inteiros e um real, i 1, j 1 e v 1, que indicam a linha (i 1 ) e a coluna (j 1 ) em que o elemento (v 1 ) será inserido. A próxima linha corresponde à segunda matriz (M 2 ) e contem três números inteiros, L 2, C 2 e N 2, representando o número de linhas (L 2 ), o número de colunas (C 2 ) e o número de elementos a serem inseridos na matriz (N 2 ). As próximas N 2 linhas contêm dois números inteiros e um real, i 2 e j 2 e v 2, que indicam a linha (i 2 ) e a coluna (j 2 ) em que o elemento (v 2 ) será inserido. ATENÇÃO: Todos os casos de teste devem ser processados em uma única execução do programa (utilize uma estrutura de repetição para percorrer até o m do arquivo). As matrizes podem ter até 30000 linhas e 30000 colunas. MUITA ATENÇÃO: Os elementos da matriz esparsa devem ser indexados a partir do zero (assim como na linguagem C).

4 Saída A saída deve ser apresentada na saída padrão, através do comando printf Para cada caso de teste, seu programa deve imprimir os elementos não nulos (não zeros) da matriz resultante, no mesmo formato da entrada, ou seja, <linha> <coluna> <valor>. O valor da matriz deve ter uma casa decimal, ou seja, deve-se utilizar o comando: printf("%.1f",...); ATENÇÃO: Não devem ser adicionados espaços ou quebras de linha entre uma matriz e outra. MUITA ATENÇÃO: A saída deve ser idêntica a dos exemplos de execução (Seção??). Varia-se, primeiramente, as colunas e, em seguida, as linhas. Um trecho de código que imprime uma matriz tradicional (não esparsa) desta maneira é dado abaixo. int main(void){ float matriz[10][10]; int i,j; //... //... Preenchimento da matriz //... //... //... for (j = 0; j < 10; j++){ for (i = 0; i < 10; i++){ if (matriz[i][j]!= 0){ printf("%d %d %.1f\n",i,j,matriz[i][j]);

5 Exemplo de execução 2 2 2 0 0 2.0 1 1 2.0 2 2 2 0 0 3.0 1 1 6.0 Entrada 0 0 6.0 1 1 12.0 Saída 30000 30000 4 32 100 1.7 32 101 1.7 32 102 1.7 32 103 1.7 30000 30000 2 101 32 1.3 102 32 1.3 3 10000 4 0 2 3.0 1 2 3.0 0 3 3.0 1 3 3.0 10000 3 4 2 0 3.0 3 0 3.0 2 1 3.0 3 1 3.0 1 30000 3 0 9 5.0 0 10 5.0 0 11 5.0 30000 1 3 9 0 1.2 10 0 1.2 11 0 1.2 32 32 4.4 0 0 18.0 1 0 18.0 0 1 18.0 1 1 18.0 0 0 18.0

6 Considerações Finais 6.1 Tempo de execução Para cada caso de teste, seu programa deverá ser executado em, no máximo, 30 segundos. Se a execução demorar mais do que isso, verique se não há problemas em sua implementação. Lembre-se: aproveite o fato de que a matriz é esparsa nas funções de multiplicação de matrizes e de impressão dos elementos não nulos. 6.2 Dicas de Implementação Num primeiro momento, você pode ter pensado em criar uma função float acessa(matriz *m, int lin, int col); E trabalhar com a multiplicação (e impressão) de matrizes de maneira tradicional, por exemplo: Matriz* multiplica(matriz *m1, Matriz *m2){ int i,j,x; float valor; Matriz *mtp; //matriz resultante mtp = (Matriz *)malloc(sizeof(matriz)); //aloca a matriz if (mtp == NULL) return NULL; criamatriz(mtp,m1->nlin,m2->ncol); //cria a matriz com o numero //de linhas da matriz 1 e de colunas da matriz 2 for (i=0;i<mtp->nlin;i++){ for (j=0;j<mtp->ncol;j++){ valor = 0; for (x=0;x<m1->ncol;x++){ valor+=acessa(m1,i,x)*acessa(m2,x,j); if (valor!= 0){ insere(mtp,i,j,valor); return mtp;

void imprimenaonulos(matriz *m){ int i,j; for (j = 0; j < m->ncol; j++){ for (i = 0; i < m->nlin; i++){ if (acessa(m,i,j)!= 0){ printf("%d %d %.1f\n",i,j,acessa(m,i,j)); Lembre-se: Sua matriz é esparsa. Você está aproveitando esse fato para fazer seus cálculos? Faça seu programa sem a função "acessa"e aproveite o grande numero de elementos nulos na sua matriz. 6.3 Plágio ATENÇÃO: O sistema SSP utiliza a ferramenta MOSS, de Stanford, para detecção de plágio. Para mais informações, visite: <http://theory.stanford.edu/ aiken/moss/>.