稀疏数组的生成与原数组的恢复
1.稀疏数组的介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
记录数组一共有几行几列,有多少个不同的值。
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
2.稀疏数组的实现
package com.bhy.test1;
/**
* 1.稀疏数组
* 以棋盘为例
* <p>
* 8x8
* 0 0 0 0 0 0 0 0
* 0 0 1 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
* ||
* \/
* 变成3x3 数组,
* 行 列 值
* 8 8 2 表示数组大小8x8,有2个值
* 1 2 1 表示第二行第三列的值为1
* 2 3 2 表示第三行第四列的值为2
*/
public class Demo1 {
public static void main(String[] args) {
//int arr[][] = new int[8][8];
int arr[][] = new int[11][11];
arr[1][2] = 1;
arr[2][3] = 2;
arr[2][4] = 2;
System.out.println("数组是:");
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
int[][] sparseArray = getSparseArray(arr);
System.out.println("得到的稀疏数组是:");
for (int[] ints : sparseArray) {
System.out.println(ints[0] + "\t" + ints[1] + "\t" + ints[2]);
}
int[][] recoverArray = recoverArray(sparseArray);
System.out.println("恢复后的数组是:");
for (int[] ints : recoverArray) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
/**
* 变成稀疏数组
*
* @param arr
* @return
*/
public static int[][] getSparseArray(int[][] arr) {
int sum = 0;//有效数据
int length = 0;
for (int i = 0; i < (length = arr.length); i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
sum++;
}
}
}
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = arr.length;
sparseArray[0][1] = length;
sparseArray[0][2] = sum;
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = arr[i][j];
}
}
}
return sparseArray;
}
/**
* 把稀疏数组变成原来的数组
*
* @param arr
* @return
*/
public static int[][] recoverArray(int[][] arr) {
//行
int length1 = arr[0][0];
//列
int length2 = arr[0][1];
int array[][] = new int[length1][length2];
for (int i = 1; i < arr.length; i++) {
array[arr[i][0]][arr[i][1]] = arr[i][2];
}
return array;
}
}