Você está na página 1de 2

Matrizes esparsas Matrizes so consideradas esparsas quando:

Suas dimenses so relativamente grandes (1000 x 1000). Nem todas as suas posies so usadas (o nmero de valores no nulos da ordem do nmero de linhas ou do nmero de colunas, de 1 milho usa-se 1000 elementos).

Aplicaes:
Em problemas de engenharia, fsica etc. (mtodo das malhas para resoluo de circuitos eltricos). Em computao: armazenamento de dados (planilhas eletrnicas, apenas uma poro da matriz pode estar sendo usada em um dado momento).

necessrio usar uma representao que evite o armazenamento de tantas posies nulas. Existem quatro tcnicas para representar uma matriz esparsa:
lista encadeada rvore binria matriz de ponteiros fragmentao ou hashing

estas tcnicas so realmente teis para matrizes com uma porcentagem significativa de elementos nulos (zeros); se este no for o caso, o melhor usar o mtodo de armazenamento comum. Exemplo:
// Numero maximo de ns da lista #define MAX 10 // Definio do tipo do elemento da matriz esparsa typedef int telem; // Definicao do tipo Matriz Esparsa typedef telem* tme[MAX]; Inicializar a matriz void inicializa( tme m ) { int i; for (i=0; i<MAX; i++) m[i] = NULL; // Inicializa todas as posies com NULL } Verificar se uma matriz esparsa est vazia int vazia (tme m) { int i; for (i=0; i<MAX; i++) if (m[i] != NULL) return 0; // Matriz no vazia return 1; // Matriz vazia } Verificar se uma matriz esparsa est cheia int cheia (tme m) { int i;

for (i=0; i<MAX; i++) if (m[i] == NULL) return 0; // Matriz no cheia return 1; // Matriz cheia } Obter a quantidade de elementos ocupados da matriz esparsa int tamanho( tlista lst) { int i, cont=0; for (i=0; i<MAX; i++) if (m[i] != NULL) cont++; return cont; } Insero de um elemento na matriz esparsa int inserir (tme m, int pos, telem valor) { if (pos<1 || pos>MAX) return 0; // Erro - Insero fora dos limites da matriz if (m[pos-1] != NULL) return 0; // Erro - posio j ocupada // Aloca memria para o elemento que ser inserido na matriz m[pos-1] = (telem*) malloc(sizeof(telem)); if (m[pos-1] == NULL) return 0; // Erro - memria insuficiente *m[pos-1] = valor; return 1; // Insero bem sucedida } Remoo de um elemento da matriz esparsa int remover (tme m, int pos, telem *valor) { if (pos<1 || pos>MAX) return 0; // Erro - Remoo fora dos limites da matriz if (m[pos-1] == NULL) return 0; // Erro - posio no ocupada // Armazena uma cpia do elemento que ser removido *valor = *m[pos-1]; // Libera a memria ocupada pelo dado removido free(m[pos-1]); m[pos-1] = NULL; return 1; // Remoo bem-sucedida } Exibindo os elementos da matriz void imprimir (tme m) { int i; for (i=0; i<MAX; i++) if (m[i] != NULL) printf("%d\n", *m[i]); }

Você também pode gostar