java實(shí)現(xiàn)稀疏矩陣的壓縮與解壓的方法
任務(wù)要求
把棋盤當(dāng)作一個(gè)稀疏矩陣,0表示沒棋,1表示黑棋,2表示藍(lán)棋。
把該稀疏矩陣壓縮以三元組形式表示并以文件形式保存,再寫另一個(gè)程序讀取文件中的信息把壓縮后的三元組還原成原來的稀疏矩陣。
其中三元組的第一行用來存儲(chǔ)原始稀疏矩陣的行數(shù)、列數(shù)和有效的數(shù)據(jù)個(gè)數(shù),其余行用來存儲(chǔ)有效的非0數(shù)據(jù)
思路分析
稀疏矩陣的壓縮
- 遍歷原始的稀疏矩陣,得到有效的數(shù)據(jù)個(gè)數(shù)sum
- 根據(jù)sum創(chuàng)建三元組
new int [sum+1] [3]
(即sum+1行3列的二維數(shù)組) - 將二維數(shù)據(jù)的有效數(shù)據(jù)存入三元組中
稀疏矩陣的解壓
- 先讀取三元組的第一行,根據(jù)第一行的數(shù)據(jù)創(chuàng)建一個(gè)二維數(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)建一個(gè)稀疏矩陣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(); } // 對(duì)稀疏矩陣壓縮存儲(chǔ) // 1.先遍歷稀疏矩陣記錄非0元素的個(gè)數(shù) int sum = 0; if (chessArr1[i][j] != 0) { sum++; } // 2.創(chuàng)建對(duì)應(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(); // 輸出文件中的存儲(chǔ)的三元組 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring實(shí)現(xiàn)一個(gè)簡(jiǎn)單的SpringIOC容器
本篇文章主要介紹了Spring實(shí)現(xiàn)一個(gè)簡(jiǎn)單的SpringIOC容器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04解決沒有@RunWith 和 @SpringBootTest注解或失效問題
這篇文章主要介紹了解決沒有@RunWith 和 @SpringBootTest注解或失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Java并發(fā)編程線程間通訊實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Java并發(fā)編程線程間通訊實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05