稀疏数组

引入

  • 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续
  • 我们应该怎么实现 ?
    • 以围棋举例
      • 使用二维数组将棋盘记下 ,如 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日

相关文章

  • python实现拓扑排序的基本教程

    下面是详细讲解“Python实现拓扑排序的基本教程”的完整攻略。 1. 什么是拓扑排序? 拓扑排序是指将有向无环图(DAG)中的节点按照一定的顺序进行排序的过程。在拓扑排序中,如果存在一条从A到节点B的有向,则节点A必须排在节点B的前面。 2. Python实现拓扑排序的基本方法 下面是一个Python实现拓扑排序的示例: from collections …

    python 2023年5月14日
    00
  • Raft协议及伪码解析

    目录 节点的状态转换 follower candidate leader 伪码部分 节点初始化(Initialazation) 选举时其他节点的视角 回到candidate选举时的视角 消息如何广播复制 重要的反复出现的ReplicateLog 节点收到了LogRequest 节点如何追加log,Appendentries 再次回到leader, 如何处理L…

    算法与数据结构 2023年4月17日
    00
  • 高效测试用例组织算法pairwise之Python实现方法

    高效测试用例组织算法pairwise之Python实现方法 什么是pairwise算法? pairwise算法是一种测试用例组织算法,它可以帮助我们在测试中尽可能地减少测试用例的数量,同时证测试覆盖率。它的基本思想是:对于每个测试用例,选择一组不同的参数值进行测试,以尽可能地覆盖所有的参数组合。 实现pairwise法的方法 Python实现pairwise…

    python 2023年5月14日
    00
  • Python实现LRU算法的2种方法

    Python实现LRU算法的2种方法 LRU算法是一种常见的缓存淘汰策略,它可以用于实现缓存系统。在本文中,我们将讲解Python实现LRU算法的2种方法,包括使用Python标准库的collections模块和手实现LRU算法。同时,我们还将提供两个示例说明,以帮助读者更好地理解LRU法的使用方法。 方法1:使用collections模块 Python标准…

    python 2023年5月13日
    00
  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    C语言数据结构顺序表中的增删改(头插头删)教程示例详解 什么是顺序表? 顺序表是一种用数组实现的线性表,所有元素存储在一块连续的存储区中。顺序表的操作包括插入、删除、查找等。 常用的顺序表操作 增加元素 删除元素 修改元素 查找元素 以下以头插和头删为例,讲解如何在C语言数据结构顺序表中实现这些操作。 头插操作 头插的实现首先需要考虑插入位置的下标,由于是头…

    数据结构 2023年5月17日
    00
  • python 实现逻辑回归

    逻辑回归是一种常用的分类算法,它可以将数据集划分为两个或多个类别。在本攻略中,我们将介绍如何使用Python实现逻辑回归算法。 步骤1:导入库 在Python实现逻辑回归算法之前,我们需要导入相关的库。在本攻略中,我们将使用NumPy库和Matplotlib库来处理数据和可视化结果,使用sklearn库中的LogisticRegression类来实现逻辑回归…

    python 2023年5月14日
    00
  • C语言实现带头结点的链表的创建、查找、插入、删除操作

    C语言实现带头结点的链表的创建、查找、插入、删除操作攻略 一、链表基本概念 链表是一种动态的数据结构,它可以在运行时动态地分配内存,支持数据的插入、删除等操作。链表(Linked List)由多个节点(Node)组成,每个节点包含两部分,一个是数据部分(Data),另一个是指向下一个节点的指针(Next)。 二、带头结点的链表 带头结点的链表是一种特殊的链表…

    数据结构 2023年5月17日
    00
  • python实现全排列代码(回溯、深度优先搜索)

    下面是详细讲解“Python实现全排列代码(回溯、深度优先搜索)”的完整攻略,包含两个示例说明。 全排列算法简介 全排列是指将一组数按一定顺序进行排列,通常用于密码学、组合数学等领域。全排列算法有多种实现方式,其中回溯和深度优先搜索是两种常见的方法。 回溯法实现全排列 下面是Python实现回溯法全排列的代码: def backtrack_permute(n…

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