Java 数据结构与算法2——稀疏数组
作者:互联网
目录
1 线性结构
- 线性结构是最常用的数据结构,特点是数据元素之间存在一对一的线性关系
- 线性结构有两种不同的存储结构,即顺序存储和链式存储结构。顺序存储的线性表称为顺序表,表中的存储元素是连续的;链式存储的线性表称为链表,表中的存储元素不一定是连续的,元素节点中存储数据元素及相邻元素的地址信息。
- 线性结构常见的有:数组、队列、链表和栈。
2 非线性结构
非线性结构包括:二维数组、多维数组、广义表、树结构、图结构
3 稀疏数组
先看一个实际需求
编写的五子棋程序中,有存盘退出和续上盘的功能。
因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据—>稀疏数组
稀疏数组
- 使用场景:当一个数组中大部分元素为0,或为同一个值的数组时,可以使用稀疏数组来保存该数组。
- 处理方法:(1)第一行记录数组一共几行几列,有多少不同的值;(2)之后把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
- 稀疏数组举例说明:
左图为原始二维数组,包含67=42个元素;右图为稀疏数组,包含93=27个元素。其第一行表示原始数组为6行7列且有值元素共8个,第二行到九行分别记录原始数组的位置及值。
二维数组转稀疏数组思路:
- 遍历原始二维数组,得到有效数据的个数sum
- 根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]
- 将二维数组的有效数据存入到稀疏数组
稀疏数组转二维数组思路:
- 先读取稀疏数组第一行,根据第一行的数据,创建二维数组chessArr = int[6][7]
- 在读取稀疏数组后几行的数据,并赋值给二维数组
4 代码实现(五子棋)
上图是实现五子棋数据存储和读取的示意图,关键部分依然是二维数组与稀疏数组的转换。其基本思路在第3点已经阐述,这里实现代码。
- 创建一个原始的二维数组
//0:表示没有;1:表示黑子;2:表示白子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][4] = 2;
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
- 二维数组转为稀疏数组
//1. 遍历原始二维数组,得到有效数据的个数sum
int sum = 0;
for (int i = 0; i < chessArr1.length; i++) {
for ( int j = 0; j < chessArr1[0].length; j++){
if(chessArr1[i][j] != 0){
sum++;
}
}
}
//2. 根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]
int sparseArr[][] = new int[sum + 1][3];
//给稀疏数组赋值
sparseArr[0][0] = chessArr1.length;
sparseArr[0][1] = chessArr1[0].length;
sparseArr[0][2] = sum;
//3. 遍历二维数组,将有值的元素存放到稀疏数组中
int count = 0 ;
for (int i = 0; i < chessArr1.length; i++) {
for ( int j = 0; j < chessArr1[0].length; j++){
if(chessArr1[i][j] != 0){
count ++ ;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
得到的稀疏数组为:
11 11 2
1 2 1
2 4 2
- 将稀疏数组恢复为二维数组
//1. 先读取稀疏数组第一行,根据第一行的数据,创建二维数组chessArr = int[6][7]
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//2. 在读取稀疏数组后几行的数据,并赋值给二维数组
for (int i = 1; i<sparseArr.length; i++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//输出恢复的二维数组
System.out.println("恢复后的二维数组:");
for (int[] row : chessArr2){
for (int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
输出结果显然和原始二维数组一模一样,哈哈!
这里在加上将稀疏数组存入和读取文件的代码
保存稀疏数组
String filename = "D:\\workspaceJava\\src\\数据结构\\稀疏数组\\sparseArray.txt";
BufferedWriter bw = new BufferedWriter(new FileWriter(filename));
System.out.println("保存稀疏数组---");
for (int[] row : sparseArr){
for (int data : row){
bw.write(String.valueOf(data)+"\t");
}
bw.write("\n");
bw.flush();
}
bw.close();
读取稀疏数组
int sparseArr2[][] = new int[sum + 1][3];
int count2 = 0 ;
BufferedReader br = new BufferedReader(new FileReader(filename));
System.out.println("读取稀疏数组---");
String s;
while((s=br.readLine()) != null){
sparseArr2[count2][0] = Integer.parseInt(s.split("\t")[0]);
sparseArr2[count2][1] = Integer.parseInt(s.split("\t")[1]);
sparseArr2[count2][2] = Integer.parseInt(s.split("\t")[2]);
count2++;
}
br.close();
小结
1稀疏数组可以减少空间复杂度;2稀疏数组实现二维数组的数据压缩与数据恢复
标签:Java,int,chessArr1,稀疏,算法,二维,数组,sparseArr,数据结构 来源: https://blog.csdn.net/weixin_45968656/article/details/113771987