稀疏矩阵的原理及java实现
原理

如上图,在一个11X11的二维数组中,其实只有几个有效数字,如果全部存储,会造成空间上的浪费,使用3X3的稀疏数组存储有效值,会节约大量空间。
其中稀疏数组的 row[0][0] :原始二维数组的行 数;row[0][1]:原始二维数组的列数;row[0][2]:原始二维数组有效值的个数。稀疏数组从第二行开始:row[1][0]代表原始二维数组第一个有效值所在的行索引 ;row[1][0]:原始二维数组第一个有效值所在的列索引;row[1][2]:原始二维数组第一个有效值
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
public class SparseArray {
public static void main(String[] args) throws IOException {
int chesssArr1[][] = new int[11][11];
chesssArr1[1][2] = 1; chesssArr1[2][3] = 2; System.out.println("原始二维数组:"); for (int[] row : chesssArr1) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); }
int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if (chesssArr1[i][j] != 0) { sum++; } } }
int sparseArry[][] = new int[sum + 1][3];
sparseArry[0][0] = 11; sparseArry[0][1] = 11; sparseArry[0][2] = sum;
int count = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if (chesssArr1[i][j] != 0) { count++; sparseArry[count][0] = i; sparseArry[count][1] = j; sparseArry[count][2] = chesssArr1[i][j]; } } }
System.out.println("得到的稀疏的数组:");
for (int i = 0; i < sparseArry.length; i++) { System.out.printf("%d\t%d\t%d\t\n", sparseArry[i][0], sparseArry[i][1], sparseArry[i][2]); } System.out.println();
int chesssArr2[][] = new int[sparseArry[0][0]][sparseArry[0][1]];
for (int i = 1; i < sparseArry.length; i++) {
chesssArr2[sparseArry[i][0]][sparseArry[i][1]] = sparseArry[i][2]; }
System.out.println("恢复后的二维数组"); for (int[] row : chesssArr2) { for (int data : row) {
System.out.printf("%d\t", data); } System.out.println(); }
SparseArray a = new SparseArray();
int[][] load_sparseArray = a.load_sparseArray("src\\com\\\\zsf\\day01\\sparse.txt");
System.out.println("读入的稀疏矩阵为~~~~~~~~"); for (int i = 0; i < load_sparseArray.length; i++) { System.out.printf("%d\t%d\t%d\t\n", load_sparseArray[i][0], load_sparseArray[i][1], load_sparseArray[i][2]); } } }
|
稀疏数组的保存与加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public int[][] save_sparseArray(int sparseArry[][], String file_path) throws IOException { String save_dir = file_path; File file = new File(save_dir); if (!file.exists()) { file.createNewFile(); FileWriter fileWriter = new FileWriter(save_dir); for (int i = 0; i < sparseArry.length; i++) { for (int j = 0; j < sparseArry[i].length; j++) { fileWriter.write(sparseArry[i][j] + "\t"); }
fileWriter.write("\r\n"); } fileWriter.close(); System.out.println("保存成功"); }
return null; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public int[][] load_sparseArray(String file_path) throws IOException { File file = new File(file_path); BufferedReader in = new BufferedReader(new FileReader(file)); String line; int row = 0; String[] tem;
int sparseArry[][] = new int[3][3]; int count = 0;
while ((line = in.readLine()) != null) {
tem = line.split("\t"); System.out.printf("%d\t%d\t%d\t\n", Integer.parseInt(tem[0]), Integer.parseInt(tem[1]), Integer.parseInt(tem[2])); sparseArry[count][0] = Integer.parseInt(tem[0]); sparseArry[count][1] = Integer.parseInt(tem[1]); sparseArry[count][2] = Integer.parseInt(tem[2]); count++; } return sparseArry; }
|
实现效果

容易踩坑的点
- 使用 BufferedReader 的api 时要注意,你只要调用过一次 in.read或in.read()文件指针指向文件末尾,即都是0
- 时时记住模块化开发,提高程序的复用性