Java数据结构——稀疏数组
SparseArray原理
将数组中大部分为 0 或者是同一个值的的元素保存起来,第一行存放二维数组的 行 和 列 以及元素有效值个数,用 行列 来标记不同与其它的元素值和它的位置。
应用场景
例如:编写一个五子棋(11×11)chess程序中,有存盘退出及续上盘的功能
因为二维数组有很多默认值0,记录了许多无意义的数据
当一个数组中大部分元素为 0 或者是同一个值的数组,故可以使用稀疏数组来保存该数组
处理方法:
1.记录数组一共有几行几列,有多少个不同的值。
2.把具有不同值的元素行列和值记录在小规模的数组中,从而缩小程序的规模

原始二维数组转稀疏数组的思路
1.遍历原始二维数组有效数据的个数sum
2.根据sum,创建稀疏数组sparseArray[sum+1][3]
3.将原始二维数组有效数据存入稀疏数组中
稀疏数组转原始二维数组的思路
1.读取稀疏数组第一行的数据,根据第一行的数据创建原始二维数组
2.在读取稀疏数组后几行的数据,赋给原始二维数组
代码如下:
1 package com.taru.sparsearray; 2 3 public class SparseArray { 4 public static void main(String[] args) { 5 //二维数组转稀疏数组 6 //1.创建一个11*11的二维数组 7 // 0代表没有棋子 ,1代表黑棋,2代表白棋 8 int[][] chess = new int[11][11]; 9 chess[1][2]=1; 10 chess[2][3]=2; 11 chess[4][5]=1; 12 //输出原始二维数组chess 13 System.out.println("输出原始数组------"); 14 for(int[] array : chess){ 15 for (int data :array){ 16 System.out.printf("%d\t" , data); 17 } 18 System.out.println(); 19 } 20 //2.遍历二维数组非0个数 21 int sum =0; 22 for(int[] array : chess){ 23 for (int data :array){ 24 if (data!=0) sum++; 25 } 26 } 27 //2.创建对应的稀疏数组 28 int[][] sparseArray =new int[sum+1][3]; 29 //给稀疏数组赋值 30 sparseArray[0][0] = 11; //chess行数 31 sparseArray[0][1] = 11;//chess列数 32 sparseArray[0][2] = sum;//chess非零个数 33 //3.遍历chess数组,将非零值存放到sparseArray中 34 int count =0; 35 for (int i = 0 ;i<chess.length;i++){ 36 for (int j=0;j<chess[i].length;j++){ 37 if (chess[i][j]!=0){ 38 count++; 39 sparseArray[count][0]=i; 40 sparseArray[count][1]=j; 41 sparseArray[count][2]=chess[i][j]; 42 } 43 } 44 } 45 //输出sparseArray数组 46 System.out.println("输出稀疏数组------"); 47 for (int[] item:sparseArray){ 48 System.out.printf("%d\t%d\t%d\t\n",item[0],item[1],item[2]); 49 } 50 51 //稀疏数组还原原始数组 52 int [][] chess2 = new int[sparseArray[0][0]][sparseArray[0][1]]; 53 for (int i =1 ;i<sparseArray.length;i++){ 54 chess2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2]; 55 } 56 //输出被还原的原始数组 57 System.out.println("输出被还原的原始数组-------"); 58 for(int[] array : chess2){ 59 for (int data :array){ 60 System.out.printf("%d\t" , data); 61 } 62 System.out.println(); 63 } 64 } 65 }
浙公网安备 33010602011771号