稀疏数组是对普通数组的压缩方法,当普通数组的重复元素占用绝大多数的时候,我们可以使用稀疏数组的方式存储,可以极大的节约内存,压缩存储可以提高IO效率。比如五子棋的棋盘,象棋的残局等。
一、存储方式对比
普通数组
1 2 3 4 5 6 7 8
| 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 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
|
稀疏数组
1 2 3 4
| 8 8 3 1 2 1 2 3 2 4 5 2
|
二、稀疏数组
存储方法:
第一行 记录有几行几列,有多少不同值。
其余行记录每个不同值所在的行数、列数和值。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| package cn.jsledd.sparsearray;
import java.util.Collections;
public class SparseArray { public static void main(String[] args) { int array[][] = new int[8][8]; array[1][2] = 1; array[2][3] = 2; array[4][5] = 2; System.out.println("原始的二维数组~~"); for (int[] row : array) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } int[][] sparseArray = convertToSparseArray(array); System.out.println("二维数组转成的稀疏数组~~"); for (int[] row : sparseArray) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } System.out.println("稀疏数组还原成普通数组~~"); int[][] array2 = convertToArrayfromSparseArray(sparseArray); for (int[] row : array2) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } }
public static int[][] convertToSparseArray(int[][] array) { int sum = 0; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { if (array[i][j] != 0) { sum++; } } } int[][] sparseArray = new int[sum + 1][3]; sparseArray[0][0] = array.length; sparseArray[0][1] = array[0].length; sparseArray[0][2] = sum; int count = 0; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { if (array[i][j] != 0) { count++; sparseArray[count][0] = i; sparseArray[count][1] = j; sparseArray[count][2] = array[i][j]; } } } return sparseArray; }
public static int[][] convertToArrayfromSparseArray(int[][] sparseArray){ int rowlength = sparseArray[0][0]; int collength = sparseArray[0][1]; int [][] array = new int[rowlength][collength]; for (int i = 1; i < sparseArray.length; i++) { int [] row = sparseArray[i]; array[row[0]][row[1]] = row[2]; } return array; }
}
|