Java學習——資料結構之稀疏陣列
阿新 • • 發佈:2021-11-29
稀疏陣列
二維陣列的很多預設值為0或者同一個值時,使用稀疏陣列來儲存資料。
處理思路
-
遍歷原始的二維陣列,得到有效資料的個數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(); } }