二維陣列與稀疏陣列相互之間的轉化
阿新 • • 發佈:2022-04-09
二維陣列與稀疏陣列之間的轉化
什麼是稀疏陣列,可以用一張圖表示
0 | 1 | 2 | |
---|---|---|---|
0 | 原始 二維陣列行數 | 原始二維陣列列數 | 原始二維陣列中值的個數 |
1 | 原始行 | 原始列 | 原始值 |
下面舉一個例子
>將下面二維陣列轉化壓縮為稀疏陣列:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 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 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 | 2 |
---|---|---|
1 | 2 | 1 |
2 | 3 | 2 |
具體程式碼如下
·public class Demo01 {
/*使用稀疏陣列來儲存二維陣列中的資料 * 稀疏陣列第一行記錄的是二維陣列的行數列數和值的個數 * 接下來記錄的是原始陣列中值所在的位置*/ //整體思路 //1,先建立一個二維陣列 //2,遍歷原始陣列,得到不為0的值的個數 //3,壓縮,建立稀疏陣列,遍歷稀疏陣列,將原始陣列中的資料儲存到稀疏陣列中去 //4,解壓,將稀疏陣列轉化為原始陣列 public static void main(String[] args) { //建立一個原始的二維陣列 //0表示沒有棋子,1表示黑子,2表示白子 int[][] arr = new int[11][11]; arr[1][2] = 1; arr[2][3] = 2; //輸出原始二維陣列 System.out.println("原始陣列為:"); for (int row[] : arr) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } //將二維陣列轉化成為稀疏陣列 //遍歷得到0的個數 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if (arr[i][j] != 0) { sum++; } } } //建立對應的稀疏陣列 int sparseArr[][] = new int[sum+1][3]; //為稀疏陣列賦值 sparseArr[0][0] = 11; sparseArr[0][1] = 11; sparseArr[0][2] = sum; //遍歷二維陣列,存入到稀疏陣列中 int count = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if (arr[i][j] != 0) { count++; sparseArr[count][0] =i; sparseArr[count][1] =j; sparseArr[count][2] =arr[i][j]; } } } //遍歷稀疏陣列 System.out.println("稀疏陣列為:"); for (int i = 0; i < sparseArr.length; i++) { System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); } //將稀疏陣列恢復為原始二維陣列 int yuanArr[][] = new int[sparseArr[0][1]][sparseArr[0][1]]; for (int i = 0; i < sparseArr.length-1; i++) { yuanArr[sparseArr[i+1][0]][sparseArr[i+1][1]] = sparseArr[i+1][2]; } System.out.println("恢復後的原屬陣列為:"); for (int row[]:yuanArr){ for (int data: row){ System.out.printf("%d\t",data); } System.out.println(); } }
}
·