三元組表壓縮存儲稀疏矩陣實現稀疏矩陣的快速轉置(Java語言描述)
用經典矩陣轉置算法和普通的三元組矩陣轉置在時間復雜度上都是不樂觀的。快速轉置算法在增加適當存儲空間后實現快速轉置具體原理見代碼注釋部分,時間復雜度為O(nu+tu);個人認為重排三元組之間的次序一步可以省略,雖然三元組數據變得雜亂無章,但是可以把時間復雜度提高到O(tu),如果是不考慮三元組,直接輸出轉置后的矩陣就可以采用這種方法;行邏輯鏈接實現稀疏矩陣相乘,十字鏈表實現稀疏矩陣相加正在編寫中,即將更新。聲明:轉載,引用請以鏈接形式指明出處。
三元組類Triple.java
package 稀疏矩陣的運算;
public class Triple<T> {
int row,col;
T v;
public Triple(){}
public Triple(int row,int col, T v){
this.row = row;
this.col = col;
this.v = v;
}
}
稀疏矩陣類Mat.java
package 稀疏矩陣的運算;
public class Mat {
final int MAXSIZE = 10;
int mu,nu,tu;
Triple<Integer> data[] = new Triple[MAXSIZE + 1];//Java不支持泛型數組
public Mat(int mu,int nu,int tu){
this.mu = mu;
this.nu = nu;
this.tu = tu;
for(int i=1; i<=MAXSIZE; i++)
data[i] = new Triple();
}
public void display(){
int i,j,k,m,n,count = 0;
for(i=1; i<=mu; i++){
for(j=1; j<=nu; j++){
for(k=1; k<=tu; k++){
if(i==data[k].row && j==data[k].col){
System.out.print(data[k].v + " ");
count = -1;
break;
}
}
if(count != -1)
System.out.print("0 ");
count = 0;
}
System.out.println();
}
}
}
快速轉置Transfer.java
package 稀疏矩陣的運算;
import java.util.*;
public class Transfer {
public static void main(String[] args) {
int i,j,k,l;
Scanner scan = new Scanner(System.in);
System.out.println("請輸入矩陣的行數,列數,非零元的個數:");
int mu,nu,tu;
mu = scan.nextInt();
nu = scan.nextInt();
tu = scan.nextInt();
Mat M1 = new Mat(mu,nu,tu);
Mat M2 = new Mat(nu,mu,tu);
System.out.println("請輸入矩陣的三元組:");
for(i=1; i<=tu; i++){
M1.data[i].row = scan.nextInt();
M1.data[i].col = scan.nextInt();
M1.data[i].v = scan.nextInt();
}
System.out.println("您輸入的矩陣為:");
M1.display();
//增加兩個向量
int num[] = new int[nu+1];//M1中第col列中非零元的個數
int col,row,t;
for(col=1; col<=nu; col++){
num[col] = 0;
}
for(t=1; t<=tu; t++){
num[M1.data[t].col]++;
}
int cpot[] = new int[nu+1];//M1中第col列的第一個非零元在M2.data中的位置。
cpot[1] = 1;
for(col=2; col<=nu; col++){
cpot[col] = cpot[col - 1] + num[col - 1];
}
int p,q;//實現轉置
for(p=1; p<=tu; p++){
col = M1.data[p].col;
q = cpot[col];
M2.data[q].row = M1.data[p].col;
M2.data[q].col = M1.data[p].row;
M2.data[q].v = M1.data[p].v;
cpot[col]++;
}
System.out.println("轉置后的矩陣為:");
M2.display();
}
}