数据结构--稀疏数组
一、稀疏数组
1、用处:当一个数组中大部分元素为0, 或者为同一个值的数组时, 可以使用稀疏数组来保存该数组。
如下所示。二维数组中只有两个数不为0,绝大部分为重复的数,所以可以使用稀疏数组,将二维数组转换为一个较小的数组,节省存储空间

2、构成:稀疏数组为一个n行3列的二维数组。
第一行:三列分别记录原二维数组的:总行数 总列数 不同于绝大部分重复值的总个数
第二行:从原数组第一行开始,按行查找不同值。三列分别记录了
第一个不同值的: 所在行数 所在列数 值
第三行:从原数组第一行开始,按行查找不同值。三列分别记录了
第二个不同值的: 所在行数 所在列数 值
.........
第n行:从原数组第一行开始,按行查找不同值。三列分别记录了
第n-1个不同值的: 所在行数 所在列数 值

3、稀疏数组的应用
(一)二维数组转换为稀疏数组
思路:1、遍历二维数组,得到不同值的个数sum。以(sum+1)作为稀疏数组的行数
2、创建稀疏数组 int[][] arrays=new int[sum+1][3]
3、将二维数组的有效值存入稀疏数组中。
代码实现:
1 public static int[][] sour2sparse(int[][] sourArrays,String filename) { 2 //0、创建一个 11*11的二维数组,并给其赋值 3 // int[][] sourArrays=new int[11][11]; 4 // sourArrays[1][2]=1; 5 // sourArrays[2][3]=2; 6 //1、遍历数组,获得值不为0的个数 7 int sum = 0; 8 for (int i = 0; i < sourArrays.length; i++) { 9 for (int j = 0; j < sourArrays[i].length; j++) { 10 if (sourArrays[i][j] != 0) { 11 sum++; 12 } 13 } 14 } 15 //2、创建稀疏数组,并赋值 16 int[][] sparseArrays = new int[sum + 1][3]; 17 sparseArrays[0][0] = sourArrays.length; 18 sparseArrays[0][1] = sourArrays.length; 19 sparseArrays[0][2] = sum; 20 int cou = 0; 21 for (int i = 0; i < sourArrays.length; i++) { 22 for (int j = 0; j < sourArrays[i].length; j++) { 23 if (sourArrays[i][j] != 0) { 24 cou++; 25 sparseArrays[cou][0] = i;//稀疏数组第n行1列,记录第n个不同值所在的行数i 26 sparseArrays[cou][1] = j;//稀疏数组第n行2列,记录第n个不同值所在的列数j 27 sparseArrays[cou][2] = sourArrays[i][j];//稀疏数组第n行3列,记录第n个不同值 28 } 29 } 30 } 31 //3、将数组保存到文件中 32 try { 33 File file=new File(filename); 34 FileWriter fileWriter=new FileWriter(file); 35 //将数组中的数据写入到文件中。每行各数据之间TAB间隔 36 for(int i=0;i<sparseArrays.length;i++){ 37 for(int j=0;j<sparseArrays[i].length;j++){ 38 fileWriter.write(sparseArrays[i][j]+"\t"); 39 } 40 fileWriter.write("\r\n"); 41 } 42 fileWriter.close(); 43 } catch (IOException e) { 44 e.printStackTrace(); 45 } 46 return sparseArrays; 47 }
(二)将稀疏数组转换为二维数组
思路:1、读取稀疏数组第一行,获取二维数组的行列信息
2、读取稀疏数组后面几行,获取不同值
代码实现:
1 /** 2 * * 稀疏数组转原始的二维数组的思路 3 * 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11] 4 * 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可. 5 * @param sparseArrays 用于存储读取出的数组 6 * @param filename 存储数组的文件路径 7 * @return 返回一个原数组 8 */ 9 public static int[][] sparse2sor(int[][] sparseArrays,String filename) { 10 try { 11 BufferedReader in = new BufferedReader(new FileReader(filename)); 12 String line; //一行数据 13 int row=0; 14 //逐行读取,并将每个数组放入到数组中 15 while((line = in.readLine()) != null){ 16 String[] temp = line.split("\t"); 17 for(int j=0;j<temp.length;j++){ 18 sparseArrays[row][j] = Integer.parseInt(temp[j]); 19 } 20 row++; 21 } 22 in.close(); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 } 26 int[][] sourArrays2 = new int[sparseArrays[0][0]][sparseArrays[0][1]];//二维数组的行列数 27 for (int i = 1; i < sparseArrays.length; i++) { 28 sourArrays2[sparseArrays[i][0]][sparseArrays[i][1]] = sparseArrays[i][2];//对二维数组元素进行赋值 29 } 30 return sourArrays2; 31 }
浙公网安备 33010602011771号