数据结构与算法-稀疏数组
稀疏数组(sparsearray)
介绍:当一个数组中大部分元素为0或者为其他同一个值的数组时,我们可以使用稀疏数组来进行保存。
如下图,代码情景所展示:
- 稀疏数组的第一行内容主要包括,[0][0]记录原始数组共有几行,[0][1]记录原始数组共有几列,[0][2]记录原始数组中有几个不同的值。
- 稀疏数组的后几行则表示,该值在原始数组中的几行几列。
- 稀疏数组共有三列,列数是固定的。行数根据原始数组的不同值个数决定。
代码实例
通过上图中提供的情景,进行代码编写:
package com.liulin.sparsearray;
import org.junit.Test;
public class SparseArrayTest {
/**
* 提供一个棋盘,用 1表示黑子,2表示蓝子,0表示棋盘空
* 将棋盘以二进制代码体现出来
*将原始二维数组转换为稀疏数组
*/
@Test
public void getArray(){
//创建11*11大小的原始数组
int[][] currentArray = new int[11][11];
//根据图片内容给原始数组进行赋值操作
currentArray[1][2] = 1;
currentArray[2][3] = 2;
//此时我们需要知道,原始数组中有几个有效元素
int sum = 0;
//通过增强for循环进行数组遍历
for (int[] a : currentArray){
for (int x : a){
//判断原始二维数组里面,不为空的有效数值个数
if (x != 0){
sum++;
}
}
}
System.out.println(sum);
//拿到原始数组中的有效数值个数
//可以创建我们稀疏数组的大小,为(sum+1)*3
int[][] sparseArray = new int[sum+1][3];
//由稀疏数组包含内容条件,可知
//稀疏数组[0][0]为原始数据行数
sparseArray[0][0] = currentArray.length;
//稀疏数组[0][1]为原始数据列数
sparseArray[0][1] = currentArray[0].length;
//稀疏数组[0][2]为原始数组有效值个数
sparseArray[0][2] = sum;
/**
* 向稀疏数组中填入,原始数组中有效值位置,需要通过循环判断每一个数
* 所以,我们设置一个变量index,表明此时加入的数值为第几个
* 同时也可以指定此时稀疏数组的行数下标
*/
int index = 1;
//for循环遍历原始二维数组
for (int i = 0; i < currentArray.length; i++){
for (int j = 0; j < currentArray[i].length; j++){
if (currentArray[i][j] != 0){
//添加原始数组中有效数值的位置
//此时index表示稀缺数组的行数下标
sparseArray[index][0] = i;
sparseArray[index][1] = j;
sparseArray[index][2] = currentArray[i][j];
//添加完成后,我们需要对稀疏数组下一行进行添加
//index++,表示下一次进来,指向的是数组第三行,下标为2
index++;
//如果稀疏数组已经将所有有效数存入,则没必要继续循环
if (index == sum){
break;
}
}
}
}
//对稀疏数组进行遍历显示
System.out.println("row\tcol\tval");
for (int[] i:sparseArray){
for (int x: i){
System.out.print(x+"\t");
}
System.out.println();
}
}
}
程序运行结果:
IO流操作
将转换出来的稀疏数组保存进硬盘文件下,代码实例如下(接上半代码):
//对稀疏数组进行遍历显示
System.out.println("row\tcol\tval");
for (int[] i:sparseArray){
for (int x: i){
System.out.print(x+"\t");
}
System.out.println();
}
System.out.println("**************");
//IO字符输出(写入)流
FileWriter fileWriter = new FileWriter("sparseArrayFile.txt");
for (int[] i:sparseArray){
for (int x: i){
//增强for循环写入每一个int型值
fileWriter.write(x);
}
}
//流关闭
fileWriter.close();
//IO字符输入(读)流
int read = 0;
FileReader fileReader = new FileReader("sparseArrayFile.txt");
for (;;){
if ((read = fileReader.read()) != -1){
System.out.print(read+"\t");
}else{
break;
}
}
fileReader.close();
运行效果截图:
总结
将稀疏数组从文件中输出到程序,并转换成对应的原始数组操作与上部分类似,就不在重复编写了。
代码编写可能比较简陋,主要是新手刚开始进入学习,希望喜欢的观众老爷可以多多点赞支持加关注,谢谢!!