数据结构和算法学习——稀疏数组

news2024/11/20 10:33:02

目录

一、数据结构和算法的关系

二、数据结构的分类

(一)线性结构

(二)非线性结构

三、稀疏数组(sparsearray)

(一)稀疏数组的基本介绍

(二)稀疏数组的处理方法


一、数据结构和算法的关系

        数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮,更加有效率的代码。要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决。程序 = 数据结构 + 算法。数据结构是算法的基础,换言之,想要学好算法,需要把数据结构学到位。

二、数据结构的分类

(一)线性结构

  1. 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。
  2. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素(地址)是连续的。
  3. 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。
  4. 线性结构常见的有:数组、队列、链表和栈。

(二)非线性结构

非线性结构包括:二维数组,多维数组,广义表,树结构,图结构。

三、稀疏数组(sparsearray)

(一)稀疏数组的基本介绍

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

(二)稀疏数组的处理方法

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

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

1.遍历原始的二维数组,得到有效数据的个数sum

2.根据sum就可以创建稀疏数组sparseArr int[sum+1][3]

3.将二维数组的有效数据存入到稀疏数组中

4.将稀疏数组保存到磁盘中

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

1.磁盘文件先恢复为稀疏数组

2.读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2=int[11][11]

3.再读取稀疏数组后几行的数据,并赋给原始的二维数组即可。

代码实现:

package com.atguigu.practices.sparsearray;

import java.io.*;

public class SparseArray2 {
    public static void main(String[] args){
        // 创建棋盘11*11,棋盘也可能不规则
        int chessArr[][] = new int[11][11];
        // 设定棋子:0是没有棋子;1是黑子;2是白子
        // 棋盘初始化
        chessArr[1][5]=1;
        chessArr[2][3]=2;

        // 遍历这个初始棋盘
        for (int[] row :
                chessArr) {
            for (int data:
                 row) {
                System.out.print(data+"\t");
            }
            System.out.println();
        }

        // 将棋盘转为稀疏数组
        // 稀疏数组总是3列,稀疏数组的行是棋子的坐标,且非0的才会显示在稀疏数组中
        // 遍历棋盘,找出非0的棋子数
        int sum = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if(chessArr[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("棋盘中一个有"+sum+"个棋子");

        // 创建稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        // 稀疏数组初始化
        sparseArr[0][0]=chessArr.length;
        sparseArr[0][1]= chessArr[0].length;
        sparseArr[0][2]=sum;
        // 给稀疏数组赋值
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if(chessArr[i][j]!=0){
                    count++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=chessArr[i][j];
                }
            }
        }

        // 遍历稀疏数组
        System.out.println("稀疏数组为:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.println(sparseArr[i][0]+"\t"+sparseArr[i][1]+"\t"+sparseArr[i][2]);
        }

        // 稀疏数组转二维数组
        // 稀疏数组的第一行的前两个数据就是二维数组的行列
        int newChessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        // 从稀疏数组的第二行开始给新的二维数组赋值
        for (int i = 1; i < sparseArr.length; i++) {
            newChessArr[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
        }

        // 遍历二维数组
        System.out.println("新的二维数组是:");
        for (int i = 0; i < newChessArr.length; i++) {
            for (int j = 0; j<newChessArr[i].length;j++){
                System.out.print(newChessArr[i][j]+"\t");
            }
            System.out.println();
        }

        System.out.println("----------------------------------------------");
        System.out.println("稀疏数组的读写------------------------------------");
        // 将稀疏数组存储到磁盘中
        // 边写边读
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        FileInputStream fis = null;
        InputStreamReader isr = null;
        try {
            fos = new FileOutputStream("./resources/map.data");
            osw = new OutputStreamWriter(fos, "UTF8");
            System.out.println("写入中..............");
            // 遍历稀疏数组
            for (int i = 0; i < sparseArr.length; i++) {
                osw.write(sparseArr[i][0]+"\t"+sparseArr[i][1]+"\t"+sparseArr[i][2]+"\t");
            }
            osw.close();
            fos.close();
            System.out.println("写入磁盘成功");

            System.out.println("读取中.................");
            fis =new FileInputStream("./resources/map.data");
            isr =new InputStreamReader(fis,"UTF8");
            StringBuffer sb = new StringBuffer();
            while (isr.ready()){
                sb.append((char) isr.read());
            }
            isr.close();
            fis.close();
            System.out.println("读取成功!");
           // String ss = sb.toString();
            String[] sb1 = sb.toString().split("\t");
            // 遍历读取出来的文件
            System.out.println("遍历读取出来的文件");
            for (int i = 0; i < sb1.length; i++) {
                System.out.print(sb1[i]+"\t");
            }
            System.out.println("字符串的长度为:"+sb1.length);
            // 读取出来的结果是字符串,要想转回为稀疏数组,就要把字符串转为数值
            // 重新定义一个稀疏数组
            int newSpareArr[][] = new int[sb1.length/3][3];
            // 稀疏数组第一行初始化
            newSpareArr[0][0]=Integer.parseInt(sb1[0]);
            newSpareArr[0][1]=Integer.parseInt(sb1[1]);
            newSpareArr[0][2]=Integer.parseInt(sb1[2]);

            // 从第四个值开始,给稀疏数组赋值
            int data = 0;
            for (int i = 3; i < sb1.length; i+=3) {
                data++;
                newSpareArr[data][0]=Integer.parseInt(sb1[i]);
                newSpareArr[data][1]=Integer.parseInt(sb1[i+1]);
                newSpareArr[data][2]=Integer.parseInt(sb1[i+2]);
            }
            // 遍历读出来的稀疏数组
            System.out.println("恢复后的稀疏数组...............");
            for (int i = 0; i < newSpareArr.length; i++) {
                    System.out.println(newSpareArr[i][0]+"\t"+newSpareArr[i][1]+"\t"+newSpareArr[0][2]);
            }
            // 将恢复后的稀疏数组转换为二维数组
            // 定义一个新的二维数组
            int chessNew[][] = new int[newSpareArr[0][0]][newSpareArr[0][1]];
            // 稀疏数组从第二行开始给新的二维数组赋值
            for (int i = 1; i < newSpareArr.length; i++) {
                chessNew[newSpareArr[i][0]][newSpareArr[i][1]]=newSpareArr[i][2];
            }

            // 遍历新的二维数组
            System.out.println("稀疏数组转二维数组................");
            for (int i = 0; i < chessNew.length; i++) {
                for (int j = 0; j < chessNew[i].length; j++) {
                    System.out.print(chessNew[i][j]+"\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Grafana 查询数据和转换数据

Grafana 系列文章&#xff0c;版本&#xff1a;OOS v9.3.1 Grafana 的介绍和安装Grafana监控大屏配置参数介绍&#xff08;一&#xff09;Grafana监控大屏配置参数介绍&#xff08;二&#xff09;Grafana监控大屏可视化图表Grafana 查询数据和转换数据 介绍 Grafana能够支持各…

微服务网关GateWay

在微服务架构下&#xff0c;网关的本质&#xff0c;其实就是对请求进行路由转发&#xff0c;在此基础上我们可以根据网关在整个微服务架构中的特殊位置&#xff0c;对请求进行前置和后置的处理。 请求转发和路由&#xff1a;网关类似于一个门面&#xff0c;微服务的组织细节对…

三维数字化开发管理中心

目录一、前言二、项目依赖2.1 后端2.2 前端三、快速运行3.1 启动后台服务3.2 启动前台页面四、使用手册4.1 登录4.2 首页4.3 资源中心4.4 在线预览4.5 三维开发4.6 信息管理4.6.1 用户信息4.6.2 模型信息4.7 个人中心五、数据库5.1 数据需求5.2 数据流图5.3 数据字典1&#xff…

马斯克辞任CEO,产品经理如何用项目协作软件武装自己?

自马斯克接管推特以来&#xff0c;已经发起了多轮裁员潮&#xff0c;仅第一波就裁掉了50%的员工。11月14日&#xff0c;马斯克开启第二波裁员。而IT之家12 月 21 日消息&#xff0c;埃隆・马斯克在推特发文对网友的投票结果做出回应&#xff0c;称会尽快找到一个足够傻的人来接…

蓝桥杯备赛Day3——基础数据结构(一维数组)

目录 数据结构 什么是数据结构? 《数据结构》教材一般包含 基础数据结构 最简单的数据结构——一维数组 一维数组的定义 一维变长数组 一维正向遍历 一维反向遍历 一维数组区间操作&#xff08;实际上就是切片操作&#xff09; 一维数组从a[1]开始赋值 一维数组的读…

热门项目披露:四川超声印制板有限公司100%股权转让

热门项目披露&#xff1a;四川超声印制板有限公司100%股权转让 项目推荐指数&#xff1a;&#xff1b;该项目由 北京产权交易所 发布&#xff0c;于2022年12月11日被塔米狗平台收录。 项目方 四川超声印制板有限公司&#xff0c; 成立于 1998年7月5日 &#xff0c; 注册资金 2…

Unity 3D Hierarchy 视图 || Unity 3D Project 视图

Unity 3D 的 Hierarchy 视图包含了每一个当前场景的所有游戏对象&#xff08; GameObject &#xff09;&#xff0c;如下图所示。 其中一些是资源文件的实例&#xff0c;如 3D 模型和其他预制物体&#xff08; Prefab &#xff09;的实例&#xff0c;可以在 Hierarchy 视图中选…

Mac 截图工具 iShot Pro - 软件介绍、下载安装详细教程

Mac 截图工具 iShot Pro -软件介绍、下载安装详细教程 iShot -优秀&#xff0c;功能齐全的区域截图&#xff0c;窗口截图&#xff0c;多窗口截图&#xff0c;长屏幕截图&#xff0c;shell截图&#xff0c;时间间隔截图&#xff0c;快速注释&#xff0c;纹理&#xff0c;颜色匹配…

虚拟专用网VPN(计算机网络-网络层)

目录 专用网络与专用地址 RFC 1918指明的专用地址 互连两个地点的专用网络 虚拟专用网VPN (Virtual Private Network) IP 隧道技术 VPN 的要点 专用网络与专用地址 世界上有很多机构有自己独立的网络&#xff0c;这些网络并不与因特网 互连&#xff0c;为该机构所专有&…

【LeetCode】有效的数独 [M](模拟)

36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 一、题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔…

国产CAE的涅槃-岩土行业高性能离散元软件MatDEM

作者 | 刘春博士 一、导读 2019年9月11日&#xff0c;ANSYS公司公开宣称&#xff1a;“收购LSTC公司&#xff0c;一举获得其旗下拥有LS-DYNA&#xff08;结构&流体&电磁的多物理场求解器&#xff09;、LS-PrePost&#xff08;前后处理器&#xff09;、LS-OPT/LS-TASC…

基于Web的文件管理系统,支持Office、WPS预览/编辑、在线解压缩、文件分享、文件加密、远程存储、远程文件推送、秒传、断点

基于Web的文件管理系统&#xff0c;支持权限管理、历史版本管理、Office预览/编辑、WPS预览/编辑、在线解压缩、文件分享、文件加密、远程存储、远程文件推送、秒传、断点续传、智能搜索、文件备注、本地自动备份、异地自动备份、一键迁移、集群部署。 主要应用场景&#xff1…

14_视图

1. 常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&…

STM32正点原子图片——显示实验

目录 一、图片显示部分 GIF piclib.c介绍 图像显示实验main.c介绍 二、SD卡模块 1、SD卡基础知识 2、SD卡读操作 3、SD卡写操作 一、图片显示部分 GIF GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在1987年开发的图像文件格式。GI…

敏捷价值流管理

对团队或企业来说&#xff0c;敏捷能够通过快速迭代、改进来更好地为客户或终端用户交付价值。但有些团队在引入敏捷项目管理模式之后&#xff0c;团队管理层看了看埋头工作的团队&#xff0c;“唉&#xff1f;团队的效率好像并没有提升啊&#xff0c;这不和以前一样吗……”在…

怎样给黑白照片上色?2个技能教你如何给黑白照片上色

大家看过长辈的黑白照片吗&#xff1f;最近我的爷爷翻出了几十年前的老照片&#xff0c;给我细细道来每张照片背后的故事。可惜那个年代的技术水平有限&#xff0c;没办法拍出好看的彩色照片。如今照片修复技术层层递进&#xff0c;我想借助一些图片处理软件&#xff0c;将这些…

Qt QCustomPlot 添加多个坐标系区域

Qt QCustomPlot 添加多个坐标系区域 文章目录Qt QCustomPlot 添加多个坐标系区域摘要1 新建多个坐标系QCPAxisQCPAxisRectQCPLayoutGrid2 多个坐标轴如何更新数据添加数据3 遇到的问题最后关键字&#xff1a; Debian、 Linux、 QCustomPlot、 Qt、 QCPAxisRect内容背景&#xf…

vue3的中间值思维

在用vue框架的开发的时候&#xff0c;经常使用到的一种中间值思维&#xff0c;什么是中间值思维&#xff0c;就是通过一个间接的属性去改变需要渲染的值 我们在传值的时候&#xff0c;如果是用的mitt传值&#xff0c;那传过来的值就是在bus.on函数中&#xff0c;我们就得取出来…

消息中间件RocketMQ快速入门

目录前言消息中间件需要解决哪些问题&#xff1f;Publish/SubscribeMessage PriorityMessage FilterBroker端消息过滤Consumer端消息过滤Message Persistence消息可靠性低延迟消息回溯消费消息堆积定时消息消息重试RocketMQ 物理部署结构RocketMQ 逻辑部署结构RocketMQ 数据存储…

Scala 基础函数

1.前言 为什么要学习Scala 分布式高并发语言Go、R、Erlang等等为何选择Scala&#xff1f; Spark是大数据处理的核心方式&#xff0c;用scala语言编写&#xff01; Kafka分布式发布订阅消息系统&#xff0c;由LinkedIn捐给Apache&#xff0c;以极高的吞吐量著称&#xff0c;是…