数据结构之二维数组与稀疏数组的转换

1.二维数组

二维数据其实就是高数中的矩阵,在此不做过多的解释

2.稀疏数组

当一个二维数组中大多值为0,或者相同时,我们可以考虑用到稀疏数组,来减少内存

稀疏数组的处理方法:

1)一个有3列的二维数组,记录原数组有几行几列,多少个不同的值

2)不同值的元素的所在行以及列记录在稀疏数组中,从而缩小规模

3.例子如下:

4.下面是稀疏数组以及二维数组之间的转换

package com.ebiz.array;

/**
 * @author YHj
 * @create 2019-07-13 16:46
 * <p>
 * 稀疏数组
 */
public class SparseArray {

    public static void main(String[] args) {
        //创建原始二维数组  11*11    1代表黑子  2代表白子
        int[][] chessArray1 = new int[11][11];

        //第一行第二列有一个黑子
        chessArray1[1][2] = 1;
        //第二行第三列有一个白子
        chessArray1[2][3] = 2;

       /* System.out.println("原始二维数组");
        for (int[] row : chessArray1) {
            for (int i : row) {
                System.out.printf("%d\t",i);
                //System.out.print(i+"\t");
            }
            System.out.println();
        }*/

        //将二维数组转成稀疏数组
        //1.得到原始数组中非0数值的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArray1[i][j] != 0) {
                    sum++;
                    System.out.println();
                }
            }
        }
        // System.out.println("sum=" + sum);
        //2.创建稀疏数组
        int[][] sparseArray = new int[sum+1][3];
        //3.稀疏数组赋值
        //3.1 第0行
        sparseArray[0][0]=11;
        sparseArray[0][1]=11;
        sparseArray[0][2]=sum;

        //3.2 遍历原始数组,将非空值付给稀疏数组
        int count=0;  //定义一个计数器,改变行数
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArray1[i][j] != 0) {
                    count++;
                    sparseArray[count][0]=i;
                    sparseArray[count][1]=j;
                    sparseArray[count][2]=chessArray1[i][j];

                }
            }
        }
        //输出稀疏数组
        System.out.println("字数数组为:");
        for (int[] row : sparseArray) {
            for (int i : row) {
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }

        System.out.println("------------------------------------------------------------");
        System.out.println("稀疏数组复原");

        //根据稀疏数组创建对应数组
        int [][] chary=new int[sparseArray[0][0]][sparseArray[0][1]];

        //遍历稀疏数组,付给chary
        for (int i = 1; i < sparseArray.length; i++) {
            chary[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
        }

        //输出array
        for (int[] row : chary) {
            for (int i : row) {
                System.out.printf("%d\t",i);
                //System.out.print(i+"\t");
            }
            System.out.println();
        }

    }
}

原文地址:https://www.cnblogs.com/jiushixihuandaqingtian/p/11203898.html

时间: 2024-07-31 08:38:54

数据结构之二维数组与稀疏数组的转换的相关文章

稀疏数组的经典应用(二维数组与稀疏数组的相互转换)

package com.zhangwl.数据结构.稀疏数组; /** * @ClassName SparseArray * @Description 棋盘游戏演示 * @Author zhangwl * @Date 2019/10/10 22:54 * @Version 1.0 **/public class SparseArray { public static void main(String[] args) { /*创建一个原始的二维数组11 * 11 ,0:表示没有棋子 :1:表示黑子:

二维数组转稀疏数组、稀疏数组恢复二维数组(Java实现)

public static void main(String[] args) { // 创建一个原始的二维数组 9*9 int chessArr1[][] = new int[9][9]; // 0表示没有棋子,1表示黑子,2表示白子 chessArr1[1][2] = 1; chessArr1[2][3] = 2; chessArr1[5][2] = 2; chessArr1[7][6] = 2; chessArr1[8][4] = 1; System.out.println("原始的二维数组

将二维数组转为稀疏数组

public class SparseArray { /** * 用二维数组实现一个棋盘,1代表黑子,2代表蓝子 */ public static void main(String[] args) { /** * 二维数组 */ int[][] chessArray1 = new int[11][11]; chessArray1[1][2] = 1; chessArray1[2][3] = 2; for (int[] row : chessArray1) { for (int data : ro

二维数组与稀疏数组的相互转化

package struct; public class SparseArr { public static void main(String[] args) { int chess[][] = new int[11][11]; //0代表空白,1代表黑子,2代表蓝子 chess[1][2] = 1; chess[2][3] = 2; int sum = 0; //获取有效值个数 for (int[] rows : chess) { for (int data : rows) { System.

hdu1081 DP类最长子段和(二维压缩+前缀和数组/树状数组计数)

题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少. 由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j)与(i,j - 1), dp 值代表以该点为右下角的最大矩阵和,同时记录下这个矩阵的左上角坐标,状态转移时通过将原和最大矩阵通过补边推到当前和最大矩阵.但是其实这种做法有一个明显的问题,就是转移时,补上边后 dp 值相同怎么办,dp 值相同而矩阵不同的话会影响到下一次状态转移后补上的矩阵的情况,从而

二维最大和子数组

1.设计思路 因为计算了一位的最大和子数组,所以想办法将二维的数组转换成一维子数组进行求解: 首先,将二维数组的第一行(列)赋值到新的一维数组中,在一维的数组中求得子数组的最大值, 然后,将二维数组的第二行(列)加到一维数组中,再次求得子数组的最大值,并和第一步求得的最大值进行比较,若新的值比较大,留下最大值,如果新值比较小,退出这一个循环,从第二行(列)开始第一步,这样就可以求出最大和子数组: 2.源代码 #include<iostream> #include<ctime> us

$[SHOI2007]$ 园丁的烦恼 二维数点/树状数组

\(Sol\) 设一个矩阵的左上角为\((x_1,y_1)\),右下角为\((x_2,y_2)\),\(s_{x,y}\)是到\((1,1)\)二维前缀和,那么这个矩阵的答案显然是\(s_{x_2,y_2}-s_{x_1-1,y_2}-s_{x_2,y_1-1}+s_{x_1-1,x_2-1}\).考虑把每个询问拆成这么四个二维前缀和的询问.将所有询问的\(s_{x,y}\)按照\(x\)排序,依次计算,这样我们就可以忽略\(x\)的限制而只考虑\(y\)的限制了.每次扫到一个询问,先把\(x\

OpenCV中Mat,图像二维指针和CxImage类的转换

在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系. 一.OpenCV的Mat类到图像二值指针的转换 以下为函数代码: unsigned char** MatTopImgData(Mat img) { //获取图像参数 int row = img.rows; int col = img.cols; int band = img.c

【数据结构】二维数组中的查找

我们门来看一下题目:在一个数组中,每一行都按照从左往右递增的顺序排序.每一列都按照从上到下递增的顺序排列.请完成一个函数,输入这样一个  我们门来看一下题目:在一个数组中,每一行都按照从左往右递增的顺序排序.每一列都按照从上到下递增的顺序排列.请完成一个函数,输入这样一个整数,判断数组中是否含有该整数. 在解决任何题目的时候我们都应该给出一个符合题目条件的相关例子.然后从例子中入手.就可以很快的的到解决题目的具体思路: 我们给出一个相关的实例如下: 然后进行分析,假如我们要查找为7的数字.我们可