稀疏数组
稀疏数组就是数组中,大部分的元素值都未被使用(或都为0),在数组中仅有少 部分的空间使用。因此造成内存空间的浪费,为了解决这问题,并且不影响数组中原 有的元素值,我们采用了一种压缩的方式来 表示稀疏数组的内容。
如图二维数组所示,有大部分的空间是无用的。
在这里可以使用稀疏数组进行压缩。其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。
代码实现
将二维数组变成稀疏数组
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
| public class SparseArray { private static final int row = 9; private static final int col = 7; public static void main(String[] args) { int arr[][] = new int[row][col]; arr[1][1]=3; arr[3][0]=1; arr[3][1]=4; arr[4][2]=7; arr[5][5]=5; System.out.println("输入原始二维数组-----------------"); prt(arr); System.out.println("-------------------------------");
int sum=0; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { if(arr[i][j]!=0){ sum++; } } } int sparse[][] = new int[sum+1][3]; sparse[0][0] = arr.length; sparse[0][1] = arr[0].length; sparse[0][2] = sum;
int count =0; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { if(arr[i][j]!=0){ count++; sparse[count][0] = i; sparse[count][1] = j; sparse[count][2] = arr[i][j]; } } } System.out.println("输出稀疏数组"); prt(sparse);
int arr2[][] =new int[sparse[0][0]][sparse[0][1]]; for (int i = 1; i <sparse.length ; i++) { arr2[sparse[i][0]][sparse[i][1]] = sparse[i][2]; } System.out.println("输出还原的二维数组"); prt(arr2); } public static void prt(int [][] arr ){ for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j]+" "); } System.out.println("\n"); } } }
|