【数据结构】二维数组无用的位置太多?这一招轻松解决

简介: 【数据结构】二维数组无用的位置太多?这一招轻松解决

二维数组与稀疏数组

二维数组创建方法

int arr[][] = new int[1][1];

第一个【】内存放有多少个一维数组

第二个【】存放一维数组的长度

arr[0][0] = 1
arr[0][1] =2
arr[0][2] =3
[输出]
[1,2,3]

二维数组的遍历


int arr[][] = new int[2][2];
for (int[] row : arr) {
  for (int data : row) {
      System.out.printf("%d\t", data);
  }
 System.out.println();
 }

棋盘案例


稀疏 sparsearray 数组,编写的五子棋程序中,有存盘退出和续上盘的功能。

2.png


分析问题:


因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。


稀疏数组介绍

使用场景

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

2.png

我们创造的稀疏数组,


也是一个二维数组 他的【0】【n】会用来存放原来的二维数组的大小和长度

接下来的【n】【n】都会用放每一个值和他的二维数组坐标

应用实例


使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)

把稀疏数组存盘,并且可以从新恢复原来的二维数组数

整体思路分析

编写实例思路操作图

2.png

代码实现

/**
 * @projectName: DataStructure
 * @package: com.hyc.DataStructure.SarseArray
 * @className: sarseArray
 * @author: 冷环渊 doomwatcher
 * @description: TODO
 * @date: 2021/12/15 16:14
 * @version: 1.0
 */
public class sarseArray {
    public static void main(String[] args) {
        /*创建原始的二维数组 11*11*/
        //0:表示没有棋子,1表示黑子,2表示白字
        int chessArr[][] = new int[11][11];
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        chessArr[4][6] = 3;
        System.out.println("输出原始的二维数组");
        for (int[] row : chessArr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
        //遍历二维数组所有非0 的数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr[i][j] != 0) {
                    sum++;
                }
            }
        }
        System.out.println("sum = " + sum);
        //将二维数组转化成 稀疏数组,创建对应的稀疏数组
        int sparseArr[][] = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        //    完成了上述的步骤我们就拿到了 稀疏数组的第一行 就是我们存放数组大小和值的
        //接下来我们需要将二维数组的值放到 稀疏数组中
        /*
         * sparseArr[?][0] = i
         * sparseArr[?][1] = j
         * sparseArr[?][2] = chessArr[i][j];
         * 我们通过这种方式将 二维数组的坐标和值存到稀疏数组中
         * */
        // 我们用一个int 变量来记录是第几个
        int count = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }
        //    输出稀疏数组
        System.out.println();
        System.out.println("得到的稀疏数组为");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }
        // 将稀疏数组回复成原始的二维数组
        /*
         * 1.先从稀疏数组的第一列 读取出 有关原始数组长度和有多少非0的值
         * 2.之后读取稀疏数组的后几行数据,并且赋值给原始的二维数组即可
         * */
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println("输出恢复之后的二维数组");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }
}

2.png

输出结果



相关文章
|
1月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
64 4
|
7月前
|
存储 程序员 C语言
【C/C++ 数据结构 】二维数组结构解析
【C/C++ 数据结构 】二维数组结构解析
122 0
|
Java 定位技术
减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
131 1
减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
|
算法 Java
Java数据结构与算法——稀疏数组和二维数组之间的转换
Java数据结构与算法——稀疏数组和二维数组之间的转换
Java数据结构与算法——稀疏数组和二维数组之间的转换
|
算法 C语言
【算法与数据结构】二维数组中寻找鞍点
【算法与数据结构】二维数组中寻找鞍点
227 0
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
214 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
37 1
|
28天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
54 5
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。

热门文章

最新文章