Java数据结构预算法之稀疏数组

Java稀疏数组

定义

稀疏数组:数组中的大部分元素值都没有使用(或者都为0),在数组中仅有少部分的空间使用,造成了内存空间的浪费。

使用新的压缩的方式表示原来数组的方式为稀疏数组。

为什么要使用稀疏数组?

为了节省内存空间。

稀疏数组实现原理

引入应用场景

开发人员需要开发一个五子棋的游戏,为了实现存档、悔棋和判断棋局胜负,需要对这些棋子的位置进行存储,由于棋盘是一个矩形的,所以可以使用二维数组。

但是想象下棋过程,我们可能会给许多没有使用的位置分配内存(即数组中大部分数据是0或者为同一个值),所以在这里引入稀疏数组。

稀疏数组的实现

必须强调一点,稀疏数组是由二维数组变换而成的。

稀疏数组的列数是固定的,一共有3列,分别是行、列、对应的值(对应二维数组上的值)。

稀疏数组的首行是记录对应的二维数组是几行几列以及有效值的数量。

接下来的每一行都是记录有效值在对应二维数组中的行列以及值。

接下来我们用一个例子来表示,比如这里有一个二维数组:,按照上面的方法可以转化成稀疏数组。

稀疏数组Java实现

那么稀疏数组和二维数组应该如何转换呢?

二维数组变换成稀疏数组

  • 遍历原始的二维数组,得到有效数据个数sum
  • 根据sum创建稀疏数组 int[sum+1][3]
  • 将二位数组的有效数据存入稀疏数组(第一行为二维数组的行列和有效值的个数)
public static int[][] twoToSparse(int[][] two){
        int sum = 0;
        // 第一步 计算非零值的个数
        int row = two.length;
        int col = two[0].length;
        for (int i=0;i<row;i++){
            for (int j=0;j<col;j++){
                if(two[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        //给稀疏数组赋值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

        // 遍历二维数组,把非零的数据填充进去
        int count = 0;
        for (int i=0;i<row;i++){
            for (int j=0;j<col;j++){
                if(two[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = two[i][j];
                }
            }
        }
        return sparseArr;
    }

稀疏数组转换成二维数组

  • 根据稀疏第一行,创建原始二位数组
  • 读取后面的数据并且赋值给原始的二维数组即可
public static int[][] sparseToTwo(int[][] sparse){
        // 将稀疏数组恢复成二维数组
        int rows = sparse[0][0];
        int cols = sparse[0][1];
        int myCount = sparse[0][2];
        int[][] reArr = new int[rows][cols];
        for(int i=1;i<sparse.length;i++){
            int arrrow = sparse[i][0];
            int arrcol = sparse[i][1];
            int arrNum = sparse[i][2];
            reArr[arrrow][arrcol] = arrNum;
        }
        return reArr;
    }

完整代码

package com.folm.dataStructure.SparseArray;

import java.io.*;
import java.util.Arrays;

public class SparseArray {

    public static int[][] twoToSparse(int[][] two){
        int sum = 0;
        // 第一步 计算非零值的个数
        int row = two.length;
        int col = two[0].length;
        for (int i=0;i<row;i++){
            for (int j=0;j<col;j++){
                if(two[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        //给稀疏数组赋值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

        // 遍历二维数组,把非零的数据填充进去
        int count = 0;
        for (int i=0;i<row;i++){
            for (int j=0;j<col;j++){
                if(two[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = two[i][j];
                }
            }
        }
        return sparseArr;
    }

    public static int[][] sparseToTwo(int[][] sparse){
        // 将稀疏数组恢复成二维数组
        int rows = sparse[0][0];
        int cols = sparse[0][1];
        int myCount = sparse[0][2];
        int[][] reArr = new int[rows][cols];
        for(int i=1;i<sparse.length;i++){
            int arrrow = sparse[i][0];
            int arrcol = sparse[i][1];
            int arrNum = sparse[i][2];
            reArr[arrrow][arrcol] = arrNum;
        }
        return reArr;
    }

    public static void main(String[] args){
        // 创建一个原始的二维数组 11 * 11
        // 0:表示没有棋子  1 表示黑色 0 表示蓝色
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        chessArr1[4][5] = 2;
        // 输出原始的二维数组
        System.out.println("原始的二维数组");
        for(int[] row:chessArr1){
            for(int data:row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
        int sparseArr[][] = twoToSparse(chessArr1);
        // 输出稀疏数组的形式
        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]);
        }
        int[][] newTwo = sparseToTwo(sparseArr);
        System.out.println("之后的二维数组:");
        for(int[] row:newTwo){
            for(int data:row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
    }
}

Good luck!

原文地址:https://www.cnblogs.com/folm/p/11965486.html

时间: 2024-10-08 01:01:37

Java数据结构预算法之稀疏数组的相关文章

JAVA数据结构与算法-稀疏数组

实际需求 分析问题 因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组. 1.基本介绍 当一个数据中大部分元素为0,或者同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组处理方法 1.记录数组一共有几行几列,有多少不同的值 2.把具有不同的值的元素的行列及值记录在一个小规模的数组中,从而去缩小程序规模 稀疏数组说明 2.应用实例 使用稀疏数组,来保留类似前面的二维数组(棋盘.地图等等) 把稀疏数组存盘,并且可以从新恢复原来的二维数组数 整体思路分析 3.加了比较多

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构与算法之数组

数组特点: 1.大小固定 2.同一数据类型 3.下标访问 4.数据项可重复 Java数据类型:基本类型(int和double)和对象类型.在许多编程语言中,数组也是基本类型.但在Java中把它们当作对象来对待,因此在创建数组时必须使用new操作符. 有序数组与无序数组比较:最主要的好处是查找速度比无序数组快多了.不好的方面是在插入操作中由于所有靠后的数据都需要移动以疼开空间,所以速度较慢.有序数组和无序数组数据中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的空洞. 数据访问:从

JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度. 2.处理方式 1).记录数组一共有几行几列,有多少个不同的值 2).把具有不同值的元素的行列及值记录在稀疏数组中,可以缩小程序代码的复杂度. 3.图解描述 稀疏数组表示 [0] 3 4 4 二维数组,3行,4列,4个非0的值: [1] 1 2 2 一行

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

《Java数据结构和算法》- 数组

Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的

数据结构与算法—稀疏数组和队列

目录 稀疏数组和队列 1.稀疏数组 1.1 解决方法 1.2 代码实现 2. 队列 2.1 数组模拟队列 2.2 数组模拟环形队列 稀疏数组和队列 1.稀疏数组 所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用.因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据.OK,如果你不明白,那我们来看一个例子. ? 在一个五子棋中,有存盘和续上盘的功能 分析问题:因为该二维数组的很多默认值是 0,因此记录了很多

Java数据结构学习系列之——数组(1)

import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private int elements;//用于记录数组中实际数据的个数 public MyArray(){ array=new long[50];//数组默认长度为50: } public MyArray(int capacity){//设置数组的默认长度 array=new long[capacity]; }

数据结构与算法之java语言实现(一):稀疏数组

一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白,我们来用图来演示一下: 如图模拟为一个五子棋棋盘,其中1代表黑子,2代表白子(蓝子),我们在将其存入磁盘中,如果只是单纯的用文件io的方式将此二维数组存入磁盘,必然会造成磁盘空间的大大浪费,这时候就需要我们的稀疏数组出场了,咱们先看一下他是什么样子:   行(row) 列(col) 值(value) [0]