热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

稀疏数组(普通储存)

概念用来压缩无效数据(重复且只代表单一意义或状态的数据)较多的数组,减少空间损耗。方法普通储存的稀疏数组的列数是固定的,

概念

用来压缩无效数据(重复且只代表单一意义或状态的数据)较多的数组,减少空间损耗。

方法

普通储存的稀疏数组的列数是固定的,只有三列。
稀疏数组的第一行各列分别记录原始数组的行数,列数,有效值个数
往后的每行记录各个有效值的 坐标
第一列记录有效值的行数,第二列记录有效值的列数,第三列记录有效值的值
在这里插入图片描述

所以稀疏数组列数固定为 3,行数为 有效值个数+1

实现(java)

1.创建一个11*11的原数组

int[][] arr = new int[11][11];//创建一个原数组arr[1][2] = 1;//初始化原数组条件arr[2][3] = 2;arr[3][5] = 4;arr[5][6] = 5;int count = 0;//记录数组里有效数字的个数for (int[] row:arr){for (int item:row){System.out.print(item+"\t");//遍历输出数组if (item != 0)count++;//计数有效数字}System.out.println();}------------------------------------------0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2.创建稀疏数组并将有效值的坐标赋值给稀疏数组

int[][] sparseArrOut &#61; new int[count&#43;1][3];//根据count创建稀疏数组sparseArrOut[0][0] &#61; 11;sparseArrOut[0][1] &#61; 11;sparseArrOut[0][2] &#61; count;//第一行的初始化int k&#61;1;//稀疏数组记录有效值的行数for (int i&#61;0; i<arr.length; i&#43;&#43;){for (int j&#61;0; j<arr[i].length; j&#43;&#43;){if (arr[i][j] !&#61; 0){ //进行列的赋值sparseArrOut[k][2] &#61; arr[i][j];sparseArrOut[k][0] &#61; i;sparseArrOut[k][1] &#61; j;k&#43;&#43;;}}}

3.稀疏数组的磁盘IO读写

try {//将数组写出到磁盘上FileWriter os &#61; new FileWriter(new File("E:/a.txt"));for (int[] row : sparseArrOut){for (int item : row){os.write(item&#43;"\t");}os.write("\r\n");}os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//读入稀疏数组int[][] sparseArrIn &#61; new int[count&#43;1][3];try {BufferedReader br &#61; new BufferedReader(new FileReader(new File("E:/a.txt")));String line;int row &#61; 0;//行数while ((line &#61; br.readLine()) !&#61; null){String[] temp &#61; line.split("\t");for (int j&#61;0; j<temp.length; j&#43;&#43;){sparseArrIn[row][j] &#61; Integer.parseInt(temp[j]);}row&#43;&#43;;}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//遍历输出for (int[] row : sparseArrIn) {for (int item : row) {System.out.print(item &#43; "\t");}System.out.println();}------------------------------------------11 11 4 1 2 1 2 3 2 3 5 4 5 6 5

4.还原数组

//还原数组int[][] origin &#61; new int[sparseArrIn[0][0]] [sparseArrIn[0][1]];//创建空的原数组for (int i&#61;1; i<sparseArrIn.length; i&#43;&#43;){origin[sparseArrIn[i][0]] [sparseArrIn[i][1]] &#61; sparseArrIn[i][2];//将数组还原}for (int[] row1 : origin){//遍历输出for (int item : row1){System.out.print(item&#43;"\t");}System.out.println();}-------------------------------------------------------0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
淑娇姿荣石文
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有