关于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,白色为2
int[][] 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,白色为2
int[][] 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,白色为2
int[][] 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