目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、稀疏数组是什么?
当一个原始数组中存放了大量重复的元素,可以转换成一个记录原始数组中信息的稀疏数组,减少了大量重复元素,这个数组就是稀疏数组。
1)稀疏数组的第一行记录原始数组一共有几行几列,有多少个不同的值
2)把具有不同值的元素的所在行、所在列,及元素的值记录在一个小规模的数组中,从而缩小数组的规模
例如图中稀疏数组下标为0的行分别记录了原始数组有6行7列8个不同值,稀疏数组下标为1的行记录了原始数组第0行第3列的元素值为22。
二、思路分析
1.二维数组 --> 稀疏数组的思路
1.首先遍历原始二维数组,得到有效数据的个数
2.根据有效数据的个数可以创建稀疏数组(创建数组需要行列)
3.将二维数组的有效数据存入到稀疏数组
(第一行记录原始数组的行列和有效值个数,第二行往后开始表示元素在原数组中的位置及其值)
2.稀疏数组 --> 二维数组的思路
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
2.再读取稀疏数组后几行的数据,并赋给原始二维数组即可
三、代码实现
public static void main(String[] args) {
/*
* 需求:将以下二维数组转换为稀疏数组,而后再恢复出原有棋盘
*/
System.out.println("--------------------------------------");
System.out.println("原二维数组:");
int[][] chessboard = new int[11][11];
chessboard[1][2] = 1;
chessboard[2][3] = 2;
chessboard[3][4] = 1;
//原棋盘
for (int[] is : chessboard) {
for (int i : is) {
System.out.printf("%d\t",i);
}
System.out.println();
}
System.out.println("--------------------------------------");
System.out.println("原始二维数组转换为稀疏数组:");
//二维数组 转换为 稀疏数组
//1)遍历原始的二维数组,得到有效值的个数
int sum = 0;
for (int i = 0; i < chessboard.length; i++) {
for (int j = 0; j < chessboard[i].length; j++) {
if(chessboard[i][j] != 0) {
sum++;
}
}
}
//2)根据有效值的个数创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
//第一行记录原二维数组的行、列、有效值个数
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//3)将二维数组中的有效数据传入到稀疏数组
int count = 0;
for (int i = 0; i < chessboard.length; i++) {
for (int j = 0; j < chessboard[i].length; j++) {
if(chessboard[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessboard[i][j];
}
}
}
for (int[] is : sparseArr) {
for (int i : is) {
System.out.printf("%d\t",i);
}
System.out.println();
}
System.out.println("--------------------------------------");
System.out.println("上面的稀疏数组恢复成二维数组:");
//稀疏数组 转换为 二维数组
//1)先读取稀疏数组的第一行,根据稀疏数组第一行创建二维数组
int[][] chessboard1 = new int[sparseArr[0][0]][sparseArr[0][1]];
//2)将稀疏数组中的除第一行之外的值放入二维数组对应坐标上
for (int i = 1; i < sparseArr.length; i++) {
chessboard1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
for (int[] is : chessboard1) {
for (int i : is) {
System.out.printf("%d\t",i);
}
System.out.println();
}
}
学习总结自尚硅谷数据结构与算法课程。
总结
本文仅仅简单介绍了稀疏数组,总而言之,稀疏数组就是将一个规模很大重复元素很多的数组用一个规模更小的数组描述。