一、概念
(概念转自博客: 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(" %d %d %d ", 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(); } } }
总体来说这个数据结构不算太难,只要仔细的看看理解了思路基本都能写出来。韩顺平老师的数据结构课程还有一个作业就是,让将这些数据存放到文件中然后在从文件中读取出来生成一个数组,这个坑留到以后再填。
忘了说这个数据结构的使用场景了,可以使用在 五子棋游戏的当前 棋局,可以保存,下次再直接读取。