Java資料結構之稀疏陣列
阿新 • • 發佈:2021-02-19
Java資料結構之稀疏陣列
什麼是稀疏陣列
稀疏陣列可以用來儲存大部分元素為0或者為同一個值的陣列。
原理
1、記錄二維陣列一共有幾行幾列,有多少個值
2、將各個值的行位置、列位置和資料記錄在一個小規模的陣列中(這個陣列就是稀疏陣列),從而縮小程式規模。
二維陣列
0 0 1 0 0 0
0 0 0 2 0 0
0 0 0 0 3 0
0 0 0 0 0 4
0 0 0 0 0 0
0 0 0 0 0 0
稀疏陣列
6 6 4 0 2 1 1 3 2 2 4 3 3 5 4
稀疏陣列第一行各列分別是二維陣列的行數、列數和非0的值個數;剩下的每行的各列分別代表二維陣列中非0值的行位置、列位置和值。
稀疏陣列和二維陣列的轉換
以以下二維陣列為例
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
二維陣列轉稀疏陣列
1)遍歷原始二維陣列,得到有效資料的個數sum
2)根據有效資料的個數建立稀疏陣列
int[sum+1][3] sparseArray
3)將二維陣列的有效資料儲存進稀疏陣列
程式碼實現
public static int[][] TDAtoSPA(int[][] tda) { int row_length=tda.length;//行數 int col_length=tda[0].length;//列數 int val_num=0;//非0的個數 List list=new ArrayList(); for(int i=0;i<row_length;i++) {//儲存二維陣列中非0資料的位置和資料 for(int j=0;j<col_length;j++) { if(tda[i][j]!=0) { val_num+=1; int datas[]=new int[3]; datas[0]=i;//行位置 datas[1]=j;//列位置 datas[2]=tda[i][j];//資料 list.add(datas);//放入到list中 } } } int [][]spa=new int[val_num+1][3];//給第一行賦值,分別是行、列、值 spa[0][0]=row_length; spa[0][1]=col_length; spa[0][2]=val_num+1; for(int i=1;i<=list.size();i++) {//給剩下的行賦值 int [] a=(int[]) list.get(i-1); spa[i][0]=a[0]; spa[i][1]=a[1]; spa[i][2]=a[2]; } System.out.println("稀疏陣列"); for(int []row:spa) {//列印稀疏陣列 for(int data:row) { System.out.printf("%d\t",data); } System.out.println(); } return spa; }
public static void main(String[] args) throws IOException {
int [][] a=new int[6][6];
a[1][2]=1;
a[2][4]=2;
for(int [] i:a) {
for(int data:i) {
System.out.printf("%d\t",data);
}
System.out.println();
}
SparseArrayDemo.TDAtoSPA(a);
}
結果
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 0
稀疏陣列
6 6 3
1 2 1
2 4 2
稀疏陣列轉二維陣列
1)首先讀取稀疏陣列的第一行,根據第一行的前兩列建立原始的二維陣列,即全0的二維陣列
2)讀取稀疏陣列後幾行的資料,並賦給原始二維陣列。
程式碼實現
public static int[][] SPAtoTDA(int[][] spa) {
int[][] tda=new int[spa[0][0]][spa[0][1]];//建立原始二維陣列
for(int i=1;i<spa.length;i++) {//賦值
tda[spa[i][0]][spa[i][1]]=spa[i][2];
}
System.out.println("還原二維陣列");
for(int [] i:tda) {//列印二維陣列
for(int data:i) {
System.out.printf("%d\t",data);
}
System.out.println();
}
return tda;
}
public static void main(String[] args) throws IOException {
int [][] a=new int[6][6];
a[1][2]=1;
a[2][4]=2;
for(int [] i:a) {
for(int data:i) {
System.out.printf("%d\t",data);
}
System.out.println();
}
SparseArrayDemo.SPAtoTDA(SparseArrayDemo.TDAtoSPA(a));
}
結果
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
稀疏陣列
6 6 3
1 2 1
2 4 2
還原二維陣列
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
稀疏陣列儲存到硬碟
public static void Save(String filename,int[][]spa) throws IOException{
File file=new File(filename);//通過引數命名得到要儲存的檔名
FileWriter fileWriter=null;
if(!file.exists()) {
file.createNewFile();//檔案不存在就建立
}
fileWriter=new FileWriter(file);
for(int[] row:spa) {
for(int data:row) {
fileWriter.write(data);//將資料寫入到檔案中
}
}
fileWriter.flush();//關閉快取
fileWriter.close();//關閉流
}
public static void main(String[] args) throws IOException {
int [][] a=new int[6][6];
a[1][2]=1;
a[2][4]=2;
for(int [] i:a) {
for(int data:i) {
System.out.printf("%d\t",data);
}
System.out.println();
}
SparseArrayDemo.Save("spa.txt",SparseArrayDemo.TDAtoSPA(a));
}
結果
檔案被儲存到專案目錄下
從硬碟取出稀疏陣列
public static int[][] Load(String filename) throws IOException{
FileReader fileReader=new FileReader(filename);
Map<Integer, Integer> map=new HashMap();
int data=0;int count=0;
while((data=fileReader.read())!=-1) {//將檔案中的資料存入到Map中
map.put(count, data);
count++;
}
if(map.size()==0)return null;
int[][]spa=new int[map.size()/3][3];//建立稀疏陣列
int index=0;
for(int i=0;i<map.size()/3;i++) {//將Map中的資料存入到稀疏陣列
for(int j=0;j<map.size()/3;j++) {
spa[i][j]=map.get(index);
index++;
}
}
map.clear();
return spa;
}
public static void main(String[] args) throws IOException {
// int [][] a=new int[6][6];
// a[1][2]=1;
// a[2][4]=2;
// for(int [] i:a) {
// for(int data:i) {
// System.out.printf("%d\t",data);
// }
// System.out.println();
// }
System.out.println("稀疏陣列");
int spa[][]=SparseArrayDemo.Load("spa.txt");
for(int [] i:spa) {
for(int data:i) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
結果
稀疏陣列
6 6 3
1 2 1
2 4 2