18.04.2013 Views

Matrizes esparsas - Inatel

Matrizes esparsas - Inatel

Matrizes esparsas - Inatel

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Matrizes</strong> <strong>esparsas</strong>: definição<br />

• o objetivo é mostrar os métodos de armazenamento e manipulação de matrizes<br />

<strong>esparsas</strong><br />

• esparsidade de uma matriz é a relação entre o número de elementos nulos de<br />

uma matriz e o número total de elementos da matriz<br />

– grau de esparsidade é a porcentagem de elementos nulos da matriz<br />

• são matrizes em que nem todos os elementos estão realmente presentes ou<br />

são necessários, portanto, a maioria das posições são preenchidas por zeros<br />

• pode-se economizar um espaço significativo de memória se apenas os termos<br />

diferentes de zero forem armazenados e manuseados<br />

– a eficiência computacional será maior<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: definição<br />

• matrizes são consideradas <strong>esparsas</strong> quando<br />

– suas dimensões são relativamente grandes (1000 x 1000)<br />

– nem todas as suas posições são usadas (o número de valores não nulos é da ordem<br />

do número de linhas ou do número de colunas, de 1 milhão usa-se 1000 elementos)<br />

• casos unidimensionais (vetores), bidimensionais e tridimensionais<br />

• aplicações:<br />

– em problemas de engenharia, física etc. (método das malhas para resolução de<br />

circuitos elétricos)<br />

– em computação: armazenamento de dados (planilhas eletrônicas, apenas uma<br />

porção da matriz pode estar sendo usada em um dado momento)<br />

• as operações usuais sobre estas matrizes (somar, multiplicar, inverter, pivotar)<br />

também podem ser feitas em tempo muito menor se não são armazenadas as<br />

posições que contém zeros<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• em vez de representar todos os valores, armazena-se números de linha e<br />

coluna dos elementos com valor não nulo<br />

• exemplo de uma matriz esparsa de 5 x 5 elementos inteiros<br />

– armazena-se 15 inteiros (linha, coluna, elemento), em vez de 25 inteiros<br />

– { (2,2,1), (2,4,2), (3,3,3), (4,2,4), (4,4,5) }<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• é necessário usar uma representação que evite o armazenamento de<br />

tantas posições nulas<br />

• existem quatro técnicas para representar uma matriz esparsa:<br />

– lista encadeada<br />

– árvore binária<br />

– matriz de ponteiros<br />

– fragmentação ou hashing<br />

• estas técnicas são realmente úteis para matrizes com uma<br />

porcentagem significativa de elementos nulos (zeros); se este não for o<br />

caso, o melhor é usar o método de armazenamento comum<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

matriz esparsa com lista encadeada<br />

– estrutura que contenha os seguintes itens<br />

• os elementos a serem armazenados<br />

• a posição lógica dentro da matriz<br />

• as ligações com o elemento anterior e próximo<br />

– vantagem<br />

• faz uso eficiente da memória<br />

– desvantagem<br />

• precisa usar uma pesquisa linear para acessar as células da lista (requer n/2<br />

comparações, n é o número de elementos da lista)<br />

• sem uso de informação adicional (memória adicional) não há como realizar uma<br />

pesquisa binária para localizar uma célula<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com lista encadeada<br />

– cada coluna e cada linha da matriz será representada por uma lista linear circular<br />

com uma célula cabeça<br />

– cada célula da estrutura, além das células-cabeça, representará os termos diferentes<br />

de zero da matriz e devem ter o seguinte tipo:<br />

tipo APONTADOR = ^ TIPOCELULA;<br />

TIPOCELULA = registro<br />

DIREITA, ABAIXO: APONTADOR;<br />

LINHA, COLUNA: inteiro;<br />

VALOR: real;<br />

fim_registro;<br />

– cada estrutura é colocada na lista com os elementos inseridos de forma ordenada,<br />

baseada no índice da matriz, ou seja, o elemento A 1,2 precede o elemento A 1,3 .<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com lista encadeada<br />

– o campo ABAIXO deve ser usado para apontar o próximo elemento diferente de zero na mesma<br />

coluna<br />

– o campo DIREITA deve ser usado para apontar o próximo elemento diferente de zero na mesma<br />

linha<br />

– dada uma matriz A, para um valor A(i,j) diferente de zero, deverá haver uma célula com<br />

• o campo VALOR contendo o elemento de A(i,j)<br />

• o campo LINHA contendo i e<br />

• o campo COLUNA contendo j<br />

• esta célula deverá pertencer à lista circular da linha i e também deverá pertencer à lista<br />

circular da coluna j.<br />

• cada célula pertencerá a duas listas ao mesmo tempo<br />

– para diferenciar as células cabeça, -1 é colocado nos campos LINHA e COLUNA destas células<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com lista encadeada<br />

– uma matriz esparsa com r elementos diferentes de zero gastará (m + n + r) + 1<br />

células<br />

– considere a matriz esparsa A (4 x 4):<br />

– a matriz A pode ser vista através de um representação de 15 células = (4 linhas + 4<br />

colunas + 6 elementos) + 1<br />

– cada célula ocupa vários bytes na memória; no entanto, o total de memória usado<br />

será menor do que as posições necessárias para representar a matriz toda, desde<br />

que r seja suficientemente pequeno<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


matriz esparsa com<br />

lista encadeada:<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com árvore binária<br />

– lista duplamente encadeada<br />

– vantagens<br />

• pode ser “varrida” rapidamente: inserções e consultas rápidas (requer log 2 n comparações)<br />

• usa eficientemente a memória<br />

– cada célula da estrutura, representará os termos diferentes de zero da matriz e<br />

devem ter o seguinte tipo:<br />

tipo APONTADOR = ^TIPOCELULA;<br />

TIPOCELULA = registro<br />

ESQUERDA, DIREITA: APONTADOR; // ponteiros para as subárvores esquerda e direita<br />

LINHA, COLUNA: inteiro;<br />

VALOR: real;<br />

fim_registro;<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com matriz de ponteiros<br />

– exige muito menos armazenamento permanente que uma matriz inteira porque ela<br />

armazena ponteiros para a informação<br />

– o método de matriz de ponteiros fornece um acesso muito mais rápido aos<br />

elementos da matriz que os métodos da lista encadeada ou árvore binária<br />

– quando se atribui dados a uma localização de matriz<br />

• uma memória é alocada para esses dados<br />

• o ponteiro apropriado na matriz de ponteiro seria definido para apontar para esses dados<br />

– a declaração que cria esta matriz de ponteiros é:<br />

TIPOCELULA = registro<br />

LINHA, COLUNA: inteiro;<br />

VALOR: real;<br />

fim_registro;<br />

tipo ^MATRIZ_PONT[xxx]: TIPOCELULA; // matriz de ponteiros de xxx (mxn) elementos<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com matriz de ponteiros<br />

– antes que uma matriz de ponteiros possa ser usada, cada elemento deve ser inicializado com<br />

nulo, isto indica que não há entrada nesta posição<br />

– a figura abaixo mostra um exemplo de uma matriz de ponteiros como suporte para uma matriz<br />

esparsa (4x3), onde existem elementos não nulos em A 11 , A 12 , A 22 , A 33<br />

. . . .<br />

info para A 1,1<br />

info para A 1,2<br />

0 0 0 0 0 0 0 0<br />

info para A 2,2<br />

info para A 3,3<br />

– cada posição com elemento da matriz esparsa é mapeada em uma e apenas uma posição da<br />

matriz de ponteiros<br />

– para atribuir o endereço de TIPOCELULA ao primeiro elemento da matriz de ponteiros, escrevese:<br />

MATRIZ_PONT[1] &TIPOCELULA<br />

– para encontrar as informações de TIPOCELULA de A 11 , escreve-se ^MATRIZ_PONT[1]<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com fragmentação (hashing)<br />

– a técnica de hashing tem sido aplicada a arquivos em disco como forma de<br />

minimizar o tempo de acesso<br />

– a técnica de fragmentação é o processo de extrair o índice de um elemento<br />

da matriz diretamente da informação que deve ser armazenada<br />

– o índice gerado é chamado de hash e é obtido através de operações com a<br />

posição (l,c) do elemento na matriz esparsa, que é convertido em um<br />

número para acessar a matriz hashing<br />

– se houver coincidência de índices (colisões de hash), uma lista encadeada<br />

(lista de colisões) é usada para conter as entradas e esta lista tem<br />

comprimento zero até que ocorra uma colisão<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com fragmentação (hashing)<br />

– a declaração que cria a matriz hashing é:<br />

define MAX xxx; // quantidade possível de elementos não nulos da matriz<br />

tipo APONTADOR = ^TIPOCELULA;<br />

TIPOCELULA = registro<br />

INDICE: inteiro;<br />

VALOR: real;<br />

PROXIMO: APONTADOR; // ponteiro para o próximo valor com mesmo fragmento<br />

fim_registro;<br />

tipo MATRIZ_HASH[MAX]: TIPOCELULA; // matriz hashing de max elementos<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• matriz esparsa com fragmentação (hashing)<br />

– exemplo de matriz hashing para representar 100 elementos não nulos<br />

0<br />

1<br />

2<br />

3<br />

:<br />

:<br />

98<br />

99<br />

Índice<br />

1,1<br />

5,1<br />

1,2<br />

7,2<br />

:<br />

:<br />

Valor<br />

Ponteiro para a lista de colisão<br />

.<br />

.<br />

NULL<br />

NULL<br />

NULL<br />

NULL<br />

NULL<br />

NULL<br />

– o fator mais crítico no uso de hashing é assegurar que o algoritmo distribua os<br />

índices uniformemente de forma a evitar longas listas de colisão<br />

www.inatel.br/docentes/rosanna C421-C<br />

2,1<br />

20,1<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• lista encadeada x árvore binária x matriz de ponteiros x hashing<br />

– fatores a considerar para escolha de uma abordagem<br />

• velocidade e eficiência no uso da memória<br />

– portanto, para qualquer aplicação, deve ser feita uma avaliação de tempo e espaço<br />

– quando a matriz é muito esparsa, as abordagens que utilizam mais eficientemente<br />

a memória são<br />

• listas encadeadas e árvores binárias: apenas os elementos da matriz que estão realmente<br />

sendo usados têm memória alocada para eles<br />

• o método de hashing está situado entre as abordagens de matriz de ponteiros e árvore<br />

binária/lista encadeada<br />

• a matriz de ponteiros requer que toda a matriz de ponteiros exista, mesmo que alguns de<br />

seus elementos não sejam usados. Utiliza memória para toda posição estejam os ponteiros<br />

sendo utilizados ou não<br />

www.inatel.br/docentes/rosanna C421-C<br />

3,1<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: representação<br />

• lista encadeada x árvore binária x matriz de ponteiros x hashing<br />

– quando a matriz está razoavelmente cheia, ou seja, o grau de esparsidade<br />

é pequeno<br />

• a matriz de ponteiros faz o melhor uso da memória<br />

• árvore binária/lista encadeada usam dois ponteiros para cada elemento<br />

• exemplo de uma matriz de ponteiros de 1000 elementos: 2000 bytes<br />

• lista ou árvore: 4000 bytes<br />

– em termos de velocidade de execução a abordagem mais rápida é a<br />

matriz de ponteiros<br />

– mas se o uso da memória é crítico: usa-se lista encadeada ou árvore<br />

binária<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong>: operações<br />

• além de armazenar matrizes <strong>esparsas</strong>, as aplicações normalmente<br />

exigem a realização de operações sobre essas matrizes, como por<br />

exemplo:<br />

– multiplicar uma dada linha ou coluna por uma constante<br />

– somar uma constante a todos os elementos de uma linha ou coluna<br />

– somar duas matrizes <strong>esparsas</strong> de igual dimensão<br />

– multiplicar uma dada linha ou coluna por uma constante<br />

– inverter ou transpor matrizes <strong>esparsas</strong><br />

• como conseqüência desses operações, alguns elementos podem<br />

deixar de ser nulos, enquanto que outros podem se tornar nulos<br />

– quando um elemento da matriz se tornar não nulo, há inserção na<br />

estrutura<br />

– quando um elemento da matriz se torna nulo, há eliminação na estrutura<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong>: operações<br />

• considerando os possíveis tipos de representação (lista, árvore, matriz de<br />

ponteiros ou hashing), o trabalho consiste em desenvolver procedimentos para<br />

operar as matrizes <strong>esparsas</strong> nas diversas estruturas de representação<br />

apresentadas:<br />

– inserção, soma, localização, multiplicação, eliminação, impressão<br />

• a entrada para estes procedimentos consiste dos valores de m e n (número de<br />

linhas e colunas da matriz) seguidos de triplas (i, j, valor) para os elementos<br />

diferentes de zero da matriz<br />

– para a matriz do exemplo, a entrada seria:<br />

• 4 4<br />

• 1 1 50.0<br />

• 2 1 10.0<br />

• 2 3 20.0<br />

• 4 1 -30.0<br />

• 4 3 -60.0<br />

• 4 4 5<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong><br />

• Exercício 1) Utilize lista encadeada para representar a matriz esparsa B<br />

seguinte (faça o mapa de representação utilizando células):<br />

0<br />

<br />

B<br />

0<br />

<br />

21<br />

12<br />

0<br />

0<br />

0 <br />

<br />

20<br />

0 <br />

<br />

• Exercício 2) Deseja-se implementar uma matriz (1000x1000) com grau de<br />

esparsidade de 99.9% e a velocidade não é um fator importante a considerar,<br />

mas a eficiência do uso de memória tem que ser levada em conta. Qual deve<br />

ser a melhor estrutura a ser utilizada para sua representação? Justifique sua<br />

resposta do ponto de vista da quantidade de bytes utilizados para representála.<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME


<strong>Matrizes</strong> <strong>esparsas</strong><br />

• Exercício 3) Crie um programa para implementar uma matriz esparsa,<br />

utilizando-se da técnica de listas encadeadas, que contenha as seguintes<br />

funções:<br />

– cabeçalho: cria a estrutura da matriz esparsa;<br />

– inclusão: insere um novo elemento em uma posição determinada da matriz;<br />

– procura: procura o valor de uma determinada posição na matriz;<br />

– impressão: mostra a matriz na tela;<br />

– liberação: libera todas as posições alocadas pela matriz, incluindo a estrutura;<br />

– eliminação: elimina um elemento (A ij ) da matriz;<br />

– soma: soma todos os elementos da coluna j com a constante k;<br />

– soma_matriz: soma duas matrizes <strong>esparsas</strong><br />

– multiplica: multiplica duas matrizes <strong>esparsas</strong><br />

observe que estas operações podem resultar em inserções e/ou eliminações.<br />

• Exercício 4) Sugira uma representação para matrizes tridimensionais <strong>esparsas</strong>.<br />

www.inatel.br/docentes/rosanna C421-C<br />

<strong>Matrizes</strong> <strong>esparsas</strong><br />

• Exercício 5) Crie um programa para tratar uma matriz esparsa (25x80), cujos<br />

elementos são referenciados por uma matriz de ponteiros, declarada como CEL<br />

^FOLHA[DIM], onde DIM é uma constante definida com o valor 2000 e CEL é o<br />

tipo de estrutura dos elementos da matriz, definido como:<br />

typedef struct {<br />

int LIN,COL; // endereço da célula<br />

char CONTEUDO[128]; // conteúdo da celula<br />

}CEL;<br />

As variáveis LIN e COL armazenam o número da linha e o número da coluna,<br />

respectivamente e a variável CONTEUDO[128] armazena o conteúdo da célula.<br />

O programa deve conter procedimentos para incluir as células da matriz, para<br />

listar as células preenchidas, para mostrar o conteúdo dessas células (dadas<br />

linha e coluna) e para eliminar um elemento da matriz já preenchido.<br />

www.inatel.br/docentes/rosanna C421-C<br />

ME<br />

ME

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!