学习起因
不想讲什么大道理,也讲不来。不能只当码农,路还很长,一步步走,提升自我。接近于一篇学习日记&总结,尽量分享经验,共勉。有发现错误或者不足之处可以大胆用力指出,代码的路上谁不是磕磕碰碰。
资料来源
bilibili韩顺平数据结构与算法 ,不愧是央妈钦点的中国最大学习网站,娱乐之余不要忘记学习。
本系列部分图片来自视频截图,如有侵权,请联系作者删除修正。
个人理解
浅谈学习方法:
- 从现实案例入手,引出问题。
- 介绍对应的数据结构,讲解原理,方法
- 应用实例夯实
前置条件:
- 至少掌握一门编程语言,我是Java
- 有编程环境,本系列使用idea+jdk1.8
话不多说,开始学习之旅
定义
经典算法
分类
- 根据元素存储是否连续划分为线性结构和非线性结构
数组
稀疏数组sparseAaary
案例背景
简易五子棋游戏的存盘和读盘,直接存便是一个二维数组,在数组中不同数组少的情况下,占用空间大,稀疏数组可以有效的压缩数组大小,节省空间。
介绍
当一个数组中大部分元素为0或者为同一个值时,可以使用一个稀疏数组来保存该数组
int[] sparseArrawy = new int[size][3]
- size值为“目标数组中不同值的个数+1”,多出来的一行记录目标数组共有几行几列以及多少个不同的值。
- 稀疏数组固定是3列,row——col——value。
格式
第一行固定记录压缩前的数组共有几行几列及多少不同的值
第二行开始,记录不同值的元素所在行row、所在列col、值value
没记录的则是默认值。注意,重复的不同值也算
案例及思路分析
代码实现
注意:有使用基本的IO流操作。
public class SparseArray {
/**
* 思路:
* 1. 获取数组
* 2. 遍历目标数组,获得不同的值,并存入稀疏数组中
* 3. 新建稀疏数组,大小由目标数组决定
* 4. 将稀疏数组存放到磁盘当中
* 5. 从磁盘当中读取稀疏数组
* 6. 根据稀疏数组生成二维数组
*/
public static void main(String[] args) throws IOException {
int[][] targetArray = new int[11][10];
targetArray[1][2] = 1;
targetArray[2][3] = 2;
System.out.println("原始二维数组:");
for (int[] array:targetArray) {
for (int i : array) {
System.out.printf("%d\t", i);
}
System.out.println();
}
//2. 遍历目标数组,获得不同的值的数量\
int sum = 0;
for (int i = 0; i < targetArray.length; i++) {
for (int j = 0; j < targetArray[i].length ; j++) {
if (targetArray[i][j] != 0){
sum++;
}
}
}
System.out.println("不同值的数量为:" + sum);
//3. 新建稀疏数组,大小由目标数组决定
int[][] sparseArray = new int[sum+1][3];
sparseArray[0][0] = targetArray.length;
sparseArray[0][1] = targetArray[0].length;
sparseArray[0][2] = sum;
int sparseRow = 1;
for (int i = 0; i < targetArray.length; i++) {
for (int j = 0; j < targetArray[i].length ; j++) {
if (targetArray[i][j] != 0 && sparseRow <= sum+1){
sparseArray[sparseRow][0] = i;
sparseArray[sparseRow][1] = j;
sparseArray[sparseRow][2] = targetArray[i][j];
sparseRow++;
}
}
}
System.out.println("————————稀疏数组————————");
for (int[] sparse: sparseArray) {
for (int v : sparse) {
System.out.printf("%d\t", v);
}
System.out.println();
}
//4. 将稀疏数组存放到磁盘当中
OutputStreamWriter outputStreamWriter = new FileWriter(new File("E:\\wzwPro\\wzw.txt"));
String temp = "";
System.out.println("----稀疏数组存到磁盘开始----");
for (int[] sparse: sparseArray) {
for (int v : sparse) {
temp = temp.concat(String.valueOf(v)).concat("\t");
}
System.out.println("temp = " + temp);
outputStreamWriter.write(temp);
outputStreamWriter.write("\n");
//outputStreamWriter.flush();
temp = "";
}
outputStreamWriter.close();
System.out.println("----稀疏数组存到磁盘结束----");
//5. 从磁盘当中读取稀疏数组
//6. 根据稀疏数组生成二维数组
System.out.println("----从磁盘读取稀疏数组开始----");
String path = "E:\\wzwPro\\wzw.txt";
BufferedReader reader = new BufferedReader(new FileReader(path));
String line;
int newRow = 0;
int newCol = 0;
//根据第一行获取稀疏数组的行列及不同值个数
if ((line = reader.readLine()) != null) {
String[] t = line.split("\t");
newRow = Integer.parseInt(t[0]);
newCol = Integer.parseInt(t[1]);
}
int[][] newArray = new int[newRow][newCol];
while ((line = reader.readLine()) != null) {
String[] t = line.split("\t");
newArray[Integer.parseInt(t[0])][Integer.parseInt(t[1])] = Integer.parseInt(t[2]);
}
reader.close();
System.out.println("----从磁盘读取稀疏数组结束----");
System.out.println("----根据稀疏数组生成的二维数组----");
for (int[] array:newArray) {
for (int i : array) {
System.out.printf("%d\t", i);
}
System.out.println();
}
}
}
磁盘地址可以根据自己需要修改。