2 .稀疏数组
文章来自于听了尚硅谷的课自己所敲:
https://www.bilibili.com/video/BV1E4411H73v?p=10
2.1.稀疏数组
我们来看一个实际问题:
此时就需要稀疏数组来压缩
稀疏数组基本介绍:
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的实现方法:
-
稀疏数组第一行记录了—共有着几列,有多少个不同的值
-
把具有不同值的元素的行列及值记录在一个小规模的数组中。从而缩小程序的规模
如下图:
2.2稀疏数组实现思路分析
2.3代码实现
package sparsearray;
import java.util.Arrays;
//将二维数组变成稀疏数组
//我们来通过稀疏数组来记录棋盘
public class arrSparearr {
public static void main(String[] args) {
//创建一个原始的二维数组
//0表示没有棋子,1表示黑子, 2表示蓝子
int chessArr1[][]=new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
//输出原始的二维数组
System.out.println("原始的二维数组");
for (int[] row:chessArr1 ){
for (int data:row){
//两种写法都行
//System.out.print(data+" ");
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组变成稀疏数组
//1.先遍历数组得到非零数的个数
int sum=0;
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
sum++;
}
}
}
System.out.println("sum="+sum);
//2.创建对应的稀疏数组
int sparearr[][]=new int[sum+1][3];
//给稀疏数组赋值
sparearr[0][0]=11;
sparearr[0][1]=11;
sparearr[0][2]=2;
//记录稀疏数组到哪行
int count=0;
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
count++;
sparearr[count][0]=i;
sparearr[count][1]=j;
sparearr[count][2]=chessArr1[i][j];
}
}
}
//3.遍历稀疏数组
System.out.println("稀疏数组为");
System.out.println("\trow\tcol\tvalue\t");
int c1=0;
for (int row[]:sparearr){
c1++;
System.out.print(c1+"\t");
for (int data:row){
System.out.print(data+"\t");
}
System.out.println();
}
//将稀疏数组变为二维数组
//1.读取稀疏数组的第一行,通过他来创建二维数组
int chessarr2[][]=new int[sparearr[0][0]][sparearr[0][1]];
//2.读取稀疏数组后几行数据,进行还原
for(int i=1;i<sparearr.length;i++){
chessarr2[sparearr[i][0]][sparearr[i][1]]=sparearr[i][2];
}
// 数组快捷写法
// 10.for
// for (int i = 0; i < 10; i++) {
//
// }
System.out.println("生成的二维数组为:");
for (int[] row:chessarr2){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}