java實(shí)現(xiàn)稀疏矩陣的壓縮與解壓的方法
任務(wù)要求
把棋盤當(dāng)作一個稀疏矩陣,0表示沒棋,1表示黑棋,2表示藍(lán)棋。
把該稀疏矩陣壓縮以三元組形式表示并以文件形式保存,再寫另一個程序讀取文件中的信息把壓縮后的三元組還原成原來的稀疏矩陣。
其中三元組的第一行用來存儲原始稀疏矩陣的行數(shù)、列數(shù)和有效的數(shù)據(jù)個數(shù),其余行用來存儲有效的非0數(shù)據(jù)

思路分析
稀疏矩陣的壓縮
- 遍歷原始的稀疏矩陣,得到有效的數(shù)據(jù)個數(shù)sum
- 根據(jù)sum創(chuàng)建三元組
new int [sum+1] [3](即sum+1行3列的二維數(shù)組) - 將二維數(shù)據(jù)的有效數(shù)據(jù)存入三元組中
稀疏矩陣的解壓
- 先讀取三元組的第一行,根據(jù)第一行的數(shù)據(jù)創(chuàng)建一個二維數(shù)組
- 再讀取三元組的后面幾行,并賦值給該二維數(shù)組即可
代碼實(shí)現(xiàn)
稀疏矩陣的壓縮
package zone.lxy.sparsearray;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/*
* 把稀疏矩陣壓縮成三元組
* */
public class Compress {
public static void main(String[] args) throws IOException {
// 創(chuàng)建一個稀疏矩陣11*11
// 0表示沒有棋子
// 1表示黑子
// 2表示白子
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
// 輸出原始的稀疏矩陣
System.out.println("原始的稀疏矩陣:");
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
System.out.print(chessArr1[i][j] + " ");
}
System.out.println();
}
// 對稀疏矩陣壓縮存儲
// 1.先遍歷稀疏矩陣記錄非0元素的個數(shù)
int sum = 0;
if (chessArr1[i][j] != 0) {
sum++;
}
// 2.創(chuàng)建對應(yīng)的三元組并初始化
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
// 3.把稀疏矩陣中的非0元素放到三元組中
int count = 1;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
count++;
// 輸出生成的三元組
System.out.println("得到壓縮后的三元組:");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
// 把該三元組以文件形式保存起來,壓縮完成
FileOutputStream fos = new FileOutputStream("map.data");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(sparseArr);
oos.close();
fos.close();
}
}
// 輸出結(jié)果
原始的稀疏矩陣:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
得到壓縮后的三元組:
11 11 2
1 2 1
2 3 2 稀疏矩陣的解壓
package zone.lxy.sparsearray;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/*
* 把三元組還原成稀疏矩陣
* */
public class DeCompress {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 讀取文件并賦值
FileInputStream fis = new FileInputStream("map.data");
ObjectInputStream ois = new ObjectInputStream(fis);
int[][] sparseArr = (int[][]) ois.readObject();
ois.close();
fis.close();
// 輸出文件中的存儲的三元組
System.out.println("得到壓縮后的三元組:");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
}
// 先讀取三元組的第一行,根據(jù)第一行數(shù)據(jù)創(chuàng)建原始的稀疏矩陣
int row = sparseArr[0][0];
int col = sparseArr[0][1];
int[][] chessArr = new int[row][col];
// 從第二行開始讀取三元組并賦值給稀疏矩陣
for (int a = 1; a <sparseArr.length; a++) {
int i = sparseArr[a][0];
int j = sparseArr[a][1];
int val = sparseArr[a][2];
chessArr[i][j] = val;
}
// 輸出解壓后的稀疏矩陣
System.out.println("解壓后的二維數(shù)組:");
for (int[] i : chessArr) {
for (int item : i) {
System.out.printf("%d ", item);
}
System.out.println();
}
}
}
// 輸出結(jié)果
得到壓縮后的三元組:
11 11 2
1 2 1
2 3 2
解壓后的二維數(shù)組:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 到此這篇關(guān)于java實(shí)現(xiàn)稀疏矩陣的壓縮與解壓 的文章就介紹到這了,更多相關(guān)java稀疏矩陣壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的do while循環(huán)控制語句基本使用
這篇文章主要介紹了Java中的do while循環(huán)控制語句基本使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java中HTTP GET方法調(diào)用帶有body的問題解決
這篇文章主要為大家詳細(xì)介紹了Java如何解決HTTP GET方法調(diào)用帶有body的問題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2024-02-02
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之網(wǎng)上花店商城的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+servlet+mysql+ajax實(shí)現(xiàn)一個網(wǎng)上花店商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11
Java性能工具JMeter實(shí)現(xiàn)上傳與下載腳本編寫
性能測試工作中,文件上傳也是經(jīng)常見的性能壓測場景之一,那么 JMeter 文件上傳下載腳本怎么做,本文詳細(xì)的來介紹一下,感興趣的可以了解一下2021-07-07
SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置
在當(dāng)今互聯(lián)的世界中,了解客戶端的地理位置對于提供個性化服務(wù)和增強(qiáng)用戶體驗(yàn)至關(guān)重要,使用本文為大家介紹了SpringBoot獲取客戶端IP地理位置的相關(guān)方法,需要的小伙伴可以參考下2023-11-11
SpringCloud?LoadBalancerClient?負(fù)載均衡原理解析
LoadBalancerClient?是?SpringCloud?提供的一種負(fù)載均衡客戶端,Ribbon?負(fù)載均衡組件內(nèi)部也是集成了?LoadBalancerClient?來實(shí)現(xiàn)負(fù)載均衡,本文給大家深入解析?LoadBalancerClient?接口源碼,感興趣的朋友跟隨小編一起看看吧2022-02-02

