稀疏數組就是數組中,大部分的元素值都未被使用(或都爲0),在數組中僅有少 部分的空間使用。所以形成內存空間的浪費,爲了解決這問題,而且不影響數組中原 有的元素值,咱們採用了一種壓縮的方式來 表示稀疏數組的內容。 如圖二維數組所示,有大部分的空間是無用的。 數組
在這裏能夠使用稀疏數組進行壓縮。其中在稀疏數組中第一部分所記錄的是原數組的列數和行數以及元素使用的個數、第二部分所記錄的是原數組中元素的位置和內容。通過壓縮以後,原來須要聲明大小爲63的數組,而使用壓縮後,只須要聲明大小爲6*3的數組,僅需18個存儲空間。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");
}
}
}
複製代碼