今天要和大家分享的內容非常的乾貨。大家在做項目的過程中可能會遇到這種問題,通過數組實現一個功能的時候,發現數組中有大量的重複數據。沒有研究過數據結構的人可能感覺沒有什麼,依舊是一大坨數的存儲、讀取。
而研究過數據結構的朋友就不會這麼死板。我也不賣關子了,今天我就給大家介紹一下今天的主角–>稀疏數組。
使用場景:當一個數組中的大部分元素爲同一個值時,可以使用稀疏數組來保存該數組。 把存放二維數組的方式 變成存放行列和值進行數據量的壓縮。
具體處理方法:
1)記錄數組一共有幾行幾列,有多少個不同的值。
2)把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模。
比如下面這中數據中含有大量的0,我們通過稀疏數組的方式進行優化。
稀疏數組的第一行記錄的是數組的整體數據,一共有幾行,有幾列,有幾個不是大量重複的數據。稀疏數組的思想就是讓我們只需要記錄這些不同數據的位置和值。
圖示稀疏數組
代碼實例
public class SparseArray {
public static void main(String[] args) {
//創建一個原始的二位數組 11 * 11
int[][] chessArr1 =new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][5] = 2;
//輸出原始的二維數組
System.out.println(“原始的二維數組”);
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//將二維數組 轉稀疏數組的思想
//1.先遍歷二維數組 得到非0數據的個數
int sum = 0;
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr1.length; j++) {
if (chessArr1[i][j] !=0){
sum ++;
}
}
}
System.out.println("sum=" + sum);
//創建對應的稀疏數組
int[][] sparseArr= new int[sum +1][3];
//給稀疏數組賦值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍歷二維數組,將非0的值存放到sparseArr中
/**
* 用於記錄是第幾個非0數據
*/
int count = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] =j;
sparseArr[count][2] =chessArr1[i][j];
}
}
}
//輸出稀疏數組的形式
System.out.println();
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]);
}
System.out.println();
//將稀疏數組 --》恢復成
/**
* 1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組
* 2.在讀取稀疏數組後幾行的數據,並賦給 原始的二維數組 即可。從第二行開始
*/
int [][] chessArray2 = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++) {
chessArray2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//輸出恢復後的二位數組
System.out.println();
System.out.println("恢復後的二維數組~");
for (int[] row : chessArray2) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}