Java数据结构之稀疏数组
基本介绍
当一个数组中大部分元素为0或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法
1.记录数组一共有几行几列,有多少个不同的值。
2.把具有不同的值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
二维数组转稀疏数组的思路
1.遍历原始的二维数组,得到有效数组的个数sum;
2.根据sum就可以创建稀疏数组sparseArray;
3.将二维数组的有效数据保存到稀疏数组。
稀疏数组转二维数组
1.先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组;
2.再读取稀疏数组后几行的数据,并赋值给原始的二维数组即可。
展示代码
public class SparseArray {
/**
* 随机产生一个NxN的一个稀疏矩阵
* @param arraySize 数组大小
* @param num 非0元素个数
* @return 有可能生成的个数少于num的个数
*/
public int[][] initArray(int arraySize,int num){
int[][] array = new int[arraySize][arraySize];
for (int i = 0;i < num;i++){
Random rand = new Random();
int row = rand.nextInt( arraySize );
int col = rand.nextInt( arraySize );
if (array[row][col] == 0){
array[row][col] = rand.nextInt( 9 )+1;
}
}
return array;
}
/**
* 原始数组转变为稀疏数组
* @param array
* @return
*/
public int[][] arrayToSparseArray(int[][] array){
int rowNum = array.length;
int colNum = array[0].length;
//将二维数组转换成稀疏数组
//1.先遍历二维数组,得到非0数据的个数
int sum = 0;
for (int i = 0;i < rowNum; i++){
for (int j = 0;j < colNum;j++){
if (array[i][j] != 0){
sum++;
}
}
}
//创建稀疏数组
int count = 0;
int[][] sparseArray = new int[sum+1][3];
sparseArray[0][0] = rowNum;
sparseArray[0][1] = colNum;
sparseArray[0][2] = sum;
for (int i = 0;i < rowNum; i++){
for (int j = 0;j < colNum;j++){
if (array[i][j] != 0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = array[i][j];
}
}
}
return sparseArray;
}
/**
* 稀疏数组转变为原始数组
* @param sparseArray
* @return
*/
public int[][] sparseArrayToaArray(int[][] sparseArray){
//将稀疏数组恢复成原始的数组
int rowNum = sparseArray[0][0];
int colNum = sparseArray[0][1];
int[][] newArray = new int[rowNum][colNum];
for (int i = 1;i < sparseArray.length;i++){
newArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return newArray;
}
public static void main(String[] args) {
SparseArray sa = new SparseArray();
//先创建一个原始的二维数组 11*11
//0:表示没有棋子,1:表示黑子,2:表示白子
int[][] chessArr1 = sa.initArray(4,2);
//输出原始的二维数组
System.out.println("原始的二维数组:");
for (int[] row : chessArr1){
for (int dada : row){
System.out.print(dada);
System.out.print(" ");
}
System.out.println();
}
int[][] sparseArray = sa.arrayToSparseArray(chessArr1);
//输出稀疏数组的形式
System.out.println("------------------");
System.out.println("稀疏数组:");
for (int i = 0;i < sparseArray.length; i++){
for (int j = 0;j < sparseArray[i].length;j++){
System.out.print(sparseArray[i][j]);
System.out.print(" ");
}
System.out.println();
}
int[][] newArray = sa.sparseArrayToaArray( sparseArray );
//显示原始数组
System.out.println("-----------------------");
System.out.println("新的原始数组:");
for (int[] newA : newArray){
for (int dada : newA){
System.out.print(dada);
System.out.print(" ");
}
System.out.println();
}
}
}
学习自B站尚硅谷Java数据结构与java算法,韩顺平数据结构与算法