Matrizes esparsas: definição

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

Listas e matrizes esparsas Orthogonal List Representation (Listas Cruzadas) 21/10/2010

Estruturas de Dados Estruturas de Dados Fundamentais

Aplicações de listas e outras estruturas

Universidade de São Paulo

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

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Listas e matrizes esparsas. SCC122 Estruturas de Dados

Tabelas Hash. informação, a partir do conhecimento de sua chave. Hashing é uma maneira de organizar dados que:

BCC202 - Estrutura de Dados I

Lista de Exercícios 04

Árvores Binárias de Busca (ABB) 18/11

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Algoritmos de pesquisa. Tabelas de dispersão/hash

Tipos e Estruturas de Dados Profa. Graça Nunes Lista de Exercícios (Listas Encadeadas, Duplamente Encadeadas e Circulares)

Algoritmos e Estruturas de Dados I

Hashing: conceitos. Hashing

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

Edital de Seleção 055/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Matrizes (Vetores Bidimensionais)

Acesso Sequencial Indexado

Estrutura de Dados Listas

Edital de Seleção 023/2018 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

TÉCNICAS DE PROGRAMAÇÃO. Estrutura de dados

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

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

Árvores Binárias de Busca (ABB) 18/11

Aula 13: Listas encadeadas (estruturas lineares)

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

ACH2024. Aula 22 Hashing Externo - Hashing estático e dinâmico (extensível) Prof Helton Hideraldo Bíscaro

TAD dicionário. Métodos do TAD dicionário:

Hashing Externo. SCC-503 Algoritmos e Estruturas de Dados II. Thiago A. S. Pardo M.C.F. de Oliveira Cristina Ciferri

ESTRUTURA DE DADOS E ALGORITMOS. Hashing (Tabela de Dispersão) Cristina Boeres

Algoritmos e Programação

Árvores. Prof. César Melo DCC/ICE/UFAM

Hashing (Tabela de Dispersão)

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Computação Eletrônica. Vetores e Matrizes. Prof: Luciano Barbosa. CIn.ufpe.br

INF 1620 P3-29/06/04 Questão 1 Nome:

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

Tabelas de hash Acabamos de estudar como implementar uma tabela hashing aberta e estudaremos agora como implementar uma tabela hashing fechada ou

Estrutura de Dados. Aula 07 Alocação Dinâmica

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Transformação de Chave. (Hashing)

Aula 08. Estruturas de dados Árvore e Grafo

Árvores. Prof. César Melo DCC/ICE/UFAM

Edital de Seleção 016/2018 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Transformação de Chave - Hashing

Introdução à Computação II (Noturno) BCC Unesp Rio Claro/SP 2015 em PDF via Moodle: Escolha apenas 5 exercícios para entrega Exercício 01 (Pilhas)

Trabalho 2 Matriz Esparsa

Pesquisa Linear. Adriano J. Holanda 15/3/2016

Estruturas de Dados. Profº Carlos Alberto Teixeira Batista

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

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

Tabelas de dispersão/hash

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

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

Programação I Matrizes e Strings. Prof. Carlos Alberto

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

ÁRVORE B. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Listas - Outras. Listas Circulares Nós Cabeça Listas Duplamente Ligadas/Encadeadas Aplicações

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

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

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

Índices. SCE-203 Algoritmos e Estruturas de Dados II

Transcrição:

Matrizes esparsas: definição o objetivo é mostrar os métodos de armazenamento e manipulação de matrizes esparsas esparsidade de uma matriz é a relação entre o número de elementos nulos de uma matriz e o número total de elementos da matriz grau de esparsidade é a porcentagem de elementos nulos da matriz são matrizes em que nem todos os elementos estão realmente presentes ou são necessários, portanto, a maioria das posições são preenchidas por zeros pode-se economizar um espaço significativo de memória se apenas os termos diferentes de zero forem armazenados e manuseados a eficiência computacional será maior Matrizes esparsas: definição matrizes são consideradas esparsas quando suas dimensões são relativamente grandes (1000 x 1000) nem todas as suas posições são usadas (o número de valores não nulos é da ordem do número de linhas ou do número de colunas, de 1 milhão usa-se 1000 elementos) casos unidimensionais (vetores), bidimensionais e tridimensionais aplicações: em problemas de engenharia, física etc. (método das malhas para resolução de circuitos elétricos) em computação: armazenamento de dados (planilhas eletrônicas, apenas uma porção da matriz pode estar sendo usada em um dado momento) as operações usuais sobre estas matrizes (somar, multiplicar, inverter, pivotar) também podem ser feitas em tempo muito menor se não são armazenadas as posições que contém zeros 1

em vez de representar todos os valores, armazena-se os elementos e os números de linha e coluna desses elementos com valor não nulo exemplo de uma matriz esparsa de 5 x 5 elementos inteiros armazena-se 15 inteiros (linha, coluna, elemento), em vez de 25 inteiros { (2,2,1), (2,4,2), (3,3,3), (4,2,4), (4,4,5) } é necessário usar uma representação que evite o armazenamento de tantas posições nulas existem quatro técnicas para representar uma matriz esparsa: lista encadeada árvore binária matriz de ponteiros fragmentação ou hashing estas técnicas são realmente úteis para matrizes com uma porcentagem significativa de elementos nulos (zeros); se este não for o caso, o melhor é usar o método de armazenamento comum (array) 2

matriz esparsa com lista encadeada estrutura que contenha os seguintes itens os elementos a serem armazenados a posição dentro da matriz as ligações com o elemento anterior e próximo vantagem faz uso eficiente da memória desvantagem precisa usar uma pesquisa linear para acessar as células da lista (requer n/2 comparações, n é o número de elementos da lista) sem uso de informação adicional (memória adicional) não há como realizar uma pesquisa binária para localizar uma célula matriz esparsa com lista encadeada cada coluna e cada linha da matriz será representada por uma lista linear circular com uma célula cabeça cada célula da estrutura, além das células-cabeça, representará os termos diferentes de zero da matriz e devem ter o seguinte tipo: tipo APONTADOR = ^ TIPOCELULA; TIPOCELULA = registro DIREITA, ABAIXO: APONTADOR; LINHA, COLUNA: inteiro; VALOR: real; fim_registro; cada estrutura é colocada na lista com os elementos inseridos de forma ordenada, baseada no índice da matriz, ou seja, o elemento A 1,2 precede o elemento A 1,3. 3

matriz esparsa com lista encadeada o campo ABAIXO deve ser usado para apontar o próximo elemento diferente de zero na mesma coluna o campo DIREITA deve ser usado para apontar o próximo elemento diferente de zero na mesma linha dada uma matriz A, para um valor A(i,j) diferente de zero, deverá haver uma célula com o campo VALOR contendo o elemento de A(i,j) o campo LINHA contendo i e o campo COLUNA contendo j esta célula deverá pertencer à lista circular da linha i e também deverá pertencer à lista circular da coluna j. cada célula pertencerá a duas listas ao mesmo tempo para diferenciar as células cabeça, -1 é colocado nos campos LINHA e COLUNA destas células matriz esparsa com lista encadeada uma matriz esparsa com m linhas, n colunas e r elementos diferentes de zero gastará (m + n + r) + 1 células considere a matriz esparsa A (4 x 4): a matriz A pode ser vista através de um representação de 15 células = (4 linhas + 4 colunas + 6 elementos) + 1 cada célula ocupa vários bytes na memória; no entanto, o total de memória usado será menor do que as posições necessárias para representar a matriz toda, desde que r seja suficientemente pequeno 4

matriz esparsa com lista encadeada: matriz esparsa com árvore binária lista duplamente encadeada vantagens pode ser varrida rapidamente: inserções e consultas rápidas (requer log 2 n comparações) usa eficientemente a memória cada célula da estrutura, representará os termos diferentes de zero da matriz e devem ter o seguinte tipo: tipo APONTADOR = ^TIPOCELULA; TIPOCELULA = registro ESQUERDA, DIREITA: APONTADOR; // ponteiros para as subárvores esquerda e direita LINHA, COLUNA: inteiro; VALOR: real; fim_registro; 5

matriz esparsa com matriz de ponteiros exige muito menos armazenamento permanente que uma matriz inteira porque ela armazena ponteiros para a informação o método de matriz de ponteiros fornece um acesso muito mais rápido aos elementos da matriz que os métodos da lista encadeada ou árvore binária quando se atribui dados a uma localização de matriz uma memória é alocada para esses dados o ponteiro apropriado na matriz de ponteiro seria definido para apontar para esses dados a declaração que cria esta matriz de ponteiros é: TIPOCELULA = registro LINHA, COLUNA: inteiro; VALOR: real; fim_registro; tipo ^MATRIZ_PONT[xxx]: TIPOCELULA; // matriz de ponteiros de xxx (mxn) elementos matriz esparsa com matriz de ponteiros antes que uma matriz de ponteiros possa ser usada, cada elemento deve ser inicializado com nulo, isto indica que não há entrada nesta posição a figura abaixo mostra um exemplo de uma matriz de ponteiros como suporte para uma matriz esparsa (4x3), onde existem elementos não nulos em A 11, A 12, A 22, A 33.... 0 0 0 0 0 0 0 0 info para A 1,2 info para A 2,2 info para A 3,3 info para A 1,1 cada posição com elemento da matriz esparsa é mapeada em uma e apenas uma posição da matriz de ponteiros para atribuir o endereço de TIPOCELULA ao primeiro elemento da matriz de ponteiros, escrevese: MATRIZ_PONT[1] &TIPOCELULA para encontrar as informações de TIPOCELULA de A 11, escreve-se ^MATRIZ_PONT[1] 6

matriz esparsa com fragmentação (hashing) a técnica de hashing tem sido aplicada a arquivos em disco como forma de minimizar o tempo de acesso a técnica de fragmentação é o processo de extrair o índice de um elemento da matriz diretamente da informação que deve ser armazenada o índice gerado é chamado de hash e é obtido através de operações com a posição (l,c) do elemento na matriz esparsa, que é convertido em um número para acessar a matriz hashing se houver coincidência de índices (colisões de hash), uma lista encadeada (lista de colisões) é usada para conter as entradas e esta lista tem comprimento zero até que ocorra uma colisão matriz esparsa com fragmentação (hashing) a declaração que cria a matriz hashing é: define MAX xxx; // quantidade possível de elementos não nulos da matriz tipo APONTADOR = ^TIPOCELULA; TIPOCELULA = registro INDICE: inteiro; VALOR: real; PROXIMO: APONTADOR; // ponteiro para o próximo valor com mesmo fragmento fim_registro; tipo MATRIZ_HASH[MAX]: TIPOCELULA; // matriz hashing de max elementos 7

matriz esparsa com fragmentação (hashing) exemplo de matriz hashing para representar 100 elementos não nulos Índice Valor Ponteiro para a lista de colisão 0 1 2 1,1 5,1 1,2.. 2,1 20,1 3,1 3 7,2 : : : : 98 99 o fator mais crítico no uso de hashing é assegurar que o algoritmo distribua os índices uniformemente de forma a evitar longas listas de colisão lista encadeada x árvore binária x matriz de ponteiros x hashing fatores a considerar para escolha de uma abordagem velocidade e eficiência no uso da memória portanto, para qualquer aplicação, deve ser feita uma avaliação de tempo e espaço quando a matriz é muito esparsa, as abordagens que utilizam mais eficientemente a memória são 1. listas encadeadas e árvores binárias: apenas os elementos da matriz que estão realmente sendo usados têm memória alocada para eles 2. o método de hashing está situado entre as abordagens de matriz de ponteiros e árvore binária/lista encadeada 3. a matriz de ponteiros requer que toda a matriz de ponteiros exista, mesmo que alguns de seus elementos não sejam usados. Utiliza memória para toda posição estejam os ponteiros sendo utilizados ou não 8

lista encadeada x árvore binária x matriz de ponteiros x hashing quando a matriz está razoavelmente cheia, ou seja, o grau de esparsidade é pequeno a matriz de ponteiros faz o melhor uso da memória árvore binária/lista encadeada usam dois ponteiros para cada elemento exemplo de uma matriz de ponteiros de 1000 elementos: 2000 bytes lista ou árvore: 4000 bytes em termos de velocidade de execução a abordagem mais rápida é a matriz de ponteiros mas se o uso da memória é crítico: usa-se lista encadeada ou árvore binária Matrizes esparsas: operações além de armazenar matrizes esparsas, as aplicações normalmente exigem a realização de operações sobre essas matrizes, como por exemplo: multiplicar uma dada linha ou coluna por uma constante somar uma constante a todos os elementos de uma linha ou coluna somar duas matrizes esparsas de igual dimensão multiplicar uma dada linha ou coluna por uma constante inverter ou transpor matrizes esparsas como conseqüência desses operações, alguns elementos podem deixar de ser nulos, enquanto que outros podem se tornar nulos quando um elemento da matriz se tornar não nulo, há inserção na estrutura quando um elemento da matriz se torna nulo, há eliminação na estrutura 9

Matrizes esparsas: operações considerando os possíveis tipos de representação (lista, árvore, matriz de ponteiros ou hashing), o trabalho consiste em desenvolver procedimentos para operar as matrizes esparsas nas diversas estruturas de representação apresentadas: inserção, soma, localização, multiplicação, eliminação, impressão a entrada para estes procedimentos consiste dos valores de m e n (número de linhas e colunas da matriz) seguidos de triplas (i, j, valor) para os elementos diferentes de zero da matriz para a matriz do exemplo, a entrada seria: 4 4 1 1 50.0 2 1 10.0 2 3 20.0 4 1-30.0 4 3-60.0 4 4 5 Matrizes esparsas Exercício 1) Utilize lista encadeada para representar a matriz esparsa B seguinte (faça o mapa de representação utilizando células): 0 B = 0 21 12 0 0 0 20 0 Exercício 2) Deseja-se implementar uma matriz (1000x1000) com grau de esparsidade de 99.9% e a velocidade não é um fator importante a considerar, mas a eficiência do uso de memória tem que ser levada em conta. Qual deve ser a melhor estrutura a ser utilizada para sua representação? Justifique sua resposta do ponto de vista da quantidade de bytes utilizados para representála. 10

Matrizes esparsas Exercício 3) Crie um programa para implementar uma matriz esparsa, utilizando-se da técnica de listas encadeadas, que contenha as seguintes funções: cabeçalho: cria a estrutura da matriz esparsa; inclusão: insere um novo elemento em uma posição determinada da matriz; procura: procura o valor de uma determinada posição na matriz; impressão: mostra a matriz na tela; liberação: libera todas as posições alocadas pela matriz, incluindo a estrutura; eliminação: elimina um elemento (A ij ) da matriz; soma: soma todos os elementos da coluna j com a constante k; soma_matriz: soma duas matrizes esparsas multiplica: multiplica duas matrizes esparsas observe que estas operações podem resultar em inserções e/ou eliminações. Exercício 4) Sugira uma representação para matrizes tridimensionais esparsas. Matrizes esparsas Exercício 5) Crie um programa para tratar uma matriz esparsa (25x80), cujos elementos são referenciados por uma matriz de ponteiros, declarada como CEL ^FOLHA[DIM], onde DIM é uma constante definida com o valor 2000 e CEL é o tipo de estrutura dos elementos da matriz, definido como: typedef struct { int LIN,COL; // endereço da célula char CONTEUDO[128]; // conteúdo da celula }CEL; As variáveis LIN e COL armazenam o número da linha e o número da coluna, respectivamente e a variável CONTEUDO[128] armazena o conteúdo da célula. O programa deve conter procedimentos para incluir as células da matriz, para listar as células preenchidas, para mostrar o conteúdo dessas células (dadas linha e coluna) e para eliminar um elemento da matriz já preenchido. 11