数据结构——稀疏数组
开门见山,稀疏数组的主要作用是用来压缩数据,把存在大部分公共值(或0)的二维数组,压缩为二维数组;
举例
如一个8X8的二维数组,仅有几个数不为0。如果按照普通情况存储,则需要存储8X8的二维数组。
以稀疏数组存储则大大节省空间。
0 0 0 0 0 0 0 0
0 4 0 0 0 0 0 0
0 0 0 4 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 4 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
在转化为稀疏数组后,如下:
8 8 3
1 1 4
2 3 4
4 5 4
稀疏数组的定义规则:
第一行存储原来二维数组的基本信息,分别为以下格式:
原数组行数 -> 案例为8 | 原数组列数 -> 案例为8 | 原数组差异数总数(案列中是不能0的数的总数) -> 案例为3 |
---|---|---|
1 | 1 | 4 |
2 | 3 | 4 |
4 | 5 | 6 |
代码
/**
* 稀疏数组
*
* @author sulin
*/
public class SparseArray {
static int[][] array = new int[8][8];
static {
array[1][1] = 4;
array[2][3] = 4;
array[4][5] = 4;
}
/**
* 简单的遍历打印
* @param array 数组
*/
public static void foreachArray(int[][] array) {
for (int[] ints : array) {
for (int anInt : ints) {
System.out.printf("%d\t", anInt);
}
System.out.println();
}
}
public static void main(String[] args) {
foreachArray(array);
System.out.println("---------------------------");
int[][] sparseArray = convertArrayToSparseArray(array);
foreachArray(sparseArray);
System.out.println("---------------------------");
int[][] reconvertArray = convertSparseArrayToArray(sparseArray);
foreachArray(reconvertArray);
}
/**
* 普通数组-->稀疏数组
* @param array 普通数组
* @return 稀疏数组
*/
public static int[][] convertArrayToSparseArray(int[][] array) {
//计算需要存储的数(不为0的数)
int count = 0;
for (int[] ints : array) {
for (int number : ints) {
if (number != 0) {
count++;
}
}
}
//初始化稀疏数组
int[][] sparseArray = new int[(count + 1)][3];
sparseArray[0][0] = 8;
sparseArray[0][1] = 8;
sparseArray[0][2] = count;
int row = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
sparseArray[++row][0] = i;
sparseArray[row][1] = j;
sparseArray[row][2] = array[i][j];
}
}
}
return sparseArray;
}
/**
* 稀疏数组-->普通数组
* @param sparseArray 稀疏数组
* @return 普通数组
*/
public static int[][] convertSparseArrayToArray(int[][] sparseArray) {
int[][] simpleArray = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
simpleArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return simpleArray;
}
}