JAVA算法数据结构第一节稀疏矩阵

news2024/11/23 23:31:14

一、稀疏矩阵介绍:

稀疏矩阵是一种特殊类型的矩阵,其中大部分元素都是零。在处理这类矩阵时,如果仍然使用标准的矩阵存储方式(即传统的二维数组),则会浪费大量的存储空间来保存零值。为了提高存储效率以及在某些情况下提高计算效率,人们发明了稀疏矩阵的概念及其相应的存储方法。

稀疏矩阵的特点

  • 高零值比例:矩阵中的零元素远多于非零元素。
  • 节省空间:只存储非零元素,减少不必要的内存占用。
  • 优化运算:在进行矩阵运算时,可以跳过与零相关的计算,从而加快计算速度。

二、稀疏矩阵代码实现:

1)原始二维代码: 

  //创建一个原始的二维数组9*9
        //0:表示没有棋子,1:表示黑子,2:表示白子
        int[][] ints = new int[9][9];

        ints[1][2]=1;
        ints[2][4]=2;

        //输出原始二维数组
        for (int[] row:ints){
            for (int data:row){
                System.out.print(data+"\t");
            }
            System.out.println();
        }

输出结果:

 

创建如图9*9的二维矩阵。

2)、将二维矩阵转化成稀疏矩阵:

  //创建对应稀疏矩阵
        int[][] xishu = new int[sum + 1][3];
        //给稀疏矩阵赋值
        xishu[0][0]=9;
        xishu[0][1]=9;
        xishu[0][2]=sum;
      //遍历二维数组,将非零值存放到xishu中
        int count=0;//用于记录是第几个非零数据
        for (int i=0;i<9;i++){
            for (int j=0;j<9;j++){
                if (ints[i][j]!=0){
                   count++;
                   xishu[count][0]=i;
                    xishu[count][1]=j;
                    xishu[count][2]=ints[i][j];
                }
            }
        }
      //输出稀疏数组的形式
        System.out.println("----------稀疏数组为---------");
        for (int i=0;i < xishu.length;i++){
            System.out.println(xishu[i][0]+"  "+xishu[i][1]+"  "+xishu[i][2]);
        }

输出结果:

 

3)、将稀疏矩阵转化为 二维矩阵:

   //读取稀疏数组第一行,根据第一行创建原始的二维数组
        int[][] huifus = new int[xishu[0][0]][xishu[0][1]];
      //读取稀疏数组后几行的数据并赋给原始二维数组即可
        //这里是要遍历稀疏矩阵的值而不是恢复矩阵
        for (int k=1;k< xishu.length;k++){
        huifus[xishu[k][0]][xishu[k][1]]=xishu[k][2];
        }
        System.out.println("---------恢复的二维矩阵-------");
        for (int[] row:huifus){
            for (int data:row){
                System.out.print(data+"\t");
            }
            System.out.println();
        }

输出结果:

 

三、完整代码:

//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class Main {
    public static void main(String[] args) {
        //创建一个原始的二维数组9*9
        //0:表示没有棋子,1:表示黑子,2:表示白子
        int[][] ints = new int[9][9];

        ints[1][2]=1;
        ints[2][4]=2;

        //输出原始二维数组
        for (int[] row:ints){
            for (int data:row){
                System.out.print(data+"\t");
            }
            System.out.println();
        }
//将二维数组 转 稀疏数组的思想
        //1.先遍历二维数组 得到非零数据的个数
        int sum=0;
        for (int i=0;i<9;i++){
            for (int j=0;j<9;j++){
                if (ints[i][j]!=0){
                    sum++;
                }
            }
        }
       //创建对应稀疏矩阵
        int[][] xishu = new int[sum + 1][3];
        //给稀疏矩阵赋值
        xishu[0][0]=9;
        xishu[0][1]=9;
        xishu[0][2]=sum;
      //遍历二维数组,将非零值存放到xishu中
        int count=0;//用于记录是第几个非零数据
        for (int i=0;i<9;i++){
            for (int j=0;j<9;j++){
                if (ints[i][j]!=0){
                   count++;
                   xishu[count][0]=i;
                    xishu[count][1]=j;
                    xishu[count][2]=ints[i][j];
                }
            }
        }
      //输出稀疏数组的形式
        System.out.println("----------稀疏数组为---------");
        for (int i=0;i < xishu.length;i++){
            System.out.println(xishu[i][0]+"  "+xishu[i][1]+"  "+xishu[i][2]);
        }



        //读取稀疏数组第一行,根据第一行创建原始的二维数组
        int[][] huifus = new int[xishu[0][0]][xishu[0][1]];
      //读取稀疏数组后几行的数据并赋给原始二维数组即可
        //这里是要遍历稀疏矩阵的值而不是恢复矩阵
        for (int k=1;k< xishu.length;k++){
        huifus[xishu[k][0]][xishu[k][1]]=xishu[k][2];
        }
        System.out.println("---------恢复的二维矩阵-------");
        for (int[] row:huifus){
            for (int data:row){
                System.out.print(data+"\t");
            }
            System.out.println();
        }

    }
}

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

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

相关文章

9.12 TFTP通信

客户端设计&#xff08;仅供参考&#xff09;&#xff1a; 下载本质&#xff1a;读取服务器发送的数据包&#xff0c;写入到本地文件 上传本质&#xff1a;读取本地文件内容&#xff0c;发送给服务器。 1、建立菜单选项&#xff0c;上传和下载。 2、上传功能函数&#xff1a; …

实用类工具!分享6款AI论文一键生成器免费8000字

在当前的学术研究和写作领域&#xff0c;AI论文生成工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。千笔-AIPassPaper是一款备受推荐的AI论文一键生成器。 千笔-AIPassPaper是一个一站式…

centos更改静态ip

点击网络和internet设置 点击更改适配器 、点击属性

15.8 在k8s部署prometheus statefulset

本节重点介绍 : 检查&#xff0c;kube-system ns [rootprome-master01 prometheus]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-7d75679df-7f7tx 1/1 Running 0 88m coredns-7d75679df-qmzbg 1/1 Running 0 88m etcd-prome-master01 1/1 Runni…

实习期间git的分枝管理以及最常用的命令

各位找工作实习的友友在工作之前一定要把git的相关知识掌握呀&#xff0c;我实现期间被leader说过关于git规范的相关问题了 目前已更新系列&#xff1a; 当前&#xff1a;:实习期间git的分枝管理以及最常用的命令 Redis高级-----持久化AOF、RDB原理 Redis高级---面试总结5种…

[网络]http请求中的URL,方法,header 和 http响应中的状态码

文章目录 一. http请求1. 认识URLurlencode 2. 认识方法应用场景构造http请求 2. 认识请求报头header 二. http响应1. 状态码 一. http请求 1. 认识URL 我们所说的"网址", 其实就是URL(Uniform Resource Locator 统⼀资源定位符) 1.协议方案名 常见的有http和http…

微信小程序----日期时间选择器(自定义时间精确到分秒)

目录 页面效果 代码实现 注意事项 页面效果 代码实现 js Component({/*** 组件的属性列表*/properties: {pickerShow: {type: Boolean,},config: Object,},/*** 组件的初始数据*/data: {pickerReady: false,// pickerShow:true// limitStartTime: new Date().getTime()-…

Acrobat 9 安装教程

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

MySQL高可用配置及故障切换

目录 引言 一、MHA简介 1.1 什么是MHA&#xff08;MasterHigh Availability&#xff09; 1.2 MHA的组成 1.3 MHA的特点 1.4 MHA工作原理 二、搭建MySQL MHA 2.1 实验思路 2.2 实验环境 1、关闭防火墙和安全增强系统 2、修改三台服务器节点的主机名 2.3 实验搭建 1、…

庆祝中华人民共和国成立75周年答题活

为庆祝中华人民共和国成立75周年&#xff0c;弘扬爱国主义精神&#xff0c;激发广大党员干部和人民群众奋进新征程、建功新时代&#xff0c;奋力推进中国式现代化建设的爱国热情&#xff0c;“学习强国”学习平台采用“线上答题线下竞赛”的形式&#xff0c;举办“学习强国 强国…

数据结构、STL

排序 直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、基数排序、外部排序 算法稳定性&#xff1a;稳定的&#xff1a;关键字相同的元素在排序后相对位置不变 不稳定&#xff1a;相对位置变化了就是不稳定 排序算法&#xff1a;内部排序和外部排序 …

OrionX vGPU 研发测试场景下最佳实践之CodeServer模式

在之前的文章中&#xff0c;我们讲述了OrionX vGPU基于SSH模式、以及Jupyter模式下的最佳实践&#xff08;文末附回顾链接~&#xff09;&#xff0c;今天&#xff0c;让我们走进CodeServer模式的最佳实践。 • CodeServer模式&#xff1a;微软的VSCode的服务器版本&#xff0c;…

匿名管道详解

进程间通讯的目的 数据传输&#xff1a;一个进程需要把它的数据发送给另一个数据资源共享&#xff1a;多个进程需要共享同样的资源通知事件&#xff1a;一个进程需要向另一个或者一组进程发送消息&#xff0c;通知它发生了某种事件&#xff08;如进程终止时要通知父进程&#…

Python数据分析-Steam 收入排名前 1500 的游戏

一、研究背景 随着全球数字化进程的加速&#xff0c;电子游戏产业已成为全球娱乐产业的重要组成部分&#xff0c;吸引了越来越多的资本与消费者关注。特别是基于互联网的游戏平台&#xff0c;如Steam&#xff0c;已成为全球范围内发行和销售游戏的重要渠道。Steam平台不仅为玩…

高通Liunx 系统镜像编译

本文将会介绍如何在编译高通Liunx代码, 具体可以在高通 Linux | 高通下查看相关信息。 编译服务器配置 首先&#xff0c;准备一台Ubuntu 22.04版本主机或者服务器 1&#xff0c;编译Yocto 系统&#xff0c;需要如下一些配置 sudo apt update sudo apt install repo gawk wg…

钢轨缺陷检测-目标检测数据集(包括VOC格式、YOLO格式)

钢轨缺陷检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1h7Dc0MiiRgtd7524cBUOFQ?pwdfr9y 提取码&#xff1a;fr9y 数据集信息介绍&#xff1a; 共有 1493 张图像和一一对应的标注文件 标…

STM32—I2C

1.I2C I2C总线(Inter l0 BUs)是由Philips公司开发的一种通用数据总线两根通信线:SCL(Serial Clock)、SDA(Serial Data)同步&#xff0c;半双工带数据应答支持总线挂载多设备(一主多从、多主多从) MPU6050模块&#xff1a;可以进行姿态测量&#xff0c;使用了12C通信协议 第3个…

IAPP发布《2024年人工智能治理实践报告》

文章目录 前言一、黑箱问题►透明度、可理解性与可解释性二、法律和政策中的注意事项►欧盟的《通用数据保护条例》►欧盟的AI法案►NIST的AI风险管理框架►美国的第14110号行政命令►《生成式人工智能服务管理暂行办法》►新加坡的AI验证三、实施人工智能治理►模型卡与系统卡…

2023高教社杯全国大学生数学建模竞赛C题 Python代码演示

目录 问题一1.1 蔬菜类商品不同品类或不同单品之间可能存在一定的关联关系&#xff0c;请分析蔬菜各品类及单品销售量的分布规律及相互关系。数据预处理数据合并提取年、月、日信息对蔬菜的各品类按月求销量均值 季节性时间序列分解STL分解加法分解乘法分解 ARIMALSTM import p…

热成像目标检测数据集

热成像目标检测数据集 V2 版本 项目背景 热成像技术因其在安防监控、夜间巡逻、消防救援等领域的独特优势而受到重视。本数据集旨在提供高质量的热成像图像及其对应的可见光图像&#xff0c;支持热成像目标检测的研究与应用。 数据集概述 名称&#xff1a;热成像目标检测数据…