概念
用来压缩无效数据(重复且只代表单一意义或状态的数据)较多的数组,减少空间损耗。
方法
普通储存的稀疏数组的列数是固定的,只有三列。
稀疏数组的第一行各列分别记录原始数组的行数,列数,有效值个数。
往后的每行记录各个有效值的 坐标 和 值。
第一列记录有效值的行数,第二列记录有效值的列数,第三列记录有效值的值
所以稀疏数组列数固定为 3,行数为 有效值个数+1。
实现(java)
1.创建一个11*11的原数组
int[][] arr = new int[11][11];arr[1][2] = 1;arr[2][3] = 2;arr[3][5] = 4;arr[5][6] = 5;int count = 0;for (int[] row:arr){for (int item:row){System.out.print(item+"\t");if (item != 0)count++;}System.out.println();}------------------------------------------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 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 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
2.创建稀疏数组并将有效值的坐标赋值给稀疏数组
int[][] sparseArrOut &#61; new int[count&#43;1][3];sparseArrOut[0][0] &#61; 11;sparseArrOut[0][1] &#61; 11;sparseArrOut[0][2] &#61; count;int k&#61;1;for (int i&#61;0; i<arr.length; i&#43;&#43;){for (int j&#61;0; j<arr[i].length; j&#43;&#43;){if (arr[i][j] !&#61; 0){ sparseArrOut[k][2] &#61; arr[i][j];sparseArrOut[k][0] &#61; i;sparseArrOut[k][1] &#61; j;k&#43;&#43;;}}}
3.稀疏数组的磁盘IO读写
try {FileWriter os &#61; new FileWriter(new File("E:/a.txt"));for (int[] row : sparseArrOut){for (int item : row){os.write(item&#43;"\t");}os.write("\r\n");}os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}int[][] sparseArrIn &#61; new int[count&#43;1][3];try {BufferedReader br &#61; new BufferedReader(new FileReader(new File("E:/a.txt")));String line;int row &#61; 0;while ((line &#61; br.readLine()) !&#61; null){String[] temp &#61; line.split("\t");for (int j&#61;0; j<temp.length; j&#43;&#43;){sparseArrIn[row][j] &#61; Integer.parseInt(temp[j]);}row&#43;&#43;;}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}for (int[] row : sparseArrIn) {for (int item : row) {System.out.print(item &#43; "\t");}System.out.println();}------------------------------------------11 11 4 1 2 1 2 3 2 3 5 4 5 6 5
4.还原数组
int[][] origin &#61; new int[sparseArrIn[0][0]] [sparseArrIn[0][1]];for (int i&#61;1; i<sparseArrIn.length; i&#43;&#43;){origin[sparseArrIn[i][0]] [sparseArrIn[i][1]] &#61; sparseArrIn[i][2];}for (int[] row1 : origin){for (int item : row1){System.out.print(item&#43;"\t");}System.out.println();}-------------------------------------------------------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 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 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