1.數據結構
1.1 數據結構包括:線性結構和非線性結構。
線性結構:
> 線性結構是最常用的數據結構,他的特點是數據元素之間存在一對一的線性關係。
> 線性結構有兩種不同的存儲結構:順序存儲結構和鏈式存儲結構。一般順序存儲的線性表稱爲順序表,順序表中存儲元素是連續的。
> 鏈式存儲的線性表稱爲鏈表,鏈表中存儲的元素不一定是連續的,元素節點中存放數據元素以及相鄰元素的地址信息。但是鏈表的實際結構中相鄰的元素並不是挨在一起,只是通過next域來指定理論上相鄰元素的地址。
非線性結構:
> 非線性結構包括:二維數組、多維數組、廣義表、樹結構,圖結構。
2. 稀疏數組
在實際生活中,類似於棋盤,地圖等程序需要進行存盤或者退出,但是需要保存之前的記錄。但是二維數組的很多值都爲0,如果我們將這些爲0的值也都保存起來,就大大佔用的了我們程序得進程和效率,於是有了稀疏數組。這個數組保存了還原這樣一個二維數組的一些結構信息。當我們保存的時候就將二維數轉換爲稀疏數組保存,當我們還原二維數組時,就拿稀疏數組進行還原,可以提高我們程序得存儲效率。
稀疏數組的處理方法是:
1)記錄數組一共有幾行幾列,有多少個不同的值2)把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模
3. Java代碼實現一個二維數組和稀疏數組的轉換操作
3.1 首先我們創建一個二維數組,類似於五子棋的棋盤。
public class SparseArray {
public static void main(String[] args) {
//創建一個原始的二維數組 11*11
//0:表示沒有棋子,1:表示黑色棋子,2:表示藍色棋子
int sparseArr1[][] = new int[11][11];
sparseArr1[1][2] = 1;
sparseArr1[2][3] = 2;
//輸出原始的二維數組
System.out.println("原始的二維數組");
for (int[] ints : sparseArr1) {
for (int data : ints) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
輸出結果如下:
原始的二維數組
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
3.2 將上面的二維數組轉換成稀疏數組:
//1.先遍歷二維數組,得到非0數據的個數 sum=2
int sum = 0;
for (int i = 0; i < sparseArr1.length; i++) {
for (int j = 0; j <sparseArr1.length ; j++) {
if (sparseArr1[i][j] != 0){
sum++;
}
}
}
//2.創建對應的稀疏數組
int sparseArr[][] = new int[sum+1][3];
//給稀疏數組賦值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//便利二維數組,將非0值存放到sparseArry中
int count = 0;//count 用於記錄是第幾個非0數據
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (sparseArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = sparseArr1[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();
這樣就得到一個稀疏數組:
稀疏數組爲:
11 11 2
1 2 1
2 3 2
3.3 利用稀疏數組的結果轉換爲原始的二維數組:
//1.先讀取稀疏數組第一行,根據第一行數據,創建原始的二維數組
int sparseArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.在讀取稀疏數組後幾行數據(從第二行開始),並賦值給原始的二維數據即可
for (int i = 1; i <sparseArr.length ; i++) {
sparseArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//輸出恢復後二維數組
System.out.println();
System.out.println("恢復後的二維數組");
for (int[] row : sparseArr2) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
結果就是原始的二維數組:
恢復後的二維數組
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
以上就完成了原始二維數組--稀疏數組--原始二維數組的轉換。