稀疏数组:是一个数组,他的作用是将二维数据保存的值进行优化,减小储存数据的大小。
格式:稀疏素组是一个(n+1)*3的二维数组,其中n表示二维数组中有多少个不同的值。稀疏数组,第一行保存,二维数据的行、列、不同的值得个数;剩余行保存不同值的坐标、值;
举例:
如下数组为一个11*11的二维数组,有3个位置不是0,所以n为3。此例中保存二维数组需要保存11*11个数字,保存稀疏数组需要4*3个。
二维数组:
- 1 0 0 1 0 0 0 0 0 0 0
- 0 1 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 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 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0
稀疏数组:
- 11 11 3
- 0 0 1
- 0 3 1
- 1 1 1
适用场景
当一个数组中大部分元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存该数组;在11*11的场景中,如果不一样的数据超过39个,不适合使用稀疏数组(不考虑数据地址的细节)。
- // 二维数组转稀疏数组
- private static int[][] array2SparsArray(int[][] array) {
- //获取二维数据行和列
- int rowLength = array.length;
- int colLength = array[0].length;
- //获取不一样的数据
- int sum = 0;
- for (int i = 0; i < rowLength; i++) {
- for (int j = 0; j < colLength; j++) {
- if (array[i][j] != 0) {
- sum++;
- }
- }
- }
- //初始化稀疏数组
- int[][] sparsArray = new int[sum + 1][3];
- //第一行保存二维数组的大小和不一样值得个数
- sparsArray[0][0] = rowLength;
- sparsArray[0][1] = colLength;
- sparsArray[0][2] = sum;
- //遍历二维数据,将不同的值的坐标和值保存到稀疏数组
- //记录稀疏数组的行
- int count = 0;
- for (int i = 0; i < rowLength; i++) {
- for (int j = 0; j < colLength; j++) {
- if (array[i][j] != 0) {
- count++;
- //保存二维数组的坐标
- sparsArray[count][0] = i;
- sparsArray[count][1] = j;
- //保存二维数组的值
- sparsArray[count][2] = array[i][j];
- }
- }
- }
- return sparsArray;
- }
- // 稀疏数组转二维数组
- private static int[][] sparsArray2Array(int[][] sparsArray) {
- //获取二维数据行和列
- int rowLength = sparsArray[0][0];
- int colLength = sparsArray[0][1];
- //初始化二维数组
- int[][] array = new int[rowLength][colLength];
- int sparsArrayLength = sparsArray.length;
- for (int i = 1; i < sparsArrayLength; i++) {
- //回复二维数组中不一样的值
- array[sparsArray[i][0]][sparsArray[i][1]] = sparsArray[i][2];
- }
- return array;
- }
-
-
- public class sparsearray {
- public static void main(String[] args) {
- int[][] array1 = new int[11][11];
- array1[0][0] = 1;
- array1[1][1] = 1;
- array1[0][3] = 1;
- System.out.println("打印二维数组");
- printArray(array1);
- int[][] sparsArray = array2SparsArray(array1);
- System.out.println("打印二维数组转换后的稀疏数组");
- printArray(sparsArray);
- System.out.println("打印稀疏数组回复后的二维数据");
- int[][] array2 = sparsArray2Array(sparsArray);
- printArray(array2);
- }
-
- // 二维数组转稀疏数组
- private static int[][] array2SparsArray(int[][] array) {
- //获取二维数据行和列
- int rowLength = array.length;
- int colLength = array[0].length;
- //获取不一样的数据
- int sum = 0;
- for (int i = 0; i < rowLength; i++) {
- for (int j = 0; j < colLength; j++) {
- if (array[i][j] != 0) {
- sum++;
- }
- }
- }
- //初始化稀疏数组
- int[][] sparsArray = new int[sum + 1][3];
- //第一行保存二维数组的大小和不一样值得个数
- sparsArray[0][0] = rowLength;
- sparsArray[0][1] = colLength;
- sparsArray[0][2] = sum;
- //遍历二维数据,将不同的值的坐标和值保存到稀疏数组
- //记录稀疏数组的行
- int count = 0;
- for (int i = 0; i < rowLength; i++) {
- for (int j = 0; j < colLength; j++) {
- if (array[i][j] != 0) {
- count++;
- //保存二维数组的坐标
- sparsArray[count][0] = i;
- sparsArray[count][1] = j;
- //保存二维数组的值
- sparsArray[count][2] = array[i][j];
- }
- }
- }
- return sparsArray;
- }
-
- // 稀疏数组转二维数组
- private static int[][] sparsArray2Array(int[][] sparsArray) {
- //获取二维数据行和列
- int rowLength = sparsArray[0][0];
- int colLength = sparsArray[0][1];
- //初始化二维数组
- int[][] array = new int[rowLength][colLength];
- int sparsArrayLength = sparsArray.length;
- for (int i = 1; i < sparsArrayLength; i++) {
- //回复二维数组中不一样的值
- array[sparsArray[i][0]][sparsArray[i][1]] = sparsArray[i][2];
- }
- return array;
- }
-
- // 二维数组打印
- private static void printArray(int[][] array) {
- int rowLength = array.length;
- int colLength = array[0].length;
- for (int i = 0; i < rowLength; i++) {
- for (int j = 0; j < colLength; j++) {
- System.out.printf("%d\t", array[i][j]);
- }
- System.out.println();
- }
- }
-
-
- // 稀疏数组存盘
-
- // 读取稀疏数组
- }
- 打印二维数组
- 1 0 0 1 0 0 0 0 0 0 0
- 0 1 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 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 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0
- 打印二维数组转换后的稀疏数组
- 11 11 3
- 0 0 1
- 0 3 1
- 1 1 1
- 打印稀疏数组回复后的二维数据
- 1 0 0 1 0 0 0 0 0 0 0
- 0 1 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 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 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0