将二维数组转为稀疏数组进行压缩,提高效率

article/2025/4/30 23:32:30

**

稀疏数组

**
##基本介绍:
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
1) 记录数组一共有几行几列,有多少个不同的值
2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
如下图所示:
在这里插入图片描述
注意:这份代码是看了尚硅谷的韩顺平老师的课程进行的总结

package com.zlx.sparseArray;import java.io.*;
import java.util.ArrayList;
import java.util.List;public class SparseArray {public static void main(String[] args) {//创建一个原始的二维数组 11*11//0:表示没有棋子  1:表示黑子  2:表示蓝子int chessArr1[][] = new int[11][11];  //创建一个存放整数的11*11的二维数组chessArr1[1][2] = 1; //第2行第3列存一个  黑子chessArr1[2][3] = 2; //第3行第5列存一个  蓝子chessArr1[2][5] = 1; //第3行第5列存一个  蓝子//输出原始的二维数组//先循环遍历行for (int[] row:chessArr1) {//再循环遍历列for (int data:row) {System.out.printf("%d\t",data); //每行数据使用tab进行分割}System.out.println();//输出完一行进行换行}//将二维数组转为稀疏数组//1、先遍历二维数组,得到非0数据的个数int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if(chessArr1[i][j] != 0){sum ++;}}}//2、创建对应的稀疏数组int sparseArr[][] = new int[sum+1][3];  //稀疏数组的行数:不为0的整数的个数+1  列数:3 即:row/col/val//给稀疏数组赋值sparseArr[0][0] = 11;  //稀疏数组第一行第一列存放:原始数组的行数sparseArr[0][1] = 11;  //稀疏数组的第一行第二列存放:原始数组的列数sparseArr[0][2] = sum; //稀疏数组的第一行第三列存放: 原始数组的非0的整数的个数//遍历原始的二维数组,将非0的值存放到稀疏数组sparseArray中//定义一个count用于记录当前是第几个非0数据int count = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if(chessArr1[i][j] != 0){count ++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}System.out.println("--------------------转换后得到的稀疏数组为--------------------");System.out.println("方法1: ");//输出当前稀疏数组  方法1:for (int i = 0; i < sparseArr.length; i++) {for (int j = 0; j < 3; j++) {System.out.printf("%d\t",sparseArr[i][j]);}System.out.println();}//输出当前稀疏数组  方法2:System.out.println("方法2: ");for (int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);}System.out.println("+++++++++++++++++++++++++++将稀疏数组存入到硬盘中++++++++++++++++++++++++++");File dest = new File("E:\\sparesArray.data");//将稀疏数组存入到硬盘中try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(dest))){for (int[] row:sparseArr) {for (int data:row) {bufferedWriter.write(data + "\t"); //一行一行存}bufferedWriter.write("\n");//注意:BufferedWriter是缓冲输入流,意思是调用BufferedWriter的write方法时候。// 数据是先写入到缓冲区里,并没有直接写入到目的文件里。必须调用BufferedWriter的flush()方法。// 这个方法会刷新一下该缓冲流,也就是会把数据写入到目的文件里。// 或者你可以调用BufferedWriter的close()方法,该方法会在关闭该输入流之前先刷新一下该缓冲流。// 也会把数据写入到目的文件里。//如果没有在里面的for()循环中添加 bw.flush(); 这句话,// 在if 的时候重新 new  BufferedWriter(); 就把原来bw(缓冲区)中的覆盖掉了。于是就不能写进文件字符。bufferedWriter.flush();}} catch (Exception e) {e.printStackTrace();}//从硬盘中读取稀疏数组并且进行恢复//获取硬盘中的稀疏数组的行数,并且将其存储到一个list集合中File src = new File("E:\\sparesArray.data");BufferedReader bufferedReader = null;List<Integer> list = new ArrayList<>();try {bufferedReader = new BufferedReader(new FileReader(src));String line;//java.io.BufferedReader.readline() 用于读取一行文本。遇到换行符或回车符readLine()方法会终止读取。//readLine()方法读出是null,就表示文件结尾了。while ((line = bufferedReader.readLine()) != null){String[] str = line.split("\t");for (int i = 0; i < str.length; i++) {list.add(Integer.parseInt(str[i]));}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(bufferedReader != null){try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}System.out.println("list ====>>>> "+list);//打印稀疏数组行数System.out.println("稀疏数组的行数为:  "+list.get(2)+1);   //第三个元素代表不为0的元素有多少个,+1代表稀疏数组的行数//从硬盘读取稀疏数组到内存种的方法二:直接对之前的list进行操作//创建稀疏数组int sparseArr2[][]=new int[list.get(2)+1][3];int m=0;for(int i=0;i<list.size();i=i+3) {sparseArr2[m][0]=list.get(i);sparseArr2[m][1]=list.get(i+1);sparseArr2[m][2]=list.get(i+2);m++;}System.out.println("-----------------从硬盘种读取的稀疏数组---------------------------");for(int[] row2:sparseArr2) {for(int data:row2) {System.out.printf("%d\t",data);}System.out.println();}System.out.println("++++++++++++++++++=将稀疏数组转为普通的二维数组+++++++++++++++++++++++++++++");//将稀疏数组转为普通的二维数组//1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]//2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.int chessArr2[][] = new int[sparseArr2[0][0]][sparseArr2[0][1]];for (int i = 1; i < sparseArr2.length; i++) {//稀疏数组的第2行开始:第一列为原始数组的行  第二列为原始数组的列  第三列为原始数组的值chessArr2[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2];}//方法1:for (int i = 0; i < chessArr2.length; i++) {for (int j = 0; j < chessArr2[i].length; j++) {System.out.printf("%d\t",chessArr2[i][j]);}System.out.println();}}
}

输出的结果为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/qG0FSuZ1.shtml

相关文章

A数字三角 怨种

问题描述 有一天&#xff0c;无聊的 zlx 从 1 开始数数&#xff0c;同时在纸上写下每个数的个位数字。因为她非常热爱直角三角形&#xff0c;所以在纸上写下的数字按照直角三角形排列。现在告 诉你写她了 N 行数字&#xff0c;要求你打出这些数字。 输入格式 一行一个数 N&a…

聊聊Spring的IOC,AOP、DI、MVC

1 聊聊Ioc,Di,Mvc,Aop 不想看下面内容的&#xff0c;直接上代码连接&#xff0c;以下代码都有注释 传送门 1.1 看启动项 我们先来看看启动项 package com.tian;import com.tian.springframework.annotation.SpringBootApplication; import com.tian.springframework.config…

ZYNQ DDS产生载波FFT变换

环境&#xff1a;vivado2017.4&#xff0c;快速傅里叶变换V9.0 IP核 一&#xff0c;介绍&#xff1a;Xilinx FFT IP核是一种计算DFT的有效方式。 特点&#xff1a;前向变换&#xff08;FFT&#xff09;和反向变换&#xff08;IFFT&#xff09;在复数空间&#xff0c;并且可…

并发队列中迭代器弱一致性原理探究

一、前言 并发队列里面的Iterators是弱一致性的&#xff0c;next返回的是队列某一个时间点或者创建迭代器时候的状态的反映。当创建迭代器后&#xff0c;其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常&#xff0c;能够保持创建迭代器后的元…

浅谈同构类问题的骗分算法

ZLX算法-----同构类问题的有力骗分算法前言&#xff1a;ZLX算法是一种解决判定性同构问题的蒙特卡罗式骗分算法&#xff1a;总能在确定的运行时间内出解&#xff0c;但是得到的解不能保证正确。尽管由于具有拓扑序&#xff0c;树同构和仙人掌同构存在多项式算法&#xff0c;但是…

win10下修改C盘用户文件夹名

之前安装一个程序出错&#xff0c;上网百度后是用户文件夹名为中文&#xff0c;也在网上找了好多方法&#xff0c;有同步的&#xff0c;有修改注册表的&#xff0c;最后我找到一个比较简单而且数据保留完整的方法。这种方法也会自动修改用户的环境变量&#xff0c;不过修改完后…

【Windows】Win10-更改c盘下的用户文件夹名

转载ooooohugh的文章&#xff0c;原文地址&#xff1a;https://blog.csdn.net/qq_33530388/article/details/71739845 当初 不小心用自己名字 作为计算机用户名&#xff0c;后来 许多软件因为 不支持 路径中有中文&#xff0c;导致吃了不少的亏&#xff0c;心疼。。。。 下面说…

Windows10更改c盘中用户名对应的文件名字

目录 前言一、修改步骤1.开启管理员账号并登陆2.重启电脑3.登录管理员账号4.重命名用户名对应的文件夹5.修改Path6.重启电脑并切换回你的账号7.修改环境变量8.重启电脑 二、修改导致的问题1.桌面大部分软件快捷方式失效2.部分软件无故消失 三、提醒Last 前言 强烈建议看完此文…

win10 修改c盘用户文件夹名称

c盘用户文件夹如果是中文名 可能会导致需要没必要的麻烦&#xff0c;记录一下修改方法 第一步&#xff1a;如果你电脑不是本地用户administrator&#xff0c;注销当前用户使用administrator登录 按winx 点击关机或注销 在点击注销 注销后如果没有Administrator登录方式&#…

有关windows10修改C盘用户中文名文件夹相关问题的具体解决方案

win10修改用户文件夹名 今天在下载安卓sdk开发工具的时候&#xff0c;安装出现了一个问题如图&#xff0c;左下角提示我们的sdk路径含有非ascll的字符&#xff0c;无法继续安装&#xff0c;其实不只是中文字符&#xff0c;英文字符中间若有空格也不能继续安装。 对于互联网学…

更改计算机用户文件夹,win10系统怎么自定义C盘用户文件夹名称

许多用户在安装win10系统之后&#xff0c;想要让电脑显得更加个性化&#xff0c;就想要给C盘中的用户文件夹名称进行自定义修改&#xff0c;那么win10系统怎么自定义C盘用户文件夹名称呢&#xff1f;接下来给大家分享一下具体的操作步骤。 1、在键盘上按下Windows键X 组合键&am…

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍&#xff1a;由于系统重装导致Windows 11的系统用户名与C盘User&#xff08;用户&#xff09;文件夹下的用户名文件夹&#xff08;公用文件夹旁边的文件夹&#xff09;出现名称不一致&#xff0c;事例中系统用户名命名为“寂萧”&#xff0c;User&#xff08;用户&…

win10怎么更改c盘用户计算机名,详解win10系统更改c盘用户名文件夹名称的设置技巧...

电脑一旦开机就会不停的运行&#xff0c;不可避免会出现软硬件问题&#xff0c;win10系统更改c盘用户名文件夹名称就是比较常见的状况&#xff0c;尤其是姑娘们遇到win10系统更改c盘用户名文件夹名称是要难过哭鼻子的&#xff0c;其实小编的经验是碰到win10系统更改c盘用户名文…

Windows 10系统中,如何重命名用户文件夹

免责声明 该方法不适用于所有情况&#xff0c;可能导致数据丢失、计算机无法重启等问题&#xff0c;请提前保护好数据&#xff01; 背景 许多Windows用户总是喜欢将文件放在用户文件夹&#xff08;C:\Users\username&#xff09;下&#xff0c;但有时候会发生一些令人苦恼的…

win10修改C盘用户文件夹下的文件命名

唉&#xff01;&#xff01;&#xff01;以前不太懂这些&#xff0c;取了个中文用户名。结果下载软件的过程中&#xff0c;各种出错&#xff0c;就是路径里面含有中文导致的。 这种情况下还都不能直接重命名&#xff0c;我试了各种方法&#xff0c;都不适合&#xff0c;最后找到…

windows修改用户文件夹名称 更改用户名 修改C盘Users目录下文件夹名称

知乎上的更详细版本 windows修改 C:\Users用户文件夹名称 把中文名修改为英文名 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/509804656 简短的说&#xff1a; 1 - 新建一个管理员账户A&#xff08;名称随意&#xff0c;不要和其他账户一样&#xff09;&#xff0c;注销…

win11修改C盘用户文件夹名称

新电脑使用microsoft账号进行初始化&#xff0c;导致用户文件夹名称是邮箱前五位&#xff0c;这个真的让人头痛。网上很多方法是直接改名称、改注册表信息等&#xff0c;导致出问题&#xff0c;结果要重装系统&#xff0c;很麻烦。 其实有一个很好的解决方法&#xff0c;如下&a…

如何修改C盘用户文件夹下的用户名

1、WindowsR&#xff0c;然后输入regedit&#xff0c;点击确定。 2、进入注册表编辑器后&#xff0c;依次打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList。 3、打开ProfileList后&#xff0c;打开最后一项&#xff0c;然后在右侧找到Profile…

win10 重命名用户文件夹

背景 win10 修改系统用户名之后发现C:\Users下面的用户文件夹没有跟着改变, 于是手动调整一下 解决办法 操作前,先对重要的数据和配置做一下备份, 修改注册表 按Windows R组合键&#xff0c;打开运行对话框&#xff0c;输入regedit&#xff0c;打开注册表 接着找到路径计算…

window10如何重命名系统用户文件夹

此文章用于帮助重命名系统文件夹 有些软件在使用时会出现保存路径中不能有中文的情况&#xff0c;但又不便修改路径&#xff0c;而系统用户文件夹又是中文无法避开时想要重命名发现难以修改名字。这篇文章将详细介绍如何进行系统用户重命名。 1. 首先进入管理员账户&#xff…