資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘

lazyboy2發表於2020-10-28

稀疏矩陣

三元組順序表用於儲存壓縮後的稀疏矩陣

  • 順序儲存表示
#define MAXSIZE 125000//設定非零元素的最大個數為125000
typedef struct{
	int i;//元素行號
    int j;//元素列號
    Element  e;//元素值
}Tripe;
typedef struct {
	Tripe data[MAXSIZE+1];
	int mu;//總行數
	int nu;//總列數
	int tu;//非零元個數
}TsMatrix;

在這裡插入圖片描述

三元組表的順序儲存結構

typedef struct {
	Tripe data[Maxsize+1];
	int nu;//矩陣總列數
	int mu;//矩陣總行數
	int tu;//矩陣中非零元素的個數
}TSMatrix
typedef struct{
    int i;
    int j;
    Elementtype e;
}Tripe;

帶輔助向量的三元組

主要用途

  • 便於高效訪問稀疏矩陣中任一非零元素
i123456
NUM(i)
POS(i)
  • 其中NUM用於儲存每列非零元的個數
  • POS用來記錄每列第一個非零元素在新三元組中的位置
    pos(1)=1
    pos(i)=pos(i-1)+NUM(i-1)
//稀疏矩陣的轉置
演算法思路:
1.將每個三元組中i和j互相調換,再排序,但排序的時間複雜度
至少為o(tu^2)
2.依次從小到大找到最小的i,再轉置
3.利用三元組的輔助向量精確放置轉置後的元素

輔助元素的求解

NUM[i]表示第i列中的非零元素的個數
POS[i]表示第i列第一非零元素在新的三元組中行數
//求解過程如下 
POS[1]=1;
for(int i=1;i<=M.tu;i++)
	num[M.data[i].j]++;//求解列的NUM值
for(int i=2;i<=M.nu;i++)
POS[i]=POS[i-1]+NUM[i-1];//求解POS的值

全部演算法展示

int FastTransposeSMatrx(TSMatirx M,TSMatirx *T)
{
  int col;
  int *NUM,*POS;
  NUM=(int *)malloc((M.nu+1)*sizeof(int));
  POS=(int *)malloc((M.nu+1)*sizeof(int));//動態陣列
  T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;
  if(T.tu)
 {		
 	for(col=1;col<=M.nu;col++)NUM[col]=0;
 	for(int i=1;i<=M.tu;i++)NUM[M.data[i].j]++;
  }//這裡實際是在判斷了T.tu非空
  POS[1]=1;
  for(int i=2;i<=M.nu;i++)
  POS[i]=POS[i-1]+NUM[i-1];
  for(int p=1;p<=M.tu;P++)
  {
     col=M.data[p].j;
     q=POS[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
     POS[col]++;
  }
  return 0;
}

相關文章