线性结构:一对一的线性关系表
顺序存储:存储元素地址连续(数组)
链式存储:存储元素地址比一定连续(链表)
常见:数组、队列、链表、栈
非线性结构:不是一对一的关系
常见:二维数组、多维数组、广义表、树结构、图结构
稀疏数组:
需求:五子棋程序 ,存盘退出和续上盘的功能
为啥用稀疏数组:0太多,占内存
使用场景:当一个数组中大部分元素是同一个值时,使用稀疏数组
处理方法:记录一个数组有几行几列,有多少个不同值,把有不同值的元素行列记录在小规模数组中,缩小程序规模
二维数组转稀疏数组的思路:
1.遍历原始数组,得到有效数据个数sum
2.根据sum创建稀疏数组 sparseArr int[sum+1] [3]
sum+1表示行 3 表示列(固定)
3.将二维数组有效数据存储到稀疏数组
稀疏数组转为原始二维数组的思路
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,例:棋盘chessArr2 = int[11] [11]
2.再读取稀疏数组的后几行数据,赋值给二维数组
代码实现:
package com.xxxx.sf.稀疏数组;
/**
* @author 封阳
* @create 2020/12/7
* @Version 1.0
**/
public class SparseArray {
public static void main(String[] args) {
int chessArr1[][] = new int[10][10];
chessArr1[2][3] = 1;
chessArr1[3][4] = 2;
//输出原始数组
System.out.println("原始二维数组");
for (int[] chess: chessArr1){
for (int cs : chess){
System.out.print("\t"+cs);
}
System.out.println();
}
/** 如果给了以上二维数组 转为稀疏数组*/
int num=0 ; //非0值个数
//1.遍历二维数组 得到非0值个数
for (int i=0;i<chessArr1.length;i++){
for (int j=0;j<chessArr1.length;j++){
if (chessArr1[i][j] != 0){
num++;
}
}
}
System.out.println("num="+num);
//2.创建稀疏数组
int chessArr2[][] = new int[num+1][3];
//设置第一行数据 行数 列数 非0值个数
chessArr2[0][0] = 11;
chessArr2[0][1] = 11;
chessArr2[0][2] = num;
//3. 遍历二维数组,将非0值存入稀疏数组
for (int i=0;i<chessArr1.length;i++){
for (int j=0;j<chessArr1.length;j++){
if (chessArr1[i][j] != 0){
// 拿到 i=2 j=3 值=1 得到 2 3 1
chessArr2[i-1][0] = i;
chessArr2[i-1][1] = j;
chessArr2[i-1][2] = chessArr1[i][j];
}
}
}
System.out.println("row\t"+"col\t"+"value");
for (int i=0;i<chessArr2.length;i++){
for (int j=0;j<chessArr2.length;j++){
System.out.print(chessArr2[i][j]+"\t");
}
//格式-->换行
System.out.println();
}
/** 将稀疏数组转换为二维数组 */
//读取稀疏数组第一行得到二维数组的行列数
int chessArr3[][] = new int[chessArr2[0][0]][chessArr2[0][1]];
//遍历赋值给新二维数组
for (int i=1;i<chessArr2.length;i++){
for (int j=0;j<chessArr2.length;j++){
chessArr3[chessArr2[i][0]][chessArr2[i][1]] = chessArr2[i][j];
}
}
//遍历chess3 数组
System.out.println("原始二维数组");
for (int[] chess: chessArr3){
for (int cs : chess){
System.out.print("\t"+cs);
}
System.out.println();
}
System.out.println(chessArr3 == chessArr1); //false
System.out.println(chessArr3.equals(chessArr1)); //false
}
}
总结:
已知10 行,10 列的二维数组
当转换为稀疏矩阵时:
只有三列(固定),设置第一行数据(10 、10、非0值个数)
双重for遍历赋值给稀疏数组,当二维数组不为空时,将i赋值给稀疏数组的i- 1行0列,j赋值给稀疏数组的i-1行1列,将非空值传给稀疏数组ij位置
再将稀疏矩阵转为二维数组:
稀疏数组的第一行第0列值:新数组的行
稀疏数组的第一行第1列值:新数组的列
稀疏数组的第一行第2列值:新数组的值