二维数组转化为稀疏数组
各位看官你们好!感谢各位帅锅靓妹捧场!!!
刚刚开始学习数据结构和算法,来CSDN记录总结一下,第一次写博客,献丑了!
一、二维数组
上述图片为一个8×8的数组。
由于数据较多,所以这样的二维数组在存储需要空间是较大的并且时间读取长的。
由于数据中0反复出现,而数组创建时所有数据都默认为0,为了节约空间和时间,我们会需要对其进行压缩,即把所有重复的0都认作无效数值,将数组的有用信息记录到一个新的二维数组中。
二、稀疏数组
上述图片为一个4×3的数组。
这里的稀疏数组也是二维数组,是将二维数组压缩后的二维数组。
稀疏数组中第一行数据分别表示:原二维数组的行数、列数、有效数值个数。从第二行起,每一列代表的是每一个有效数值在二维数组中的行值、列值、值(由于下标从0开始,所以行值=行数-1)。
三、转化思路
Ⅰ.创建一个稀疏数组(二维数组),稀疏数组的行数根据<原二维数组的有效数值个数>确定,列数固定为3。
Ⅱ.将二维数组的<行数、列数、有效数值个数>插入到稀疏数组的第一行
Ⅲ.遍历二维数组,将有效数值的<行所在值、列所在值和数值本身>插入到稀疏数组
四、实现代码
①二维数组转化为稀疏数组类
public class ArrayTransferUtils {
/**
* 将一个二维数组转化为稀疏数组的方法
*
* @param twoDimensionalArray 一个二维数组
* @return 一个稀疏数组
*/
public int[][] twoDimensionalArrayToSparse(int[][] twoDimensionalArray) {
/**
* 获取行值,列值,有效值个数
* 重点:如何获取二维数组的行和列值
*/
int row = twoDimensionalArray.length;
int col = twoDimensionalArray[0].length;
int sum = 0;
// 遍历二维数组,计算有效值个数
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (twoDimensionalArray[i][j] != 0) {
sum++;
}
}
}
//判断并输出是否存在有效值
if (sum == 0) {
System.out.println("数组中所有值为0,无有效值");
} else {
System.out.println("数组的有效个数为:" + sum+"\n");
}
/**
* 1.根据sum值创建稀疏数组,行:sum+1;列:3(行值、列值、值)
* 2.传入行值、列值、有效数字个数
* 3.传入有效数字的行值、列值、值
*/
// 1.根据sum值创建稀疏数组,行:sum+1;列:3(行值、列值、值)
int sparseArray[][] = new int[sum + 1][3];
// 2.传入行值、列值、有效数字个数
sparseArray[0][0] = row;
sparseArray[0][1] = col;
sparseArray[0][2] = sum;
// 3.遍历二维数组插入有效数字的行值、列值、值
int count = 0;// 用于计算插入稀疏数组的行值
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (twoDimensionalArray[i][j] != 0) {
/**
* 每有一个有效值,插入一行
* 由于稀疏数组第一行已记录二维数组的行值、列值、有效值个数,所以从count+1行开始插入
*/
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = twoDimensionalArray[i][j];
}
}
}
// 遍历输出稀疏数组
for (int[] is : sparseArray) {
for (int i : is) {
System.out.print(i + "\t");
}
System.out.println();
}
return sparseArray;
}
}
②主程序
public static void main(String[] args) {
// 创建对象
ArrayTransferUtils at = new ArrayTransferUtils();
// 创建一个八行八列的二维数组并赋值
int newTDArray[][] = new int[8][8];
newTDArray[3][4] = 12;
newTDArray[4][7] = 20;
newTDArray[7][5] = 33;
//输出到控制台查看
for (int[] is : newTDArray) {
for (int i : is) {
System.out.print(i+"\t");
}
System.out.println();//换行
}
// 调用二维数组转稀疏数组方法转化并输出稀疏数组
at.twoDimensionalArrayToSparse(newTDArray);
}
Ending------------------------------------------------------------------------------------------------------------------------------------------------
一个转化的类,一个主程序,欢迎各位大佬来捧场,指点!