首页 > 其他分享 >稀疏数组

稀疏数组

时间:2023-04-23 19:48:08浏览次数:26  
标签:maps int 稀疏 sparsArray 数组 public

实际问题:

1)基本介绍

当一个数组中大部分元素都是0、或大部分都是相同的元素时,可以使用稀疏数组来保存此数组

处理方法:

  • 第一行记录数组一共有几行几列,有多少个不同的值

  • 把具有不同值的元素的行、列、值,记录在一个小规模的数组中,从而缩小程序规模

 

2)应用实例

 

代码实现:

package DataStructures.SparseArray;

import java.io.Serializable;

/**
 * @author Loe.
 * @project DataStructures&Algorithms
 * @date 2023/4/23
 * @ClassInfo
 */
public class Main {

    public static void main(String[] args) {

        //初始化原始数组,并赋值
        int[][] maps = new int[11][11];
        maps[1][2] = 1;
        maps[2][3] = 2;

        System.out.println("原始数组");
        printArray(maps);

        //进行稀疏操作
        SparsArray sparsArray = new SparsArray(0, maps);
        System.out.println();
        //打印稀疏后的数组
        System.out.println("稀疏操作后的数组");
        printArray(sparsArray.getSparsArray());
        System.out.println();

        //从稀疏数组恢复到原始数组
        System.out.println("恢复后的数组");
        int[][] sourceArray = sparsArray.reduction();
        printArray(sourceArray);

        //将此稀疏数组对象持久化
    }

    public static void printArray(int[][] maps) {
        for (int i = 0; i < maps.length; i++) {
            for (int j = 0; j < maps[i].length; j++) {
                System.out.print(maps[i][j] + " ");
            }
            System.out.println();
        }
    }
}

//实现稀疏数组
class SparsArray implements Serializable {
    //默认值
    public int defaultVal;

    //数组相关
    public int row;
    public int col = 3;

    //有效的数据
    int useAbleDataCount;

    //稀疏数组
    public int[][] sparsArray;

    //初始化数组
    public SparsArray(int defaultVal, int[][] targetArr) {
        this.defaultVal = defaultVal;
        //获取可用的数据数量
        this.useAbleDataCount = countDataNums(targetArr);
        //初始化对象稀疏数组
        this.sparsArray = new int[useAbleDataCount + 1][3];
        //稀疏数组赋值
        spars(targetArr);
    }

    //遍历数组,统计有效的数据
    public int countDataNums(int[][] maps) {
        int count = 0;
        for (int i = 0; i < maps.length; i++) {
            for (int j = 0; j < maps[i].length; j++) {
                if (!(maps[i][j] == defaultVal)) {
                    count++;
                }
            }
        }
        return count;
    }

    public void spars(int[][] targetArr) {
        //当前稀疏数组的行
        int sparsRow = 1;

        //记录原始数组的信息
        this.sparsArray[0][0] = targetArr.length;
        this.sparsArray[0][1] = targetArr[0].length;
        this.sparsArray[0][2] = this.useAbleDataCount;


        for (int i = 0; i < targetArr.length; i++) {
            for (int j = 0; j < targetArr[i].length; j++) {
                if (!(targetArr[i][j] == defaultVal)) {
                    sparsArray[sparsRow][0] = i;
                    sparsArray[sparsRow][1] = j;
                    sparsArray[sparsRow][2] = targetArr[i][j];
                    sparsRow++;
                }
            }
        }
    }

    //从稀疏数组还原到原来的数组
    public int[][] reduction() {
        //创建恢复的数组
        int[][] reductionArr = new int[sparsArray[0][0]][sparsArray[0][1]];
        //稀疏数组当前行
        int row = 1;

        //遍历恢复的数组,并恢复对应值
        for (int i = 0; i < reductionArr.length; i++) {
            for (int j = 0; j < reductionArr[i].length; j++) {
                //如果已经将有效数据全部恢复
                if (row <= useAbleDataCount) {
                    System.out.println(row);
                    //还没有将数据全部恢复,继续判断
                    if (i == sparsArray[row][0] && j == sparsArray[row][1]){
                        reductionArr[i][j] = sparsArray[row][2];
                        row++;
                    }
                   
                } else {
                    reductionArr[i][j] = this.defaultVal;
                }
            }
        }

        return reductionArr;
    }


    public int[][] getSparsArray() {
        return sparsArray;
    }
}

 

标签:maps,int,稀疏,sparsArray,数组,public
From: https://www.cnblogs.com/loe-home/p/17347501.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:在排序数组中查找元素的第一个和最后一个位置
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题。 示例1:输入:nums=[5,7,7,8,8,10],target=......
  • JavaScript 使用 splice 方法删除数组元素可能导致的问题
    JavaScript使用splice方法删除数组元素可能导致的问题splice()方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。JavaScript遍历数组并通过splice方法删除该数组符合某些条件的元素将会导致哪些问题?导致......
  • MKL稀疏矩阵运算示例及函数封装
    IntelMKL库提供了大量优化程度高、效率快的稀疏矩阵算法,使用MKL库的将大型矩阵进行稀疏表示后,利用稀疏矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装,便于后续使用,最后在实际例子中调用接口执行想要的矩阵运算。0稀疏矩阵稀疏矩阵是指矩阵......
  • Leetcode 88. 合并两个有序数组 Python题解
    来源:力扣(LeetCode)链接:https://leetcode.cn/problems/merge-sorted-array著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。1.暴力法解题思路:由于题目要求原地合并,直接返回nums1数组。因此一个可行的方案是合并两个列表,然后对合并后的列表进行排序。用......
  • 根据数组按照时间月份分组
    {"code":200,"msg":"success","data":{"sumprice":42,"arrearslist":[{"years":2023,"month":1......
  • PHP 常用数组函数汇集,详细解释描述
    PHPArray函数函数描述PHParray()创建数组。3array_change_key_case()返回其键均为大写或小写的数组。4array_chunk()把一个数组分割为新的数组块。4array_combine()通过合并两个数组来创建一个新数组。5array_count_values()用于统计数组中所有值出现的次数。4array_diff()返回两......
  • Leetcode 53. 最大子数组和 Python题解
    来源:力扣(LeetCode)链接:https://leetcode.cn/problems/maximum-subarray著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。1.动态规划解题思路:对于当前元素nums[i]来说,最大的连续子数组可以为:nums[0:i]中的最大连续子数组加上nums[i]nums[i],此时nums[......
  • 把数组排成最小的数
    classSolution{public:staticboolcmp(inta,intb){stringas=to_string(a),bs=to_string(b);returnas+bs<bs+as;}stringprintMinNumber(vector<int>&nums){sort(nums.begin(),nums.end(),cmp);......
  • 二维数组根据年份跟月份分组成为新数组
    要实现的效果:Array([2023---年份]=>Array([1--月份:]=>Array([0]=>Array([id]=>28[billdtimes]=>......
  • C语言 合并两个升序的数组,成升序的数组
    #include<stdio.h>//两路合并法把两个已按升序排列的数组合并成一个升序数组main(){inta[3]={10,13,15};intb[5]={2,4,6,7,8};intc[10],i=0,j=0,k=0;while(i<3&&j<5)if(a[i]>b[j]){c[k]=b[j];k++;j++;}else{......