稀疏数组

引入

  • 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续
  • 我们应该怎么实现 ?
    • 以围棋举例
      • 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子
    • 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0
    • 我们需要想一个办法来 优化存储的方式

基本介绍

  • 当一个数组中大部分元素是同一个值时,我们可以使用稀疏数组来保存该数组
  • 稀疏数组:是将一个有效元素 的 坐标 和 值 记录在一个小规模数组中
    • 该有效数组的头部(第一行)
      • 记录了原数组一个 有几行,几列,有多少个有效值
    • 该数组剩下的行数
      • 是由有效值的个数来决定的 ,即 一个有效数占据一行

稀疏数组图示.png

代码实现

SparseArray.java

  • main方法
public static void main(String[] args) {
    // 定义一个全是0的数组
    int[][] array = new int[11][11];
    // 向数组中添加几个 有效元素
    array[2][3] = 1;
    array[3][4] = 2;
    array[2][5] = 2;
    array[5][5] = 2;
    // 遍历该数组查看效果
    for (int[] row : array) {
        for (int data : row) {
            System.out.print(data + "  ");
        }
        System.out.println();
    }
    int[][] sparse = toSparseArray(array);
    int[][] toArray = toArray(sparse);

}

二维数组转稀疏数组.png

  • 数组转稀疏数组
public static int[][] toSparseArray(int[][] array) {
    /*
     *  思路:
     *   1.根据传入的二维数组,创建稀疏数组
     *   2.遍历二维数组 ,如果当前元素值为有效值(不为0) ,就将该元素的坐标和值保存到稀疏数组中
     *   3.因为需要坐标,所以使用普通for循环
     */

    // 1. 根据传入的二维数组创建稀疏数组 ,并给稀疏数组第一行赋值

    // 1.1 遍历二维数组,获取有效元素个数
    int num = 0;
    for (int i = 0; i < array.length; i++) {
        int[] row = array[i];
        for (int j = 0; j < row.length; j++) {
            if (row[j] != 0) {
                num++;
            }
        }
    }
    // 1.2 创建稀疏数组
    int[][] sparse = new int[num + 1][3];

    // 1.3 给稀疏数组第一行赋值
    sparse[0][0] = array.length;   // 原数组行数
    sparse[0][1] = array[0].length;      // 原数组列数
    sparse[0][2] = num;               // 有效元素个数值


    // 2.1 定义一个值 ,记录稀疏数组实际的行数
    num = 0;

    // 2.2  再次遍历二维数组 ,并给稀疏数组赋值
    for (int i = 0; i < array.length; i++) {
        int[] row = array[i];
        for (int j = 0; j < row.length; j++) {
            if (row[j] != 0) {
                ++num;
                sparse[num][0] = i;
                sparse[num][1] = j;
                sparse[num][2] = array[i][j];
            }
        }
    }
    // 遍历该数组查看效果
    for (int[] row : sparse) {
        for (int data : row) {
            System.out.print(data + "  ");
        }
        System.out.println();
    }

    return sparse;
}

二维数组转稀疏数组.png

  • 稀疏数组转数组
private static int[][] toArray(int[][] sparse) {
    // 根据稀疏数组的第一行,创建二维数组
    int[][] array = new int[sparse[0][0]][sparse[0][1]];

    // 遍历稀疏数组 ,从第二行开始将稀疏数组中的值 赋给 创建好的二维数组
    for (int i = 1; i < sparse.length; i++) {
        int[] row = sparse[i];
        array[row[0]][row[1]]=row[2];
    }

    // 遍历二维数组,打印值
    for (int[] row : array) {
        for (int data : row) {
            System.out.print(data + "  ");
        }
        System.out.println();
    }
    return array;
}

稀疏数组转二维数组.png

原文链接:https://www.cnblogs.com/fzdkx/p/17349581.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:稀疏数组 - Python技术站

(0)
上一篇 2023年4月25日
下一篇 2023年4月25日

相关文章

  • EM算法的python实现的方法步骤

    以下是关于“EM算法的Python实现的方法步骤”的完整攻略: 简介 EM算法是一种常用的统计学习算法,用于估计含有隐变量的概率模型参数。在本教程中,我们将介绍如何使用Python实现EM算法,并提供两个示例。 方法步骤 EM算法的Python实现方法步骤如下: 初始化模型参数,包括隐变量的初始值和模型参数的初始值。 E步骤:根据当前模型参数和观测数据,计算…

    python 2023年5月14日
    00
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

    目录 1. 题目 2. 解题思路 3. 数据类型功能函数总结 4. java代码 5. 踩坑小记 递归调用,显示StackOverflowError 1. 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树: 5 / \ 2 6 /…

    算法与数据结构 2023年4月23日
    00
  • Redis五种数据结构在JAVA中如何封装使用

    Redis 是一款高性能的键值存储数据库,支持五种不同的数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。在Java中使用Redis需要封装对应的数据结构,本文将详细介绍如何封装Redis的五种数据结构。 封装Redis字符串数据结构 Redis字符串数据结构对应Java中的String类…

    数据结构 2023年5月17日
    00
  • 贪心算法基础及leetcode例题

    理论 本质:找到每个阶段的局部最优,然后去推导得到全局最优两个极端:常识&&很难: 很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做! 套路:贪心没有套路,说白了就是常识性推导加上举反例做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 贪心算法一般分为如下…

    算法与数据结构 2023年4月20日
    00
  • 基于ID3决策树算法的实现(Python版)

    基于ID3决策树算法的实现(Python版) 1. 简介 决策树是一种常用的机器学习算法,它可以用于分类和回归问题。ID3是一种常用的决策树算法,它基于信息熵来选择最佳划分属性。本文将介绍如何使用Python实现基于ID3决策树算法的分类器。 2. 数据集 我们将使用一个简单的数据集来演示如何使用ID3算法构决策树。这个数据集包含5个样本,每个样本两个特征:…

    python 2023年5月14日
    00
  • java数据结构之树基本概念解析及代码示例

    Java数据结构之树基本概念解析及代码示例 树的基本概念 树(Tree)是一种非常重要的数据结构,它以“分支和层次”为特点,常用于组织数据,如目录结构、文件系统、网络结构等。 树是由节点(Node)构成的集合,其中有一个节点为根(Root),其他节点被称为子节点。每个节点都有一个父节点,除根节点外,每个节点可以有多个子节点。节点之间的关系称为边(Edge)。…

    数据结构 2023年5月16日
    00
  • python实现可逆简单的加密算法

    下面是关于“Python实现可逆简单的加密算法”的完整攻略。 1. 可逆简单的加密算法简介 可逆简单的加密算法是一种基密码学的法,它可以将明文转换为密文,从而保证数据的安全性。与其他加密算法不同的是可逆简单加密算法可以通过相同的算法逆向解密,将密文还原为明文。这种算法通常用对敏感数据进行加密,如密码、银行卡号等。 2. Python实现可逆简单的加密算法 2…

    python 2023年5月13日
    00
  • Python常用模块介绍

    以下是关于“Python常用模块介绍”的完整攻略: 简介 Python是一种功能强大的编程语言,它有许多内置模块和第三方模块,可以帮助我们更轻松地完成各种任务。在本教程中,我们将介绍一些常用的Python模块,并提供两个示例说明。 常用Python模块介绍 NumPy NumPy是Python中用于科学计算的基本软件包之一。它提供了一个强大的N维数组对象,以…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部