稀疏数组__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();
        }
    }

 

posted @ 2024-09-10 10:15  Ashe|||^_^  阅读(1)  评论(0编辑  收藏  举报