数据结构与算法之稀疏数组
1、稀疏数组说明
- 稀疏数组:m行三列的数组。第一行数据分别为原始数组的 行数、列数、非零个数。后面的数据为原始数据的非零数的行下标、列下标和值,根据原始数组依次类推得到稀疏数组的行数。
- 图片说明
2、思路
-
二维数组 转 稀疏数组 1. 遍历 原始的二维数组,得到有效数据的个数 sum 2. 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3] 3. 将二维数组的有效数据数据存入到 稀疏数组 稀疏数组 转 原始的二维数组 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11] 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
3、代码实现
package com.datastrucate.sparsearrray;
/**
* ClassName:SparseArray
* Package:com.datastrucate.sparsearrray
* Description:数据结构
* 二维数组 =》 稀疏数组
* 稀疏数组 =》 二维数组
* 思路:
* 二维数组 转 稀疏数组
1. 遍历 原始的二维数组,得到有效数据的个数 sum
2. 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
3. 将二维数组的有效数据数据存入到 稀疏数组
稀疏数组转原始的二维数组
1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
*
* @Date:2021/2/14 10:38
* @Author:hm
*/
public class SparseArray {
public static void main(String[] args) {
//**********************二维数组 转 稀疏数组*********************************//
//定义二维数组,代表棋盘,1代表黑子,2代表白子,0代表没下子
int chessArr[][] = new int[11][11];
//赋值
chessArr[1][2] = 1;
chessArr[2][3] = 2;
chessArr[3][4] = 2;
//遍历输出原始二维数组
System.out.println("原始二维数组");
for (int[] arr:chessArr) {
for (int data:arr){
System.out.print(" "+data);
}
System.out.println();
}
//将二维数组转稀疏数组
//计算稀疏数组行数 -》 二维数组的带有棋子的个数+1
int sum = 0;
for (int i = 0; i<11; i++) {
for (int j=0; j<11; j++){
if (chessArr[i][j] != 0)
sum++;
}
}
//定义稀疏数组 sum+1行,3列
int[][] sparseArr = new int[sum+1][3];
//给稀疏数组第一行赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//给后面几行赋值
//遍历二维数组,把非零数字赋给稀疏数组
int count = 0;//用于记录稀疏数组行数下标
for (int i=0; i<11; i++){
for (int j=0; j<11; j++){
if (chessArr[i][j] != 0){
count++;//从第二行开始
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏二维数组");
for (int[] arr:sparseArr) {
for (int data:arr){
System.out.print(" "+data);
}
System.out.println();
}
//****************稀疏数组转二维数组*******************//
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
//给二维数组赋值
for (int i = 1; i<sparseArr.length;i++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("稀疏数组长度为"+sparseArr.length);
//遍历输出原始二维数组
System.out.println("原始二维数组");
for (int[] arr:chessArr2) {
for (int data:arr){
System.out.print(" "+data);
}
System.out.println();
}
}
}