1、使用場景
當(dāng)一個數(shù)組中大部分元素是0或者為同一個值的數(shù)組時盆顾,可以使用稀疏數(shù)組來保存該數(shù)組
比如點(diǎn)陣存在大量重復(fù)的數(shù)據(jù)障簿,我們沒必要耗那么大的空間來存儲每一個元素还惠,就可以使用稀疏數(shù)組來保存這樣的點(diǎn)陣數(shù)據(jù)
2、圍棋復(fù)盤演示稀疏數(shù)組代碼
雖然這不是一個很好的例子煌珊,但是可以幫助我們理解稀疏數(shù)組号俐,主要是因為圍棋存在要到最后一子定輸贏的時候,此時稀疏數(shù)組既要保存坐標(biāo)信息定庵,還要保存數(shù)據(jù)信息吏饿,反而擴(kuò)大了程序的規(guī)模增大了內(nèi)存的開銷,此處只是為了便于理解蔬浙,在存在大量重復(fù)數(shù)據(jù)的點(diǎn)陣猪落,比如csv格式文件的傳輸上,就可以考慮使用稀疏數(shù)組來壓縮空間傳輸畴博。
描述:
創(chuàng)建一個20*20大小的圍棋棋盤笨忌,0表示沒子,1表示此處有白子俱病,2表示此處有黑子
package algorithm;
import java.util.Arrays;
public class SparseArrayDemo {
public static void main(String[] args) {
//創(chuàng)建一個20*20大小的棋盤
int[][] checkerboard = new int[20][20];
checkerboard[5][6] = 1;
checkerboard[6][7] = 2;
//創(chuàng)建稀疏數(shù)組
//first:查找有效值的個數(shù)
int valid_value_num = 0;
for(int[] arr : checkerboard){
for (int i = 0; i < arr.length; i++) {
if(arr[i] != 0) valid_value_num+=1;
}
}
//second:創(chuàng)建稀疏數(shù)組官疲,包含有效值個數(shù)+1個數(shù)組(第一行需要存儲棋盤大小信息,邊于復(fù)盤)
//大小為3亮隙,橫坐標(biāo)途凫,縱坐標(biāo)值,數(shù)據(jù)
int[][] sparseArray = new int[valid_value_num+1][3];
//棋盤長度
sparseArray[0][0] = checkerboard.length;
//棋盤寬度
sparseArray[0][1] = checkerboard[0].length;
//存儲數(shù)據(jù)到稀疏數(shù)組
int index = 1;
for(int i = 0; i < checkerboard.length; i++){
for(int j = 0; j < checkerboard[0].length; j++){
if(checkerboard[i][j] != 0) {
sparseArray[index][0] = i;
sparseArray[index][1] = j;
sparseArray[index][2] = checkerboard[i][j] ;
index+=1;
}
}
}
//復(fù)盤
int[][] resume_array = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
resume_array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//查看復(fù)盤數(shù)據(jù)
for (int i = 0; i < resume_array.length; i++) {
System.out.println(Arrays.toString(resume_array[i]));
}
}
}