需求:框內是一個12*13的二維數組,現在想將其存儲起來。
因爲有許多值是0,這就會有許多沒有意義的數據。所以用普通的方法存儲會很耗空間。
一、基本介紹
- 當數組中大多數元素爲零,可以使用稀疏數組來保存該數組,以此來達到節約空間的目的。
二、稀疏數組的結構
稀疏數組的列是固定的,爲行(row),列(col),值(value)。
第一部分:原始數組的行數,列數,值(有效的值的個數)
餘下的部分:原始數組中元素的行,列,值
如圖:
稀疏數組的第0行爲原數組的行數,列數,以及原數組的有效值的個數。(12,13,3)
第1行:原數組的行,列,以及值。(即是1行,2列,值是1)
第2行:即是3行,4列,值爲2。
第3行:即是5行,4列,值爲2。
前情提要
//定義一個原始數組
int sourceArray[][] = new int[12][13];
sourceArray[1][2] = 1;
sourceArray[3][4] = 2;
sourceArray[5][4] = 2;
三、思路分析
1.將原數組轉爲稀疏數組
1.首先遍歷原始數組,得到有效數據的個數sum。(sum+1爲稀疏數組的長度)
2.根據sum創建稀疏數組SparseArray[sum+1][3]
3.將數據存入SparseArray[sum+1][3]
(1)將原始數組的行數,列數,有效數據的個數分別存入SparseArray[0][0],SparseArray[0][1],SparseArray[0][2]。
(2)遍歷原始數組,將有效數據存入到稀疏數組中。
- 代碼實現
//遍歷原始二維數組,得到非0的值的個數,
int sum = 0;
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
sum++;
}
}
}
//創建稀疏數組
int sparseArray[][] = new int[sum + 1][3];
//給稀疏數組賦值
sparseArray[0][0] = sourceArray.length; //原始二維數組的行數
sparseArray[0][1] = sourceArray[0].length; //原始二維數組的列數
sparseArray[0][2] = sum;//原始數組中非0的個數
//用於記錄是第幾個非0數
int count = 0;
//遍歷數組,將非0的值存放到稀疏數組sparseArray中
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = sourceArray[i][j];
}
}
}
2.將稀疏數組轉成原始數組
1.首先獲取稀疏數組第一行的數據,根據第一行數據來創建原始數組。
2.遍歷讀取餘下的數據,並賦值給原始數組
- 代碼實現
//創建原始的二維數組
int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
//遍歷,將值賦給原始數組
for(int i=1;i<sparseArray.length;i++){
sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
}
四、完整代碼
package sparsearray;
public class SparseArray {
public static void main(String[] args) {
//定義一個原始數組
int sourceArray[][] = new int[12][13];
sourceArray[1][2] = 1;
sourceArray[3][4] = 2;
sourceArray[5][4] = 2;
for (int[] row : sourceArray) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//將原始數組轉成稀疏數組
//遍歷原始二維數組,得到非0的值的個數,
int sum = 0;
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
sum++;
}
}
}
System.out.println(sum);
System.out.println(sourceArray.length);
//創建稀疏數組
int sparseArray[][] = new int[sum + 1][3];
//給稀疏數組賦值
sparseArray[0][0] = sourceArray.length; //原始二維數組的行數
sparseArray[0][1] = sourceArray[0].length; //原始二維數組的列數
sparseArray[0][2] = sum;//原始數組中非0的個數
//用於記錄是第幾個非0數
int count = 0;
//遍歷數組,將非0的值存放到稀疏數組sparseArray中
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = sourceArray[i][j];
}
}
}
System.out.println("輸出稀疏數組");
for (int[] row : sparseArray) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//將稀疏數組在恢復成原始二維數組
//創建原始的二維數組
int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
//遍歷,將值賦給原始數組
for(int i=1;i<sparseArray.length;i++){
sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
}
System.out.println("輸出原數組");
for (int[] row : sourceArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}