关于java的稀疏数组
我们在前面的文章中了解了冒泡排序和优化冒泡排序,在本篇文章中我们来介绍一下稀疏数组,我们学会了可以自己动手试一试😀
稀疏数组
在介绍稀疏数组之前,我们先来了解一下五子棋。
我们这里有一个11 x 11的棋盘,棋盘上有两个棋子,一黑一白,所以我们可以用我们之前学过的二维数组来表示。
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 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 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
黑色棋子代表1,白色棋子代表2,但是我们会发现,二维数组很多的默认值都是0,所以记录了很多没有意义的数据。
所以,可以通过压缩数组的方法,来解决次问题,这个就叫做稀疏数组。
稀疏数组的介绍
1、当一个数组中大部分的元素都是0,或者都为同一个数值,可以用稀疏数组来保存该数组。
2、稀疏数组的处理方法:
- 记录数组一共有几行,有几列,有多少个不同的值。
- 把具有相同值的元素和行列以及值,记录在一个小规模的数组中,从而缩小了程序的规模。
3、举例说明:
- 原始数组
0 0 0 22 0 0 15
0 11 0 0 0 17 0
- 稀疏数组
行 | 列 | 值
[0] 2 | 7 | 4
--------|-----|------- //意思就是,两行,七列,4个不相同的值。
[1] 0 | 3 | 22
[2] 0 | 6 | 15
[3] 1 | 1 | 11
[4] 1 | 5 | 17
4、我们用代码来写一下棋盘😎
- **创建一个二维数组 **
- 棋盘格式为11*11 没有棋子代表0 ,黑色为1,白色为2。
public class Demo
{public static void main(String[] args){int[][] array1 = new int[11][11];}
}
- 给数组赋值。
public class Demo
{public static void main(String[] args){int[][] array1 = new int[11][11];array1[1][2]=1;array1[2][3]=2;}
}
- 遍历输出棋盘。
public class ArraysDemo08 {public static void main(String[] args) {//创建一个二维数组 11*11 没有棋子代表0 黑色为1,白色为2int[][] array1=new int[11][11];array1[1][2]=1;array1[2][3]=2;//输出原始数组System.out.println("输出原始数组");for(int[] ints:array1){for (int anInt:ints){System.out.print(anInt+"\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 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 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0进程结束.......
- 转换为稀疏数组
- 获取有效值个数
public class ArraysDemo08 {public static void main(String[] args) {//创建一个二维数组 11*11 没有棋子代表0 黑色为1,白色为2int[][] array1=new int[11][11];array1[1][2]=1;array1[2][3]=2;//输出原始数组System.out.println("输出原始数组");for(int[] ints:array1){for (int anInt:ints){System.out.print(anInt+"\t");}System.out.println();}//转化为稀疏数组保存//获取有效值的个数int sum = 0;for (int i = 0; i < 11; i++){for (int j = 0; j < 11; j++){if (array1[i][j]!=0){sum++;}}}System.out.println("有效值的个数:"+sum);}
}
- 创建一个稀疏数组
//稀疏数组
int[][] array2=new int[sum+1][3];array2[0][0]=11;//行array2[0][1]=11;//列array2[0][2]=sum;//有效值
- 遍历二维数组(非0的值存在稀疏数组中)输出稀疏数组。
public class ArraysDemo08 {public static void main(String[] args) {//创建一个二维数组 11*11 没有棋子代表0 黑色为1,白色为2int[][] array1=new int[11][11];array1[1][2]=1;array1[2][3]=2;//输出原始数组System.out.println("输出原始数组");for(int[] ints:array1){for (int anInt:ints){System.out.print(anInt+"\t");}System.out.println();}//转化为稀疏数组保存//获取有效值的个数int sum = 0;for (int i = 0; i < 11; i++){for (int j = 0; j < 11; j++){if (array1[i][j]!=0){sum++;}}}System.out.println("有效值的个数:"+sum);//稀疏数组int[][] array2=new int[sum+1][3];array2[0][0]=11;//行array2[0][1]=11;//列array2[0][2]=sum;//有效值int count=0;for (int i = 0; i < array1.length; i++){for (int j = 0; j < array1[i].length; j++){if (array1[i][j]!=0){count++;array2[count][0] =i;array2[count][1] =j;array2[count][2] =array1[i][j];}}}//输出稀疏数组System.out.println("稀疏数组");for (int i = 0; i < array2.length; i++){System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]+"\t");}}
}
我们执行一下,就可以发现变成了我们上面介绍的样子。
输出原始数组
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 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 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稀疏数组
11 11 2
1 2 1
2 3 2