1 介绍
所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容
2 压缩
假设有一个9*7的数组,其内容如下:
在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费
以下我们就使用稀疏数组重新来定义这个数组:
- 需要说明,第二部分的元素列数是指数组下标的列数,跟第一部分的实际列数不相同
- 其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数
- 第二部分所记录的是原数组中元素的位置和内容。
- 经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间
3 代码实现
public class SparseArray {
public static void main(String[] args) {
//普通操作
long[][] array = new long[9][7];
array[1][1] = 3;
array[3][0] = 1;
array[3][1] = 4;
array[4][2] = 7;
array[5][5] = 5;
//遍历
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
System.out.print(array[i][j]+" ");
}
System.out.println();
}
System.out.println("==========压缩数组=============");
Node[] nodes = new Node[6];
nodes[0] = new Node(9,7,5);
nodes[1] = new Node(1,1,3);
nodes[2] = new Node(3,0,1);
nodes[3] = new Node(3,1,4);
nodes[4] = new Node(4,2,7);
nodes[5] = new Node(5,5,5);
//遍历,和前面的样式保持一致
for (int i = 0;i<nodes[0].getRow();i++){//行遍历
for (int j = 0;j<nodes[0].getCol();j++){//每一行的具体值
int x;
for (x=1;x<nodes.length;x++){//遍历 nodes 数组
if (nodes[x].getRow()==i && nodes[x].getCol()==j){
break;
}
}
if (x<nodes.length){//如果行和列与 nodes 数组中相同,输出 nodes 中的 val 值
System.out.print(nodes[x].getVal()+" ");
}else {//不同,输出0
System.out.print("0 ");
}
}
System.out.println();
}
}
//控制台输出
//0 0 0 0 0 0 0
//0 3 0 0 0 0 0
//0 0 0 0 0 0 0
//1 4 0 0 0 0 0
//0 0 7 0 0 0 0
//0 0 0 0 0 5 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 0 0 0 0 0
//0 0 0 0 0 0 0
//1 4 0 0 0 0 0
//0 0 7 0 0 0 0
//0 0 0 0 0 5 0
//0 0 0 0 0 0 0
//0 0 0 0 0 0 0
//0 0 0 0 0 0 0
}
class Node{//稀疏数组需要用到的类
private int row;//行
private int col;//列
private int val;//值
public Node(int row, int col, int val) {//构造方法
this.row = row;
this.col = col;
this.val = val;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
public int getVal() {
return val;
}
}