稀疏数组

yizhihongxing

引入

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

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

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

相关文章

  • 在Python中实现贪婪排名算法的教程

    在Python中实现贪婪排名算法的教程 贪婪排名算法是一种常用的排序算法,其基本思想是根据每个元素的权重值进行排序,从而得到排名列表。在Python中可以使用sorted()函数实现贪婪排名算法。本文将详细讲解Python实现贪婪排名算法的完整攻略,包算法原理、Python实现过程和示例。 算法原理 贪婪排名算法的基本思想是:根据每个素的权重值进行排序,从而…

    python 2023年5月14日
    00
  • Python实现的数据结构与算法之基本搜索详解

    Python实现的数据结构与算法之基本搜索详解 在计算机科学中,搜索指的是在一组数据中找到目标数据的过程。搜索算法是解决各种问题的关键,即使是拼图游戏和图像识别也要依赖搜索算法。本文将介绍基本的搜索算法,包括线性/顺序搜索、二分搜索和广度优先搜索。 线性/顺序搜索 顺序搜索又称为线性搜索,它遍历整个数据集以查找特定元素。顺序搜索可以用于查找未排序的列表。该算…

    数据结构 2023年5月17日
    00
  • Python K最近邻从原理到实现的方法

    以下是关于“Python K最近邻从原理到实现的方法”的完整攻略: 简介 K最近邻(K-Nearest Neighbors,KNN)是一种基于实例的学习算法,它可以用于分类和回归任务。在本教程中,我们将介绍KNN算法的原理和Python实现方法,并提供两个示例说明。 KNN算法原理 KNN算法的基本思想是:对于一个新的数据点,找到与其最近的K个数据点,然后根…

    python 2023年5月14日
    00
  • 使用python实现回文数的四种方法小结

    以下是关于“使用Python实现回文数的四种方法小结”的完整攻略: 简介 回文数是指正反读都相同的数字,例如121和1221。在Python中,有多种方法可以判断一个数字是否为回文数。本教程将介绍四种使用Python实现回文数的方法,并讨论每种方法的优缺点。 方法一:字符串反转 第一种方法是将数字转换为字符串,然后将字符串反转并与原始字符串进行比较。可以使用…

    python 2023年5月14日
    00
  • rsa详解及例题及python算法

    下面是详细讲解“RSA算法详解及例题及Python算法”的完整攻略,包含两个示例说明。 RSA算法简介 RSA算法是一种非对称加密算法,的基本原理是利用两个大质数的乘积作为公钥,而这两个质数的乘积作为私钥。RSA算的优点是安全高,但是加解速度较慢。 RSA算法的实现 下是RSA算法的实现过程: 1. 两个大质数p和q 这两个质数的乘积n=p*q,n的长度就是…

    python 2023年5月14日
    00
  • Java数据结构及算法实例:插入排序 Insertion Sort

    Java数据结构及算法实例:插入排序 Insertion Sort 算法简介 插入排序是一种简单的排序算法,它的工作方式是每次将一个待排序的元素与前面已经排好序的元素逐个比较,并插入到合适的位置。插入排序的时间复杂度为O(n^2),是一种比较低效的排序算法。 算法实现 以下是使用Java语言实现插入排序算法的代码: public static void in…

    数据结构 2023年5月17日
    00
  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

    数据结构 2023年5月17日
    00
  • Python利用三层神经网络实现手写数字分类详解

    以下是关于“Python利用三层神经网络实现手写数字分类详解”的完整攻略: 简介 神经网络是一种模拟人脑神经元工作方式的计算模型,它可以用于分类、回归、聚类等任务。在本教程中,我们将介绍如何使用Python实现一个三层神经网络,并使用MNIST数据集进行手写数字分类。 神经网络基本概念 神经网络由多个神经元组成,每个神经元接收多个输入,经过加权和和激活函数处…

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