1、稀疏数组
-
普通数组转换成稀疏数组的方法:
- 记录数组共有几行几列,有多少个不同的值 (就是不包括默认值的那些) 分别存入 i、j 、 n
- 创建一个对应的n+1 行、 3列的小规模新数组
- 小数组第一行存入 i 、 j 、n 。
- 剩下n行存入n个需记录的元素的 i,j 下标和值 (3列嘛,依次对应)
代码示例: 创建了一个二维数组的棋盘 默认棋盘数字为0 然后依次给棋子编号 (比如这里存了两颗棋子 1,2)
public class SparseArray { public static void main(String[] args) { // 创建原始二维数组 //0,表示无棋子,1表示有棋子 int chessArr1[][]= new int[11][11]; chessArr1[1][2]=1; chessArr1[2][3]=2; //输出原始数组 for (int[] row : chessArr1) { for (int data : row) { System.out.printf("%d\t",data); } System.out.println(); } //二维数组转转稀疏数组思路 //1.先遍历二维数组,得到非0数据的个数 int sum=0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1[0].length; j++) { if (chessArr1[i][j]!=0){ sum++; } } } //2.创建稀疏数组 int sparseArray[][]=new int[sum+1][3]; sparseArray[0][0]=11; sparseArray[0][1]=11; sparseArray[0][2]=sum; // 3.遍历二维数组,将非0的值存放到sparseArray int count=0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1[0].length; j++) { if (chessArr1[i][j]!=0){ count++;//第二行开始存 sparseArray[count][0]=i; sparseArray[count][1]=j; sparseArray[count][2]=chessArr1[i][j]; } } } System.out.println( ); System.out.println("稀疏数组为:"); for (int i = 0; i < sparseArray.length; i++) { System.out.printf("%d\t%d\t%d\n", sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]); } //恢复成普通二维数组 //1.读取第一行,创建数组 //2.读取后几行,给数组赋值 int chessArr2[][]=new int [sparseArray[0][0]][sparseArray[0][1]]; for (int i = 1; i <sparseArray .length ; i++) { chessArr2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2]; } //3.输出恢复后的数组 for (int[] row : chessArr2) { for (int data : row) { System.out.printf("%d\t",data); } System.out.println(); } } }
运行结果:
分析:可以很直观的看到对空间的节省还是很有效的