稀疏数组应用场景
棋盘案例
问:如何将这一盘棋的信息记录下来
思路
我们将黑棋位置记为1,白棋位置记为2,其他空白位置记为0;
即:
0 0 0 0 0 0 0
0 0 1 0 2 0 0
0 0 1 0 2 0 0
0 0 0 0 2 0 0
0 0 0 0 0 0 0
这样,这一盘棋的信息就体现出来了,在Java中我们可以通过二维数组将此保存进内存中
代码实现
package com.atguigu.linklist;
public class sparseArrayTest {
public static void main(String[] args) {
//使用二维数组保存此棋盘数据
int[][] array = new int[5][6];//棋盘数组 第一个数据表示有几列 第二个数据表示一行有几个数据
//将每一行数据存入数组里
array[0] = new int[]{0,0,0,0,0,0,0};
array[1] = new int[]{0,0,1,0,2,0,0};
array[2] = new int[]{0,0,1,0,2,0,0};
array[3] = new int[]{0,0,0,0,2,0,0};
array[4] = new int[]{0,0,0,0,0,0,0};
//将二维数组输出
for (int row = 0; row <= 4; row++) {
//行
for (int col = 0; col <= 6; col++) {
//列
//输出
System.out.printf(array[row][col] + "\t");//
}
System.out.println("\n");
}
}
}
输出结果
0 0 0 0 0 0 0
0 0 1 0 2 0 0
0 0 1 0 2 0 0
0 0 0 0 2 0 0
0 0 0 0 0 0 0
利用二维数组存储棋盘所引发的思考
从二维数组输出的结果可以看出,无效数据‘ 0 ’占用空间多 从而影响程序执行的效率
因此 我们引入一个新的概念 ---- 稀疏数组
稀疏数组
何为稀疏数组
5 7 5
1 2 1
1 4 2
2 2 1
2 4 2
3 4 2
以上就是由上面的二维数组转换而来的稀疏数组,看到这也许你会疑惑,这个稀疏数组是依据什么思想转换而来的呢?
思路
第一行 5 7 5
5:记录了二维数组一共有几行
7:记录了二维数组一共有几列
5:记录了二维数组中有效数据(非0数据)一共有几个
其他行:
第一个数字表示该有效数据所在行
第二个数字表示该有效数据所在列
第三个数字表示该位置所存储的数据
代码实现 二维数组 =》 稀疏数组
public class sparseArrayTest {
public static void main(String[] args) {
/*
* 0 0 0 0 0 0 0
0 0 1 0 2 0 0
0 0 1 0 2 0 0
0 0 0 0 2 0 0
0 0 0 0 0 0 0
* */
//使用二维数组保存此棋盘数据
int[][] array = new int[5][6];//棋盘数组 第一个数据表示有几列 第二个数据表示一行有几个数据
//将每一行数据存入数组里
array[0] = new int[]{0,0,0,0,0,0,0};
array[1] = new int[]{0,0,1,0,2,0,0};
array[2] = new int[]{0,0,1,0,2,0,0};
array[3] = new int[]{0,0,0,0,2,0,0};
array[4] = new int[]{0,0,0,0,0,0,0};
sparseUtil sparseUtil = new sparseUtil();//稀疏数组工具类
int[][] sparseArray = sparseUtil.doubleArrayToSparseArray(array);//生成的稀疏数组
//将稀疏数组输出
for (int row = 0; row < sparseArray.length; row++) {
//行
for (int col = 0; col < sparseArray[row].length; col++) {
//列
//输出
System.out.printf(sparseArray[row][col] + "\t");//
}
System.out.println("\n");
}
}
}
class sparseUtil{//关于稀疏数组的工具类
//二维数组 =》 稀疏数组
//传入一个二维数组
public int[][] doubleArrayToSparseArray(int[][] doubleArray){
//获取此二维数组各维度长度
int row = doubleArray.length;
int col = doubleArray[0].length;
//遍历 获取此数组的有效数据
int count = 0;//有效数据的个数
for (int i = 0; i <= 4; i++) {
//列
for (int j = 0; j <= 6; j++) {
//行
//有效数据
int value = doubleArray[i][j];
if (value!=0){
count++;
}
}
}
//稀疏数组第一行数据
int[] oneRow = {row,col,count};
//新建一个稀疏数组
int[][] sparseArray = new int[count+1][3];//第一个数据表示有几列 第二个数据表示一行有几个数据
//将第一行的数据加入进去
sparseArray[0] = oneRow;
//循环 得到有效数据后 获取行和列存入稀疏数组
int index = 1;//加入稀疏数组时 需要的指针 用来确定在稀疏数组中的第几行 从1开始
for (int i = 0; i <= 4; i++) {
//行
for (int j = 0; j <= 6; j++) {
//列
//有效数据
int value = doubleArray[i][j];
if (value!=0){
int thisRow = i;//表示该所在行
int thisCol = j;//表示该所在列
//存入稀疏数组
sparseArray[index] = new int[]{thisRow,thisCol,value};
index++;//指针后移
}
}
}
return sparseArray;//最后将稀疏数组返回
}
}
输出结果
5 7 6
1 2 1
1 4 2
2 2 1
2 4 2
3 4 2
4 2 2
如何将一个稀疏数组转化为二维数组
思路:先拿到首行数据 获取二维数组长度信息 创建二维数组,获取有效数据的个数 确定循环次数 先将数组的数据全部初始化为0 然后遍历稀疏数组 获取哪行那列对应的哪个数据 然后将数据填入响应的位置
代码实现
//传入稀疏数组 将其转化为 二维数组
public int[][] sparseArrayToDoubleArray(int[][] sparseArray){
//先获取稀疏数组头行数据
int[] header = sparseArray[0];
int row = header[1];//二维数组行数
int col = header[0];//二维数组列数
int count = header[2];//有效数据个数
int[][] doubleArray = new int[col][row];//将二维数组创建
//填充其为0
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
doubleArray[i][j] = 0;
}
}
//遍历稀疏数组 获取有效数据及位置信息 并填充
for (int i = 1; i < sparseArray.length; i++) {
//从第二行开始
int rowLocal = sparseArray[i][0];//行位置
int colLocal = sparseArray[i][1];//列位置
int value = sparseArray[i][2];//值
//存入二维数组
doubleArray[rowLocal][colLocal] = value;
}
return doubleArray;
}
稀疏数组代码集合
package com.atguigu.linklist;
import com.atguigu.sparsearray.SparseArray;
public class sparseArrayTest {
public static void main(String[] args) {
/*
* 0 0 0 0 0 0 0
0 0 1 0 2 0 0
0 0 1 0 2 0 0
0 0 0 0 2 0 0
0 0 0 0 0 0 0
* */
//使用二维数组保存此棋盘数据
int[][] array = new int[5][6];//棋盘数组 第一个数据表示有几列 第二个数据表示一行有几个数据
//将每一行数据存入数组里
array[0] = new int[]{0,0,0,0,0,0,0};
array[1] = new int[]{0,0,1,0,2,0,0};
array[2] = new int[]{0,0,1,0,2,0,0};
array[3] = new int[]{0,0,0,0,2,0,0};
array[4] = new int[]{0,0,0,0,0,0,0};
//将二维数组输出
for (int row = 0; row <= 4; row++) {
//行
for (int col = 0; col <= 6; col++) {
//列
//输出
System.out.printf(array[row][col] + "\t");//
}
System.out.println("\n");
}
System.out.println("_________________________________");
sparseUtil sparseUtil = new sparseUtil();//稀疏数组工具类
int[][] sparseArray = sparseUtil.doubleArrayToSparseArray(array);//生成的稀疏数组
//将稀疏数组输出
for (int row = 0; row < sparseArray.length; row++) {
//行
for (int col = 0; col < sparseArray[row].length; col++) {
//列
//输出
System.out.printf(sparseArray[row][col] + "\t");//
}
System.out.println("\n");
}
int[][] doubleArray = sparseUtil.sparseArrayToDoubleArray(sparseArray);//稀疏数组=>二维数组
//将二维数组输出
for (int row = 0; row < doubleArray.length; row++) {
//行
for (int col = 0; col < doubleArray[row].length; col++) {
//列
//输出
System.out.printf(doubleArray[row][col] + "\t");//
}
System.out.println("\n");
}
}
}
class sparseUtil{//关于稀疏数组的工具类
//二维数组 =》 稀疏数组
//传入一个二维数组
public int[][] doubleArrayToSparseArray(int[][] doubleArray){
//获取此二维数组各维度长度
int row = doubleArray.length;
int col = doubleArray[0].length;
//遍历 获取此数组的有效数据
int count = 0;//有效数据的个数
for (int i = 0; i <= 4; i++) {
//列
for (int j = 0; j <= 6; j++) {
//行
//有效数据
int value = doubleArray[i][j];
if (value!=0){
count++;
}
}
}
//稀疏数组第一行数据
int[] oneRow = {row,col,count};
//新建一个稀疏数组
int[][] sparseArray = new int[count+1][3];//第一个数据表示有几列 第二个数据表示一行有几个数据
//将第一行的数据加入进去
sparseArray[0] = oneRow;
//循环 得到有效数据后 获取行和列存入稀疏数组
int index = 1;//加入稀疏数组时 需要的指针 用来确定在稀疏数组中的第几行 从1开始
for (int i = 0; i <= 4; i++) {
//行
for (int j = 0; j <= 6; j++) {
//列
//有效数据
int value = doubleArray[i][j];
if (value!=0){
int thisRow = i;//表示该所在行
int thisCol = j;//表示该所在列
//存入稀疏数组
sparseArray[index] = new int[]{thisRow,thisCol,value};
index++;//指针后移
}
}
}
return sparseArray;//最后将稀疏数组返回
}
//传入稀疏数组 将其转化为 二维数组
public int[][] sparseArrayToDoubleArray(int[][] sparseArray){
//先获取稀疏数组头行数据
int[] header = sparseArray[0];
int row = header[1];//二维数组行数
int col = header[0];//二维数组列数
int count = header[2];//有效数据个数
int[][] doubleArray = new int[col][row];//将二维数组创建
//填充其为0
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
doubleArray[i][j] = 0;
}
}
//遍历稀疏数组 获取有效数据及位置信息 并填充
for (int i = 1; i < sparseArray.length; i++) {
//从第二行开始
int rowLocal = sparseArray[i][0];//行位置
int colLocal = sparseArray[i][1];//列位置
int value = sparseArray[i][2];//值
//存入二维数组
doubleArray[rowLocal][colLocal] = value;
}
return doubleArray;
}
}