什么是稀疏数组
稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是指无效数据量远大于有效数据量的数组
例如:
普通数组
00000000000000000 5*17 相当于 int[5][17]
00000000000000000
00000100000000000
00000002000000000
00003000000000000
稀疏数组
5 17 3 5行 17列 3个有效数字
2 5 1 下标(2,5) 值为1
3 8 2
4 4 3
很明显使用稀疏数组存储会大大减少存储空间,并且可以提高读写速度
所以 当一个数组中大半部分元素为0或者为同一个值的数组时,可以用稀疏数组来保持该数组
接下来以五子棋棋盘举例
1,首先分析
五子棋棋盘为n*n的二维数组组成,具有存档功能 具体流程如图
public static void main(String[] args){
//创建原始二维数组 11*11
//0表示空 1 表示黑 2表示蓝
int cheaaArr1[][]=new int[11][11]; //创建原棋盘
cheaaArr1[1][2]=1;
cheaaArr1[2][3]=2;
cheaaArr1[4][4]=2;
System.out.println("原始二维数组");
for(int[] row:cheaaArr1) {
for(int data:row) {
System.out.printf("%d\t",data); //格式化输出 \t表示制表符
}
System.out.println(); //换行
}
//将二维数组转稀疏数组
//1.遍历二维数组,得到非0数据个数
int sum = 0; //有效数据的个数
for(int i=0;i<cheaaArr1.length;i++) {
for (int j = 0; j < cheaaArr1.length; j++) {
if(cheaaArr1[i][j]!=0) {
sum++;
}
}
}
System.out.println("有效数据个数"+sum);
//2.创建稀疏数组
int sparseArr[][] =new int[sum+1][3];
sparseArr[0][0]=cheaaArr1.length; //得到稀疏数组的行数
sparseArr[0][1]=cheaaArr1[0].length; //得到稀疏数组的列数
sparseArr[0][2]=sum; //得到稀疏数组的有效数据
//3.遍历二维数组,将非0的值存到稀疏数组
int count=0;//计数器
for(int i=0;i<cheaaArr1.length;i++) {
for (int j = 0; j < cheaaArr1.length; j++) {
if(cheaaArr1[i][j]!=0) {
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=cheaaArr1[i][j];
}
}
}
System.out.println("将稀疏数组写入到文件");
int sparseArr2[][] =new int[sum+1][3];
try {
FileWriter out = new FileWriter(new File("1.txt"));
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[0].length; j++) {
out.write(sparseArr[i][j]+"\t");
}
out.write("\r\n");
}
out.close();
//读取文件中的稀疏数组
System.out.println("文件读取");
BufferedReader in = new BufferedReader(new FileReader(new File("1.txt")));
String line; //一行数据
int row=0;
//逐行读取,并放入数组中
while((line=in.readLine())!=null) {
String[] temp = line.split("\t");
for (int i = 0; i < temp.length; i++) {
sparseArr2[row][i]=Integer.parseInt(temp[i]);
}
row++;
}
in.close();
//4.输出稀疏数组的形式 \t是制表符 %d列数十进制整数 %c单个字符 %s字符串 printf格式输出
for (int i = 0; i < sparseArr2.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println();
//恢复稀疏数组
//1.先读取稀疏数组的第一行的数据,创建原始的二维数组
int chessArr2[][]=new int[sparseArr2[0][0]][sparseArr2[0][1]];
//2.读取稀疏数组,再给二维数组赋值
for (int i = 1; i < sparseArr2.length; i++) {
chessArr2[sparseArr2[i][0]][sparseArr2[i][1]]=sparseArr2[i][2];
}
//3.展示
System.out.println("展示修复后的二维数组");
for(int[] row:chessArr2) {
for(int data:row) {
System.out.printf("%d\t",data); //格式化输出 \t表示制表符
}
System.out.println();
}
}
结果
这个专栏主要记录自己学习数据结构与算法的过程,欢迎大家来一起探讨。
非常感谢尚硅谷的韩顺平老师。