目录
稀疏数组的概念
所谓稀疏数组,是一种特殊的数据结构,用于有效地表示大部分元素值为默认值(通常为零或空)的二维数组。在稀疏数组中,仅存储非默认值的元素及其对应的行、列和值。
稀疏数组的表示方法通常包括三列:
- 原始数组的行数
- 原始数组的列数
- 非默认值元素的个数
其中,每个非默认值元素都包含三个信息:
- 行索引
- 列索引
- 具体的值
例如下面的11×11的棋盘矩阵
转换为稀疏数组则为:
通过使用稀疏数组,可以大大减少对于默认值的存储空间,从而节省内存和存储资源。在处理稀疏数组时,可以根据存储的信息重新构建原始的二维数组。常用于处理稀疏矩阵、棋盘游戏等场景,其中大部分元素都具有相同的默认值。
代码实现(稀疏数组的普通转化)
思路
创建一个11×11的chessArray棋盘数组,并自定义进行赋值。而后,根据稀疏数组的特性:第一列为总行数、总列数、非默认数值的总数sum对第一列进行赋值。
其中,sum主要通过对chessArray数组进行for循环遍历得到。
第一列赋值完毕,我们通过for循环进行数值的填充:通过两个for循环对chessArray数组中的每个元素进行遍历,当遍历的元素非零时,将其存储到稀疏数组sparseArray中。
稀疏数组转化为棋盘数组时,主要需要注意两个数组之间的对应关系:稀疏数组sparseArray第一行主要是对棋盘数组进行整体的描述,我们可以通过这一点来创建棋盘数组chessArray1。在进行赋值时,通过稀疏数组sparseArray[0][2]中存储的sum值来确定for循环的次数,而后通过稀疏数组的行索引、列索引、值分别对棋盘数组进行赋值。
注:sparseArray[0][2]中存储的sum值是棋盘数组的非默认值总数,而不是稀疏数组的总行数。稀疏数组的总行数是sum+1.
代码
public class sparseArray1 {
public static void main(String[] args) {
int[][] chessArray = new int[11][11];
//定义棋盘,棋盘中设置三个变量
chessArray[0][2] = 1;
chessArray[1][1] = 2;
chessArray[2][3] = 2;
//输出棋盘
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
System.out.print(chessArray[i][j] + "\t");
}
System.out.println();
}
//定义稀疏数组
//1.确定稀疏数组的第一行 棋盘数组的行、列、非0值的数量count
int sum = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
if (chessArray[i][j] != 0) {
sum++;
}
}
}
//定义稀疏数组
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum;
int count = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
if (chessArray[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArray[i][j];
}
}
}
System.out.println("稀疏数组的输出:");
for (int[] data : sparseArray) {
for (int s : data) {
System.out.print(s + "\t");
}
System.out.println();
}
int[][] chessArray1 = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 0; i < sparseArray[0][2]; i++) {
chessArray1[sparseArray[i+1][0]][sparseArray[i+1][1]] = sparseArray[i+1][2];
}
System.out.println("稀疏数组转化为棋盘数组:");
for (int[] data : chessArray1) {
for (int s : data) {
System.out.print(s + "\t");
}
System.out.println();
}
难度升级(从文件中读写稀疏数组)
思路
将稀疏数组输出为txt文件
通过FilwWriter和for循环遍历进行写入,每个数值之后加入"\t"即可
将稀疏数组的txt文件读入
首先通过读取文件的行确定稀疏数组的每一行元素。而后,通过"\t"将每个字符进行分割。需要注意的是,此时的我们读取的还是string类型,需要将其转化为int类型才能存到稀疏数组sparseArray中。
接下来就是按行按列进行for循环写入了
代码
//将稀疏数组输出为txt文件
try {
FileWriter fw = new FileWriter("C:\\Users\\SirYu\\Desktop\\后端代码\\Algorithm\\sparse_array");
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < sparseArray[i].length; j++) {
fw.write(sparseArray[i][j] + "\t");
}
fw.write("\n");
}
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
//将稀疏数组的文件进行读取
try {
List<String> strs = Files.readAllLines(Paths.get("C:\\Users\\SirYu\\Desktop\\后端代码\\Algorithm\\sparse_array"), StandardCharsets.UTF_8);
for (int i = 0; i < strs.size(); i++) {
String[] s = strs.get(i).split("\t");
for (int j = 0; j < s.length; j++) {
sparseArray[i][j] = Integer.parseInt(s[j]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("输出从文件中读取数据后的稀疏数组:");
for (int[] data : sparseArray) {
for (int s : data) {
System.out.print(s + "\t");
}
System.out.println();
}