数据结构与算法——稀疏数组
(学习内容为尚硅谷韩顺平老师的JAVA数据结构与算法)
1、什么是稀疏数组:
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
2、稀疏数组的处理方法:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
3、二维数组->稀疏数组转换说明: - 首先我们需要有一个已知的二维数组,也可以自己创建一个确定行数和列数以及具体数值的二维数组。
- 然后,在已知二维数组的情况下开始创建稀疏数组,java中数组的索引都是从0开始,稀疏数组的第0行保存的值分别是二维数组的行数,列数以及非0个数的值。
- 稀疏数组的行数的确定取决于二维数组中非0值得个数,以上图为例,稀疏数组中1-8行所确定的就是二维数组中非0值得所在行,所在列以及其具体的值。例如:22,在原二维数组中得位置为0行3列,因此在稀疏数组中所填的三个数组分别为0,3,22(在遍历数组中,默认是从左往右,从上往下,因此,22是第一个读出来的数字)。
4、代码展示:
1.首先,我是创建了一个11*11的二维数组,同时,向内填充几个非0数字,同时进行遍历输出该二维数组。
// 1.创建二位数组
/**
* 0:表示没有棋子 1:表示白棋 2:表示黑棋
*/
int[][] chessArr = new int[11][11];
chessArr[0][1] = 1;
chessArr[1][2] = 2;
chessArr[2][3] = 1;
chessArr[3][4] = 2;
System.out.println("原来的数组:");
for (int[] row : chessArr) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}
2.其次就是进行创建稀疏数组
- 创建稀疏数组前,我们需要先确定的是稀疏数组的维数,因为二维数组的行列数已经确定,因此我们只需要确定二维数组的非0个数即可,通过预定义一个sum变量值来保存非0个数。
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
sum++;
}
}
}
- 创建稀疏数组的过程,其实就是把非0数的行数,列数与值填充到稀疏数组中去,只需要遍历即可,因为我们创建的稀疏数组的列数是确定的3列(分别用来记录行,列,值),因此只有稀疏数组的行数在变化,也就是等于二维数组的非0值得个数。
- 创建稀疏数组并且遍历:
// 2.2 创建稀疏数组
int[][] spaseArr = new int[sum + 1][3];
spaseArr[0][0] = 11;
spaseArr[0][1] = 11;
spaseArr[0][2] = sum;
int count = 0;// 用来记录行数
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
count++;
spaseArr[count][0] = i;
spaseArr[count][1] = j;
spaseArr[count][2] = chessArr[i][j];
}
}
}
System.out.println("稀疏数组为:");
System.out.println("row\tcolumn\tvalue");
for (int[] row : spaseArr) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}
4.如果有需要的话,我们也可以将稀疏数组恢复成二维数组同时遍历,以观察和原先的二维数组是否相同。
int[][] newArr = new int[spaseArr[0][0]][spaseArr[0][1]];
for (int i = 1; i < spaseArr.length; i++) {
newArr[spaseArr[i][0]][spaseArr[i][1]] = spaseArr[i][2];
}
System.out.println("恢复之后的二维数组:");
for (int[] row : newArr) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}
到这边的话,基本上稀疏数组的创建以及稀疏数组和二维数组的相互转换就已经完成了,如果后续有需要的话,可以通过IO流,将数组以文件的形式输出/输入。
程序结果如图:
(溜了溜了,秃头研究生新生要继续肝了,一起加油家人们~~~)