鄙人决定利用最近做实时项目的业余时间,把java的数据结构和算法简单学习一下
目录
稀疏数组
记录数据一共有几行几列,有多少个不同的值,把具有不同值的元素的行列记录在一个小规模的数组中,以达到缩小数据规模的目的
例如上图这个二维数组,是11*11的结构,但是里面只有两个特殊值(非0),所以我们如果用稀疏数组来表示的话,可以极大的减小它的规模
上图就是我们转换出来的稀疏数组,有什么含义呢??
上图已经解释的比较清楚了!
ok 现在进入代码阶段
编码
1.将原有的多维数组转换为稀疏数组
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
System.out.println("==========原始的多维数组===========");
TODO: 2021/11/23 输出原始的二维数组
for (int[] arr : chessArr1){
for (int i : arr){
System.out.printf("%d\t",i);
}
System.out.println();
}
先把原始的多维数组创建出来(这个二维数组对应最前面的图)
上图变量: chessArr1(译:棋盘数组-->可视为一个多维数组)
1.1 首先我们获取原数组中特殊值的个数
TODO: 2021/11/23 首先,先获得有值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0) {
sum ++;
}
}
}
在双重for循环遍历之中,只要有不等于0的数字,该位置便是一个特殊值.用sum变量来记录
1.2 创建稀疏数组
TODO: 2021/11/23 创建稀疏数组
int[][] sparseArr1 = new int[sum + 1][3];
sparseArr1[0][0] = 11;
sparseArr1[0][1] = 11;
sparseArr1[0][2] = sum;
对于一个二维数组,对应的稀疏矩阵就是三列 分别对应 行号、列号、特殊值
因为稀疏矩阵还需要描述原数组的结构,所以行数应该是特殊值的个数加1,即sum+1
然后第一行的数据就是 11*11 有sum个特殊值
1.3 给稀疏数组赋值
TODO: 2021/11/23 遍历数组,将值填入稀疏数组中
int count = 1;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0){
sparseArr1[count][0] = i;
sparseArr1[count][1] = j;
sparseArr1[count][2] = chessArr1[i][j];
count++;
}
}
}
System.out.println("==================稀疏数组===================");
TODO: 2021/11/23 遍历打印稀疏数组
for (int[] arr : sparseArr1){
System.out.printf("%d\t%d\t%d",arr[0],arr[1],arr[2]);
System.out.println();
}
再次遍历原二维数组,将检查为特殊值的行号列号和值保存到稀疏数组之中
2.将稀疏数组转换为多维数组
TODO: 2021/11/23 将稀疏数组转换多维数组
int[][] chessArr2 = new int[sparseArr1[0][0]][sparseArr1[0][1]];
for (int i = 1; i < sparseArr1.length; i++) {
chessArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
}
System.out.println("===================转换出的多维数组===============");
TODO: 2021/11/23 打印转换出的多维数组
for (int[] ints : chessArr2) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
2.1 通过稀疏数组的第一行数据把原始数组创建出来
2.2 通过稀疏数组的后面几行进行特殊值的赋值
3.写入及写出
TODO: 2021/11/23 将求出的稀疏数组保存到文件中
FileWriter fileWriter = new FileWriter("output/sparseArray.txt");
for (int i = 0; i < sparseArr1.length; i++) {
for (int j = 0; j < 3; j++) {
fileWriter.write(sparseArr1[i][j] + "\t");
}
fileWriter.write("\n");
}
fileWriter.close();
System.out.println("写入文件成功");
System.out.println("=============读取文件中的内容==========");
TODO: 2021/11/23 从文件中读取数据
BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(new FileInputStream("output/sparseArray.txt")));
int cnt1 = 0;
while (true){
String s = bufferedReader1.readLine();
if (s == null) {
break;
}
cnt1 ++;
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("output/sparseArray.txt")));
//获取到了稀疏数组的大小,现在来创建
int[][] sparseArr3 = new int[cnt1][3];
//现在来进行赋值
int cnt2 = 0;
while (true){
String s = bufferedReader.readLine();
if (s == null) {
break;
}
String[] split = s.split("\t");
sparseArr3[cnt2][0] = Integer.parseInt(split[0]);
sparseArr3[cnt2][1] = Integer.parseInt(split[1]);
sparseArr3[cnt2][2] = Integer.parseInt(split[2]);
cnt2++;
}
TODO: 2021/11/23 将读到的sparseArr3 恢复成多维数组
int[][] chessArr3 = new int[sparseArr3[0][0]][sparseArr3[0][1]];
// 给多维数组赋值
for (int i = 1; i < sparseArr3.length; i++) {
chessArr3[sparseArr3[i][0]][sparseArr3[i][1]] = sparseArr3[i][2];
}
//打印以下多维数组chessArr3
for (int[] ints : chessArr3) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
//关闭缓冲流
bufferedReader.close();