稀疏数组__Java演示
数据结构是一种数据组织、管理和存储的格式。常见的有数组、栈、队列、链表、树、图、堆、哈希表……
当需要记录一盘五子棋对弈的数据时,通常可以采用二维数组来实现,显然直接使用二维数组来存储数据有浪费空间的嫌疑,因为棋盘上很多点位没有落子,这些冗余数据也被记录了。
9x9棋盘
因此我们可以将类似的二维数组抽象成稀疏数组的结构,来储存数据。
稀疏数组通过仅记录非零(或非特定值)元素的位置和值,来大幅减少存储空间的需求,并提升数据处理的效率。
抽象后的稀疏数组
稀疏数组第一行,分别记录了棋盘的行size、列size、落子的总步数totalMoves
此后的每行,分别记录了落子的行index、列index、落子的当前步数move(根据move值的奇偶性来区分黑子或白子,如果棋盘是按落子顺序记录的话)。
至此,我们可以看到在类似场景中,稀疏数组
减少了不必要的存储空间,提高了数据处理速度。
查看代码
public static void main(String[] args) {
// 9x9棋盘
int[][] chase = new int[8][8];
chase[1][1] = 1; // 第一步落子
chase[2][2] = 2; // 第二步落子
// 打印棋盘
for (int[] innerArr : chase) {
for (int point : innerArr) {
System.out.printf("%d\t", point);
}
System.out.println();
}
System.out.println("\n-----------------\n");
// 构建稀疏数组sparseArr,以记录棋盘的表头 (第一行,棋盘的行size,棋盘的列size,落子的总步数totalMoves) 和每一步落子 (第n行,落子的行index,落子的列index,落子的步数move) ,共计3行
int totalMoves = 0;
for (int[] innerArr : chase) {
for (int point : innerArr) {
if (point != 0) {
totalMoves++;
}
}
}
int[][] sparseArr = new int[totalMoves + 1][3];
// 第一行
sparseArr[0][0] = chase.length;
sparseArr[0][1] = chase[0].length;
sparseArr[0][2] = totalMoves;
// 第一步落子
sparseArr[1][0] = 1;
sparseArr[1][1] = 1;
sparseArr[1][2] = 1;
// 第二步落子
sparseArr[2][0] = 2;
sparseArr[2][1] = 2;
sparseArr[2][2] = 2;
// 打印稀疏数组
for (int[] inner : sparseArr) {
System.out.printf("%d\t%d\t%d\n", inner[0], inner[1], inner[2]);
}
System.out.println("\n-----------------\n");
// 根据稀疏数组还原棋盘
int[][] newChase = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++) {
newChase[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
// 打印还原的新棋盘
for (int[] inner : newChase) {
for (int e : inner) {
System.out.printf("%d\t", e);
}
System.out.println();
}
}