一、概念
(概念轉自博客: https://blog.csdn.net/iteye_15605/article/details/82678731)
所謂稀疏數組就是數組中大部分的內容值都未被使用(或都為零),在數組中僅有少部分的空間使用。因此造成內存空間的浪費,為了節省內存空間,並且不影響數組中原有的內容值,我們可以采用一種壓縮的方式來表示稀疏數組的內容
假設有一個9*7的數組,其內容如下:
在此數組中,共有63個空間,但卻只使用了5個元素,造成58個元素空間的浪費。以下我們就使用稀疏數組重新來定義這個數組:
其中在稀疏數組中第一部分所記錄的是原數組的列數和行數以及元素使用的個數、第二部分所記錄的是原數組中元素的位置和內容。
需要說明,第二部分的元素列數是指數組下標的列數,跟第一部分的實際列數不相同
其中在稀疏數組中第一部分所記錄的是原數組的列數和行數以及元素使用的個數、第二部分所記錄的是原數組中元素的位置和內容。
例如第二部分內容可以表達為,假設數組為array[][], array[1][1]=3,array[3][0]=1...等等
經過壓縮之后,原來需要聲明大小為63的數組,而使用壓縮后,只需要聲明大小為6*3的數組,僅需18個存儲空間。
二、Java代碼實現
package DataStructur; public class SparseArray { public static void main(String[] args) { int [][] array = new int[11][11]; array[1][2] = 1; array[2][2] = 2; array[4][4] = 1; int count = 0; for(int i = 0;i<11;i++){ for (int j = 0;j<11;j++) { if(array[i][j]!=0){ count++; } } } int [][] sparseArray = new int [count+1][3]; sparseArray[0][0] = 11; sparseArray[0][1] = 11; sparseArray[0][2] = count; int index = 1; for(int i = 0;i<11;i++){ for (int j = 0;j<11;j++) { if(array[i][j]!=0){ sparseArray[index][0] = i; sparseArray[index][1] = j; sparseArray[index][2] = array[i][j]; index++; } } } //打印原來數組 System.out.println("原來的數組:"); for(int i = 0;i<11;i++) { for(int j = 0;j<11;j++) { System.out.printf(array[i][j]+" "); } System.out.println(); } System.out.println("創建的稀疏數組:"); //打印創建的稀疏數組 for(int i = 0;i<count+1;i++) { System.out.printf("\t%d\t%d\t%d\n", sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]); } int [][] newArray = new int[sparseArray[0][0]][sparseArray[0][1]]; System.out.println("使用稀疏數組還原的原數組:"); //還原原來的數組 for(int i = 1;i<count+1;i++) { newArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2]; } //打印新創建的數組 for(int i = 0;i<11;i++) { for(int j = 0;j<11;j++) { System.out.printf(newArray[i][j]+" "); } System.out.println(); } } }
總體來說這個數據結構不算太難,只要仔細的看看理解了思路基本都能寫出來。韓順平老師的數據結構課程還有一個作業就是,讓將這些數據存放到文件中然后在從文件中讀取出來生成一個數組,這個坑留到以后再填。
忘了說這個數據結構的使用場景了,可以使用在 五子棋游戲的當前 棋局,可以保存,下次再直接讀取。