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

稀疏数组小记

稀疏数组问题引入基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:1.记录

稀疏数组




问题引入

在这里插入图片描述




基本介绍


  • 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
  • 稀疏数组的处理方法是:
    • 1.记录数组一共有几行几列,有多少个不同的值
    • 2.把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模



实例应用


  • 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
  • 把稀疏数组存盘,并且可以从新恢复原来的二维数组
  • 数整体思路分析
    在这里插入图片描述

实现代码

package com.atguigu.sparsearray;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class SparseArray {public static void main(String[] args) {SparseArray sparse &#61; new SparseArray();// 创建一个原始的二维数组 11*11// 0&#xff1a;表示没有棋子&#xff0c;1表示黑子&#xff0c;2表示蓝色的子int chessArr1[][] &#61; new int[11][11];chessArr1[1][2] &#61; 1;chessArr1[2][3] &#61; 2;// 输出原始的二维数组System.out.println("原始的二维数组~");// for (int[] row : chessArr1) {// for (int data : row) {// System.out.printf("%d\t", data);// }// System.out.println();// }for (int[] row : chessArr1) {for (int data : row) {System.out.print(data &#43; "\t");}System.out.println();}// 将二维数组转化为稀疏数组// 1.先遍历二维数组&#xff0c;得到非零数据的个数int sum &#61; 0;for (int i &#61; 0; i < 11; i&#43;&#43;) {// 遍历行for (int j &#61; 0; j < 11; j&#43;&#43;) {if (chessArr1[i][j] !&#61; 0) {sum&#43;&#43;;}}}// System.out.println("sum &#61; " &#43; sum);// 2.创建对应的系数数组int sparseArr[][] &#61; new int[sum &#43; 1][3];// 给稀疏数组赋值sparseArr[0][0] &#61; 11; // 存着二维数组有多少rowsparseArr[0][1] &#61; 11;// 存着二维数组有多少rcolsparseArr[0][2] &#61; sum;// 遍历二维数组&#xff0c;将非零的值存放到稀疏数组中int count &#61; 0; // 作用:count用于记录是第几个非零数据for (int i &#61; 0; i < 11; i&#43;&#43;) {for (int j &#61; 0; j < 11; j&#43;&#43;) {if (chessArr1[i][j] !&#61; 0) { // i &#61; 1,j &#61; 2count&#43;&#43;;sparseArr[count][0] &#61; i;// 相当于将二维数组中数组的row值存起来sparseArr[count][1] &#61; j;// 相当于将二维数组中数组的col值存起来sparseArr[count][2] &#61; chessArr1[i][j];}}}// 输出稀疏数组的形式System.out.println();System.out.println("得到的稀疏数组为&#xff1a;");for (int i &#61; 0; i < sparseArr.length; i&#43;&#43;) {// System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);for (int j &#61; 0; j < sparseArr[i].length; j&#43;&#43;) {System.out.print(sparseArr[i][j] &#43; "\t");// System.out.printf("%d\t", data);}System.out.println();}System.out.println("稀疏数组打印完毕...");System.out.println("****************将稀疏数组存放到磁盘中****************************");//调用写出稀疏数组的方法String fileWritePath&#61;"E:\\B站Java学习资料存放\\算法与数据结构\\笔记代码课件资料\\课件\\emp.data";sparse.writeSparseArray(fileWritePath, sparseArr);System.out.println("******************稀疏数组存到磁盘中完毕*************************");//将磁盘中的稀疏数组读取出来int[][] readSparseArray &#61; sparse.readSparseArray(fileWritePath);/// 将稀疏数组转化为二维数组// 1.读取稀疏数组的第一行&#xff0c;根据第一行的数据创建二维数组int chessArr2[][] &#61; new int[readSparseArray[0][0]][sparseArr[0][1]];// 2.读取稀疏数组的后几行数据&#xff08;从第二行开始&#xff09;&#xff0c;并赋值给原始的二维数组for (int i &#61; 1; i < sparseArr.length; i&#43;&#43;) {int j &#61; 0;chessArr2[sparseArr[i][j]][sparseArr[i][j &#43; 1]] &#61; sparseArr[i][j &#43; 2];}// 恢复后的二维数组System.out.println();System.out.println("恢复后的二维数组");for (int[] data1 : chessArr2) {for (int data : data1) {System.out.printf("%d\t", data);}System.out.println();}}/*** * &#64;param filePath 输入文件路径* &#64;param sparseArr 要输出的稀疏数组* &#64;return 是否输出成功*/public boolean writeSparseArray(String fileWritePath,int[][] sparseArr ){// 2.创建对应的流FileWriter fw &#61; null;try {// 将稀疏数组存到磁盘中去// 1.指定打印的文件File file &#61; new File(fileWritePath);if (!(file.exists())) {System.out.println("文件不存在创建中...");file.createNewFile();System.out.println("文件创建成功");}fw &#61; new FileWriter(file);// 3.对应的具体写出操作// 遍历稀疏数组for (int i &#61; 0; i < sparseArr.length; i&#43;&#43;) {
// fw.write(sparseArr[i][0] &#43; "\t" &#43; sparseArr[i][1] &#43; "\t" &#43; sparseArr[i][2] &#43; "\r\n" );for(int j &#61; 0 ; j < sparseArr[i].length; j&#43;&#43;){fw.write(sparseArr[i][j] &#43; "\t"); }fw.write("\r\n");}} catch (Exception e) {e.printStackTrace();return false;} finally {// 4.关闭流try {fw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;}}return true;}/*** 读入稀疏数组* &#64;param readFilePath 读入文件的路径* &#64;return 返回一个稀疏数组*/public int[][] readSparseArray(String readFilePath){BufferedReader br &#61; null;// 创建稀疏数组int[][] sparseArray &#61; null;try {// 1.创建处理流br &#61; new BufferedReader(new FileReader(new File(readFilePath)));// 2.读入文件boolean isNotRead &#61; false;// 控制sparseArray数组只创建一次String str;// 装从文件中遍历出来的数据int curCount &#61; 0;int len;while ((str &#61; br.readLine()) !&#61; null) {// 使用readLine的原因是因为它不包含换行符String[] split &#61; str.split("\t");if (!isNotRead) {// 根据磁盘中文件将稀疏数组创建起来&#xff1a;isNotRead--》控制只创建一次sparseArray &#61; new int[Integer.parseInt(split[2]) &#43; 1][3];sparseArray[curCount][0] &#61; Integer.parseInt(split[0]);sparseArray[curCount][1] &#61; Integer.parseInt(split[1]);sparseArray[curCount][2] &#61; Integer.parseInt(split[2]);curCount&#43;&#43;;isNotRead &#61; true;} else {sparseArray[curCount][0] &#61; Integer.parseInt(split[0]);sparseArray[curCount][1] &#61; Integer.parseInt(split[1]);sparseArray[curCount][2] &#61; Integer.parseInt(split[2]);curCount&#43;&#43;;}}System.out.println("**********成功写出*************");} catch (IOException e) {e.printStackTrace();} finally {if (br !&#61; null) {try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return sparseArray;}}

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
营营420_769
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有