算法
线性结构与非线性结构
- 线性结构
- 数据元素一对一
- 存储结构
- 顺序存储
- 数组
- 队列
- 栈
- 链式存储
- 链表
- 顺序存储
- 非线性结构
- 二维数组
- 多维数组
- 广义表
- 树结构
- 图结构
稀疏数组
-
稀疏数组
- 当一个数组大部分为同一个值时,可以用稀疏数组保存
- 记录数组一共有几行几列,多少不同值
- 不同值记录到小规模数组中
-
二维数组转稀疏数组
- 遍历原始数组,得到有效数据个数sum
- 根据sum创建稀疏数组spaceArr = int[sum+1][3]
- 将二维数组有效数据存入稀疏数组
-
稀疏数组转二维数组
- 读取稀疏数组第一行,创建二维数组chessArr = int[spaceArr[0][0]][spaceArr[0][1]]
- 根据稀疏数组后几行数据,赋值给chessArr
// 棋盘
// 创建原始二维数组
// 0 无子 1 黑子 2 白子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
// 输出
System.out.println("原始二维数组");
for(int[] row : chessArr1){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
// 原始二维数组转稀疏数组
// 1:遍历二维数组,得到非0个数
int sum = 0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
sum ++ ;
}
}
}
// 2:创建稀疏数组
int spaceArr[][] = new int[sum+1][3];
// 3:赋值
spaceArr[0][0] = 11;
spaceArr[0][0] = 11;
spaceArr[0][2] = sum;
int count = 0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
count++;
spaceArr[count][0] = i;
spaceArr[count][1] = j;
spaceArr[count][2] = chessArr1[i][j];
}
}
}
// 4:打印
System.out.println("得到稀疏数组:");
for(int i=0;i<spaceArr.length;i++){
System.out.printf("%d\t%d\t%d\n",spaceArr[i][0],,spaceArr[i][1],,spaceArr[i][2]);
}
// 恢复成原始数组
// 读取第一行,创建原始二维数组
int chessArr2[][] = new int[spaceArr[0][0]][spaceArr[0][1]];
// 赋值
// 第二行开始遍历
for(int i=1;i<spaceArr.length;i++){
chessArr2[spaceArr[i][0]][spaceArr[i][1] = spaceArr[i][2];
}
// 输出
System.out.println("恢复数组");
for(int[] row : chessArr2){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}