数据结构与算法学习之(稀疏数组)

稀疏数组

实际需求

二维数组很多值为0,记录了很多没有意义的数据,故引出稀疏数组

基本介绍

当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存数组

稀疏数组的处理方法

  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把具有不同的元素的行列及值记录在一个小规模的数组中,从而缩小规模

二维数组转稀疏数组思路

  1. 遍历原始二维数组,得到有效的数据个数sum
  2. 根据sum就可以创建稀疏数组sparseArr intsum - 1
  3. 将二维数组的有效数据存入到稀疏数组

稀疏数组转二维数组的思路

  1. 先读取稀疏数组的第一行,根据数据,创建二维数组
  2. 在读取稀疏数组后几行的数据,并赋值给原始的二维数组即可

实现

初始条件
        //创建二维数组 11 * 11        //0 表示 没有棋子        //1 表示 黑子        //2 表示 白子        int[][] chessArr1 = new int[11][11];        chessArr1[1][2] = 1;        chessArr1[2][3] = 2;        chessArr1[4][5] = 2;

遍历原始二维数组

        System.out.println("原始二维数组为:");        for (int[] inits : chessArr1) {            for (int i : inits) {                System.out.printf("%d\t", i);            }            System.out.println();        }

二维数组转换为稀疏数组

1.遍历二维数组,得到非0的个数

        int sum = 0;        for (int[] init : chessArr1) {            for (int j = 0; j < chessArr1.length; j++) {                if (init[j] != 0) {                    sum++;                }            }        }

2.创建对应的稀疏数组

int[][] sparseArr = new int[sum + 1][3];

3.给稀疏数组赋初始值(第一行)

        sparseArr[0][0] = 11;        sparseArr[0][1] = 11;        sparseArr[0][2] = sum;

4.遍历二维数组,将非0值放入稀疏数组

        int count = 0;      //count 用于记录是第几个非0数据 count 1开始        for(int i = 0; i < chessArr1.length; i++) {            for(int j = 0; j < chessArr1.length; j++) {                if(chessArr1[i][j] != 0) {                    count++;                    sparseArr[count][0] = i;                    sparseArr[count][1] = j;                    sparseArr[count][2] = chessArr1[i][j];                }            }        }

5.输出稀疏数组

        System.out.println();        System.out.println("稀疏数组为");        for (int[] ints : sparseArr) {            System.out.printf("%d\t%d\t%d\n", ints[0], ints[1], ints[2]);        }?        System.out.println();

稀疏数组恢复成二维数组

1.创建新的二维数组

        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];

2.将稀疏数组中的值放入二维数组(从第二行放!)

        for(int i = 1; i < sparseArr.length; i++) {            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];        }

3.输出恢复后的二维数组

        System.out.println();        System.out.println("恢复后的二维数组");?        for (int[] ints : chessArr2) {            for (int j = 0; j < chessArr2.length; j++) {                System.out.printf("%d\t", ints[j]);            }            System.out.println();        }

原文地址:https://www.cnblogs.com/yfyyy/p/12309610.html

时间: 2024-08-30 14:38:50

数据结构与算法学习之(稀疏数组)的相关文章

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

数据结构与算法javascript描述笔记--数组篇

数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串.在内部被归类为数组.由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用. 使用数组: 1.创建数组 ① 使用 [] 操作符 ,var arr=[] ,该方法效率最高. ② 调用 Array 的构造函数创建数组,var myArr=new

翻阅《数据结构与算法javascript描述》--数组篇

导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串.在内部被归类为数组.由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用. 使用数组: 1.创建数组 使用 [] 操作符 ,var a

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

数据结构和算法学习总结01 绪论

数据结构实际上是数据元素之间的关系的集合 数据结构分为    1.逻辑结构      2.物理结构(逻辑结构的数据元素的存储方式)                            逻辑结构分为  1.集合结构   数据元素无关系,只是属于一个集合                            2.线性结构   数据元素间1对1的关系                            3.树形结构   数据元素间1对多的关系                            

数据结构和算法学习

Algorithms, 4th Edition 不过一遍都不好意思说你学过算法           学习资料: 怎样学算法? 如何学习数据结构?

Java数据结构和算法(二)——数组

上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要的数据结构,当然每种语言对数组的实现和处理也不相同,但是本质是都是用来存放数据的的结构,这里我们以Java语言为例,来详细介绍Java语言中数组的用法. 1.Java数组介绍 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型. ①.数组的声明 第一种方式: 数据类型 []

数据结构与算法——学习整理记录

===注:此文由本人结合网上资源整理总结而来,仅代表个人的学习与理解,如有错漏,欢迎指正!=== # 1. 数据结构 ## 1.1 数据结构是什么? 数据结构,直白地理解,就是研究数据的逻辑关系与存储方式的一门学科. 可以简单的分为:数据的逻辑结构(逻辑关系)和数据的存储结构(物理结构). 它是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作. ### 1.1.1 数据的逻辑结构 数据的逻辑结构,简单地理解,就是指的数据之间的逻辑关系. 数据之间的逻辑关系可简单的分为

算法学习:后缀数组 height的求取

[定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表示的是,第 i 个后缀和字符串的最长前缀  [解决问题] 这两个算法都是在解决这个问题 即求后缀和字符串和后缀之间的最长公共前缀 但是有所不同的是, 后缀数组最终求出的是,字典序第 i 个后缀和第 i + 1 个后缀的最长公共前缀 z函数最终求出的是,第 i 个后缀和字符串的最长公共前缀 然后通过这个最长公共前缀求一些其他