稀疏数组

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/17349581.html

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

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

相关文章

  • Python利用scikit-learn实现近邻算法分类的示例详解

    以下是关于“Python利用scikit-learn实现近邻算法分类的示例详解”的完整攻略: 简介 近邻算法是一种用于分类和回归的机器学习算法,它可以根据最近的邻居来预测新数据点的标签或值。在本教程中,我们将介绍如何使用Python和scikit-learn库实现近邻算法分类,并提供两个示例说明。 实现近邻算法分类 以下是使用Python和scikit-le…

    python 2023年5月14日
    00
  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总 1. 基础知识 1.1 数据结构 数据结构是计算机存储、组织数据的方式。这里列出常见的数据结构,包括但不限于: 数组 链表 栈 队列 树 哈希表 1.2 算法 算法是解决问题的步骤和方法。下列是常见的算法: 排序算法 查找算法 字符串算法 图算法 1.3 复杂度 复杂度是算法性能的度量。常见的复杂度表示法有O(n…

    数据结构 2023年5月17日
    00
  • Python使用三种方法实现PCA算法

    PCA(Principal Component Analysis)是一种常用的数据降维算法,它可以将高维数据转换为低维数据,同时保留数据的主要特征。Python中,我们可以使用三种方法来实现PCA算法。 方法一:使用Numpy实现PCA算法 以下是使用Numpy实现PCA法的Python代码示例: import numpy as np def pca(X, …

    python 2023年5月13日
    00
  • 关于Python八大排序实现方法(冒泡排序、快速排序等)

    以下是关于“Python八大排序实现方法(冒泡排序、快速排序等)”的完整攻略: 简介 排序是计算机科学中的一个基本问题,它涉及将一组元素按照某种顺序排列。Python提供了多种排序算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、计数排序和基数排序。本教程将介绍如何使用Python实现这些排序算法,并讨论如何使用这些算法来排序不同类型的数据…

    python 2023年5月14日
    00
  • 一步步带你学习设计MySQL索引数据结构

    一步步带你学习设计MySQL索引数据结构 索引原理 在MySQL中,索引是一种数据结构,用于快速查找表中的记录。在一张表中,可以使用不同的列来创建索引,索引可以大大提高查询效率,减少扫描行数,加快数据查询速度。 索引的实现一般使用的是B树和B+树这两种数据结构,因为它们都具有良好的平衡性,可以快速查找,插入和删除。 如何设计MySQL索引 确认需要优化的查询…

    数据结构 2023年5月17日
    00
  • C语言中数据结构之链式基数排序

    C语言中数据结构之链式基数排序 概述 链式基数排序是基数排序的一种实现方式。基数排序是一种桶排序算法,它通过将需要排序的数据分成多个桶,并且按照一定的顺序将数据从桶中取出来,以达到排序的目的。链式基数排序则使用了链表结构来实现桶的功能。 实现步骤 链式基数排序的实现步骤如下: 申请链表节点数组,并初始化链表头结点数组。链表的数量等于指定的基数,例如10进制的…

    数据结构 2023年5月17日
    00
  • 数据结构之哈夫曼树与哈夫曼编码

    一、背景 编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。但其在传输和存储等情况下编码效率不高。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例] 将百分制的考试成绩转换成五分制的成绩 按顺序分别编码。 按频率分别编码(高频短编码,类似于香…

    算法与数据结构 2023年4月17日
    00
  • Redis之常用数据结构哈希表

    Redis之常用数据结构哈希表 Redis是一种开源的、高性能的、基于内存的数据存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。其中哈希表是一种常用的数据结构,本文将详细讲解Redis中的哈希表。 哈希表概述 哈希表是一种通过哈希函数和数组实现的数据结构,能够快速地进行插入、查找和删除等操作,时间复杂度为O(1)。在Redis中,哈…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部