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