稀疏矩陣的壓縮存儲及其操作


前言

  • 按照壓縮存儲的概念,只存儲稀疏矩陣的非零元;
  • 一個三元組即可確定矩陣M的一個非零元;
  • 主要有三種方法存儲稀疏矩陣:三元組順序表、行邏輯鏈接的順序表、十字鏈表。

三元組順序表

結構體和頭文件

#include <stdio.h>
#include <stdlib.h>  
#define MAXSIZE 12500

typedef struct {
	int i, j;		//	非零元的行號,列號 
	int e; 
}Triple;

typedef struct {
	Triple data[MAXSIZE+1];
	int mu, nu, tu;		//矩陣的行數,列數,非零元個數 
}TSMatrix;

創建和存儲稀疏矩陣

//創建稀疏矩陣 
void create(TSMatrix *M, int mu, int nu, int tu) {
	(*M).mu = mu;
	(*M).nu = nu;
	(*M).tu = tu;
	M = (TSMatrix *) malloc (tu * sizeof(Triple));
}

//壓縮存儲稀疏矩陣 
void init(TSMatrix *M) {
	for(int n = 1; n <= (*M).tu; n++) {
		printf("輸入第%d個非零元,格式為“行號 列號 值”(空格隔開):", n); 
		int row, col, value;
		scanf("%d %d %d", &row, &col, &value);
		(*M).data[n].i = row;
		(*M).data[n].j = col;
		(*M).data[n].e = value;
	}
}

打印矩陣在終端

//打印稀疏矩陣 
//方法一 
//先將壓縮稀疏矩陣轉化為普通稀疏矩陣
//再用兩層for循環,以矩陣(表格)形式輸出 
//方法二,直接輸出,沒有格式 
void display_TSMatrix(TSMatrix M) {
//	for (int row = 1; row <= M.mu; row++) {
//		for (int col; col <= M.nu; col++) {
//			printf("%3d", M.data[mu*(row-1)+col].e);
//		}
//		printf("\n");
//	} 
	for (int n = 1; n <= M.tu; n++) {
		printf("(%d,%d,%d)\n", M.data[n].i, M.data[n].j, M.data[n].e);
	}
	printf("\n\n");
}

對矩陣的轉置

//對壓縮稀疏矩陣M轉置,並返回轉置后的壓縮稀疏矩陣 
TSMatrix TransposeSMatrix(TSMatrix M) {
	TSMatrix T;
	create(&T, M.nu, M.mu, M.tu);
	if(T.tu) {
		int q = 1;
		for (int col = 1; col <= M.mu; ++col)
			for (int p = 1; p <= M.tu; ++p)
				if(M.data[p].j == col) {
					T.data[q].i = M.data[p].j;
					T.data[q].j = M.data[p].i;
					T.data[q].e = M.data[p].e;
					++q;
				}
	}
	return T;
}

快速轉置法

//對壓縮稀疏矩陣M的轉置第二種方法
TSMatrix FastTransposeSMatrix(TSMatrix M) {
	TSMatrix T;
	create(&T, M.nu, M.mu, M.tu);
	int num[M.tu], cpot[M.tu];
	if (T.tu != 0){
		for(int col=1; col <= M.nu; ++col) 
			num[col] = 0;
		for(int t = 1; t<=M.tu; ++t) 
			++num[M.data[t].j];
		cpot[1]= 1;
		for(int col = 2; col <= M.nu; ++col) 
			cpot[col] = cpot[col-1] + num[col-1];
		
		for(int p=1; p<= M.tu; ++p){
			int col = M.data[p].j;
			int q = cpot[col];
			T.data[q].i = M.data[p].j;
			T.data[q].j = M.data[p].i;
			T.data[q].e = M.data[p].e;
			++ cpot[col];
		}
	}
	return T;
} 

主函數

int main() {
	
	TSMatrix M;
	int m_mu, m_nu, m_tu; 
	printf("輸入稀疏矩陣的行數、列數和非零元個數(以英文逗號隔開):");
	scanf("%d,%d,%d", &m_mu, &m_nu, &m_tu);
	create(&M, m_mu, m_nu, m_tu);
	init(&M);
	printf("矩陣M: \n");
	display_TSMatrix(M);
	
	TSMatrix T = TransposeSMatrix(M);
	printf("M轉置后的矩陣為:\n");
	display_TSMatrix(T);
	
	
	return 0;
}

輸入、輸出

TSMatrix.png

行邏輯鏈接的順序表

待續

十字鏈表

待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM