1. 程式人生 > 其它 >Java學習——資料結構之稀疏陣列

Java學習——資料結構之稀疏陣列

稀疏陣列

二維陣列的很多預設值為0或者同一個值時,使用稀疏陣列來儲存資料。

處理思路

1.將 二維陣列 轉換為 稀疏數
  • 遍歷原始的二維陣列,得到有效資料的個數sum (這裡的有效資料是指和預設值不同的數值)

  • 根據sum建立稀疏陣列sparseArr

  • 將二維陣列的有效資料存入稀疏陣列

2.將稀疏陣列轉換為原始的二維陣列
  • 先讀取稀疏陣列的第一行,根據第一行的資料建立原始的二維陣列

  • 再讀取稀疏陣列第二行及之後的資料並賦值給原始的二維陣列

程式碼實現

/*
    稀疏陣列的儲存:
             行數               列數                    值
第一行     原始陣列的行數        原始陣列的列數      原始陣列中有效資料的個數n
第二行   第一個有效資料的行數   第一個有效資料的列數     第一個有效資料的值
······
第n+1行  第n個有效資料的行數    第n個有效資料的列數     第n個有效資料的值
*/public static void main(String[] args) { //建立原始二維陣列 將原始二維陣列進行賦值 int[][] oldArry = new int[11][13]; //建立時陣列會有預設值為0 oldArry[5][6]=1; oldArry[8][9]=1; ​ //列印原始的二維陣列 System.out.println("原始二維陣列如下:"); for (int i=0;i<oldArry.length;i++) {
for (int j = 0; j < oldArry[0].length; j++) System.out.printf(oldArry[i][j] + "\t"); System.out.println(); } ​ System.out.println("---------------------------------"); //將原始二維陣列轉換為稀疏陣列 int sum=0; //記錄原始二維陣列有效值的個數 for (int i=0;i<oldArry.length;i++)
for (int j = 0; j < oldArry[0].length; j++) if(oldArry[i][j]!=0) sum++; ​ //根據sum的值建立稀疏陣列 int[][] sparseArr = new int[sum+1][3]; ​ //給稀疏陣列賦值 sparseArr[0][0] =oldArry.length; //原始陣列的行數 sparseArr[0][1] =oldArry[0].length;//原始陣列的列數 sparseArr[0][2] =sum; //原始陣列中有效資料的個數 //遍歷原始二維陣列,將有效資料的行、列、數值資訊進行儲存 for (int i=0;i<oldArry.length;i++) for (int j = 0; j < oldArry[0].length; j++) if(oldArry[i][j]!=0) { //從稀疏陣列的最後一行往第二行儲存 sparseArr[sum][0]=i; sparseArr[sum][1]=j; sparseArr[sum][2]=oldArry[i][j]; sum--; } ​ //列印稀疏陣列的值 System.out.println("轉換後的稀疏陣列如下:"); for (int i=0;i<sparseArr.length;i++){ for (int j = 0; j < sparseArr[0].length; j++) System.out.printf(sparseArr[i][j]+"\t"); System.out.println(); } ​ ​ System.out.println("---------------------------------"); //將稀疏陣列轉換為原始二維陣列 //根據稀疏陣列的第一行的資料獲取原始二維陣列的行列值 int [][] newArry = new int[sparseArr[0][0]][sparseArr[0][1]]; ​ //對轉換的二維陣列賦值 for(int i=1;i<sparseArr.length;i++) { newArry[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2]; } //列印轉換後的原始陣列 System.out.println("轉換後的原始陣列如下:"); for (int i=0;i<newArry.length;i++){ for (int j = 0; j < newArry[0].length; j++) System.out.printf(newArry[i][j]+"\t"); System.out.println(); } ​ }