Professional Documents
Culture Documents
Matriz: definio
Matriz um arranjo (tabela) retangular de
nmeros dispostos em linhas e colunas
1 0 4 3
A
2
5
3
4
3x 4
9 8 2 1
3 7 4
B
1
0
6
3x3
9 2 8
Matrizes especiais
1 0 0
A
2
3
0
3x3
4 5 6
Triangular inferior
1
B 2
4x 4 0
0
0
8
0 9 10
2 0
4 5
6 7
Tri-diagonal
1
0
0
C
0
7x9
0
0
0
0 0 3 0 0 0 0 0
2 0 0 0 0 0 2 0
0 0 0 0 0 0 0 0
Matriz esparsa:
excessivo n de
0 0 0 0 0 0 0 0
elementos nulos (0)
0 0 0 4 0 0 0 0
0 0 8 0 0 2 0 0
0 0 0 1 0 0 0 0
Matrizes Especiais
Quadradas
Diagonal
M(i,j) = 0 para i diferente j
Tridiagonal
M(i,j) = 0 para | i-j | > 1
Triangular Inferior
0
C
700 x900
0
M
0
0 0
2 0
0 0
0 0
0 0
M M
0 0
0 0 0 L 0
0 0 0 L 0
0 0 0 0 L 0
0 0 0 0 L 0
1 4 0 0 L 0
M M M M
M
0 1 0 0 L 0
3
0
Matrizes esparsas
Uso da matriz tradicional
Vantagem
Ao se representar dessa forma, preserva-se o
acesso direto a cada elemento da matriz
Algoritmos simples
Desvantagem
Muito espao para armazenar zeros
Matrizes esparsas
Necessidade
Mtodo alternativo para representao de
matrizes esparsas
Soluo
Estrutura de lista encadeada contendo
somente os elementos no nulos
Soluo 1
Listas simples encadeadas
3 0 2
A
1
0
0
3x3
0 0 5
linha
coluna
valor
Estrutura de um N:
linha, coluna: posio
valor: zero
next: prx n
1 1 3
1 3 2
0 0 0
2 1 1
0 0 0
3 3 5
0 0 0
next
Soluo 1
Desvantagens
Perda da natureza bidimensional de matriz
Acesso ineficiente linha
Soluo 2
Listas cruzadas
Para cada matriz, usam-se dois vetores com N
ponteiros para as linhas e M ponteiros para as colunas
3 0 2
A
1
0
0
3x3
0 0 5
col[1]
lin[1]
lin[2]
1 1 3
col[2]
col[3]
1 3 2
2 1 -1
Estrutura de um N:
linha coluna valor
proxlin
proxcol
lin[3]
3 3 5
Soluo 2
Listas cruzadas
Cada elemento no nulo mantido
simultaneamente em duas listas
Uma para sua linha
Uma para sua coluna
Estrutura de Dados
typedef reg *preg;
struct reg{
int linha;
/* 1..nl*/
int coluna;
/* 1..nc*/
tipo_elem valor;
preg PL,PC;
};
preg vetorCol[nl];
preg vetorLin[nc];
Matrizes esparsas
Listas cruzadas vs. matriz tradicional
Em termos de espao
Supor que inteiro e ponteiro para inteiro ocupam um
bloco de memria
Listas cruzadas: tamanho do vetor de linhas (nl) +
tamanho do vetor de colunas (nc) + n elementos no
nulos * tamanho do n
nl+nc+5n
Matrizes esparsas
Listas cruzadas vs. matriz tradicional
Em termos de tempo
Operaes mais lentas em listas cruzadas:
acesso no direto
Matrizes esparsas
Listas cruzadas vs. matriz tradicional
Em termos de espao ocupado, vantajoso utilizar a
representao de listas cruzadas quando:
5n + nl + nc < nl * nc
ou seja, quando: n < [(nl - 1) * (nc - 1) -1] / 5
Como (nl - 1) * (nc - 1) aproximadamente o tamanho
da matriz, pode-se dizer, de uma maneira geral, que h
ganho de espao, quando um nmero inferior a 1/5
dos elementos da matriz forem no nulos
Outra soluo
Listas circulares com ns cabeas
Ao invs de vetores de ponteiros, linhas e
colunas so listas circulares com ns cabeas
Ns cabeas: reconhecidos por um 0 (ou -1) no
campo linha ou coluna
1 nico ponteiro para a matriz: navegao em
qualquer sentido
Exemplo
0
A 0
4x4 2
0 0 0
2 0 3
4 0 0
0 1 8
0
A 0
4x 4 2
0 1
0 2
0 3
0 4
N cabea
0
0 0
1 0
2 0
3 0
4 0
2 2 2
3 1 -2
2 4 3
3 2 4
4 3 -1
4 4 8
0 0
2 0
4 0
0 1
0
3
0
col[2]
lin[1]
1 1
lin[2]
2 1 -1
lin[3]
col[3]
1 3
3 3
Exerccio
Implementar uma sub-rotina para somar um nmero
K qualquer a uma coluna da matriz
Usando listas cruzadas
Void soma(preg vetorLin, preg vetorCol, int nl, int nc, int j, int K){
typedef reg *preg;
struct reg{
int linha;
/* 1..nl*/
int coluna;
/* 1..nc*/
tipo_elem valor;
preg PL,PC;
};
preg vetorCol[nl];
preg vetorLin[nc];
void soma(Rec *lin[], Rec *col[], int nl, int nc, int j, int k) {
Rec *p;
int i;
p = col[j];
if (p == NULL) { /* se a coluna possui apenas valores nulos */
for (i=1; i<nl; i++)
void somainserir(i, j, k, lin, col);
return;
}
for (i=1; i<nl; i++) {
if (i != p->linha) /* se o valor nulo */
inserir(i, j, k, lin, col);
else {
p->valor = p->valor + k;
if (p-> valor == 0) { /* se o valor torna-se nulo */
p = p->proxlin;
eliminar(i, j, lin, col);
} else
p = p->proxlin;
}
}
}