特殊矩阵的压缩存储(下)

特殊矩阵的压缩存储 特殊矩阵的主要形式有:(1)对称矩阵(2)上三角矩阵/下三角矩阵(3)对角矩阵它们都是方阵,即行数和列数相同。一、对称矩阵的压缩存储     若一个n阶方阵A[n][n]中的元素满足a i,j=a j,i(0≤i,j≤n-1),则称其为n阶对称矩阵。由于对称矩阵中的元素关于主对角线对称,因此在存储时可只存储对称矩阵中上三角或下三角中的元素,使得对称的元素共享一个存储空间。这样,就可以将n2个元素压... 阅读详情

概述:主要是实现稀疏矩阵的三元组存储和十字链表存储

稀疏矩阵:稀疏矩阵是指矩阵中非零元素个数远远小于矩阵元素总数,且分布没有规律的矩阵。

a.三元组存储
    三元组的存储原则是指存储非零元素,包括元素的位置和值。

b.十字矩阵存储
    当稀疏矩阵的元素个数和位置经常发生变化时,不宜采用三元组存储,应该采用链式存储,在十字链表中,除了存储结点本身的信息(位置、值),还存储了指向当前行的下一个非零元素的指针(right域)和当前列的下一个非零元素的指针(down域)
    
    从十字链表的定义中可以发现,至少需要一个数组存储每一行或者每一列的头节点。

实现:

三元组节点类:

public class TripleNode {
    private int row; // 行
    private int col; // 列
    private int value; // 值

    public TripleNode() {
        this(0, 0, 0);
    }

    public TripleNode(int row, int col, int value) {
        this.row = row;
        this.col = col;
        this.value = value;
    }

    public int getRow() {
        return row;
    }
    public void setRow(int row) {
        this.row = row;
    }

    public int getCol() {
        return col;
    }

    public void setCol(int col) {
        this.col = col;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

十字矩阵节点类:

public class OLNode {
    private int row;
    private int col;
    private int value;
    private OLNode right;
    private OLNode down;

    public OLNode(int row, int col, int value) {
        super();
        this.row = row;
        this.col = col;
        this.value = value;
    }

    public int getRow() {
        return row;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public int getCol() {
        return col;
    }

    public void setCol(int col) {
        this.col = col;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public OLNode getRight() {
        return right;
    }

    public void setRight(OLNode right) {
        this.right = right;
    }

    public OLNode getDown() {
        return down;
    }

    public void setDown(OLNode down) {
        this.down = down;
    }
}

十字链表中用于返回行和列头节点数组的类:

public class RowAndColHeadNode {
    private OLNode[] rowHead;
    private OLNode[] colHead;

    public RowAndColHeadNode(OLNode[] rowHead, OLNode[] colHead) {
        super();
        this.rowHead = rowHead;
        this.colHead = colHead;
    }

    public OLNode[] getRowHead() {
        return rowHead;
    }

    public void setRowHead(OLNode[] rowHead) {
        this.rowHead = rowHead;
    }

    public OLNode[] getColHead() {
        return colHead;
    }

    public void setColHead(OLNode[] colHead) {
        this.colHead = colHead;
    }
}

获取三元组和十字链表的类:

public class Matrix {
    private int rows;
    private int cols;
    private int values;

    private OLNode[] rowHead;
    private OLNode[] colHead;

    public Matrix() {
        rows = 0;
        cols = 0;
        values = 0;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getCols() {
        return cols;
    }

    public void setCols(int cols) {
        this.cols = cols;
    }

    public int getValues() {
        return values;
    }

    public void setValues(int values) {
        this.values = values;
    }

    public OLNode[] getRowHead() {
        return rowHead;
    }

    public void setRowHead(OLNode[] rowHead) {
        this.rowHead = rowHead;
    }

    public OLNode[] getColHead() {
        return colHead;
    }

    public void setColHead(OLNode[] colHead) {
        this.colHead = colHead;
    }

    /**
     * 根据入参的稀疏矩阵输出对应的三元组
     * 
     * @param mat
     *            稀疏矩阵
     * @return 三元组
     */
    public TripleNode[] getTripleArray(int[][] mat) {
        setParam(mat);
        TripleNode[] tripleNode = new TripleNode[values];
        int k = 0;

        for (int i = 0; i < cols; i++) {
            for (int j = 0; j < rows; j++) {
                if (mat[i][j] != 0) {
                    tripleNode[k] = new TripleNode(i, j, mat[i][j]);
                    k++;
                }
            }
        }

        return tripleNode;
    }

    /**
     * 设置总行数和非零元素总数
     * 
     * @param mat
     *            稀疏矩阵
     */
    private void setParam(int[][] mat) {
        for (int[] i : mat) {
            for (int j : i) {
                if (j != 0) {
                    values++;
                }
            }
        }
        rows = mat.length;
        cols = mat[0].length;
    }

    /**
     * 初始化头节点数组
     */
    private void initHeadNodeArray() {
        rowHead = new OLNode[rows];
        colHead = new OLNode[cols];
        // 初始化行头节点数组
        for (int i = 0; i < rows; i++) {
            rowHead[i] = new OLNode(i, -1, 0);
        }

        // 初始化列头节点数组
        for (int i = 0; i < cols; i++) {
            colHead[i] = new OLNode(-1, i, 0);
        }
    }

    /**
     * 插入节点
     * 
     * @param row
     *            行号
     * @param col
     *            列号
     * @param value
     *            节点值
     */
    private void insertNode(int row, int col, int value) {
        OLNode node = new OLNode(row, col, value);

        OLNode pRow = rowHead[row];
        OLNode pCol = colHead[col];
        // 设置横向的链表
        while (pRow.getRight() != null) {
            pRow = pRow.getRight();
        }
        pRow.setRight(node);

        // 设置纵向的链表
        while (pCol.getDown() != null) {
            pCol = pCol.getDown();
        }
        pCol.setDown(node);
    }

    /**
     * 根据入参的稀疏矩阵输出对应的十字链表
     * 
     * @param mat
     *            稀疏矩阵
     * @return 十字链表
     */
    public RowAndColHeadNode getCrossList(int[][] mat) {
        setParam(mat);
        initHeadNodeArray();

        for (int i = 0; i < cols; i++) {
            for (int j = 0; j < rows; j++) {
                if (mat[i][j] != 0) {
                    insertNode(i, j, mat[i][j]);
                }
            }
        }

        return new RowAndColHeadNode(rowHead, colHead);
    }
}

 

【考研】数据结构——特殊矩阵的压缩存储(含真题) 本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解学习所得心得、笔记整理和总结。本文主要以举例子的方式讲解考研选择题型中的特殊矩阵的压缩存储知识点,配以图文(含408真题)。【2023考研】数据结构常考应用典型例题(含真题)_住在阳光的心里的博客-优快云博客。 阅读详情

相关推荐

特殊矩阵的压缩存储(详细版 通俗易懂 含c语言稀疏矩阵十字链表代码 )

前言 此文章是本人第一篇博客,目的在于巩固过去所学的知识,同时可能会给大家带来一丝丝帮助,但由于没有经验加上本人能力极其有限,文章中可能存在不足之处,还请读者能够指正(`・ω・´)。 这篇文章首先会介绍矩阵压缩存储和特殊矩阵的基本概念,然后将会比较详细地说明几种特殊的矩阵:对称矩阵、三角矩阵、带状矩阵(三对角矩阵)、稀疏矩阵的压缩存储的策略,包括定量计算和十字链表的c语言代码,让我们开始吧! 注意,本文所用数组下标均为从0开始 正文 一.基本概念 压缩存储 在一个矩阵中,若多个数据的值相同,为

亿维数组's博客 5737

jdbc获取结果行数_在Java中,获得ResultSet的总行数与总列数

第一种:利用ResultSet的getRow方法来获得ResultSet的总行数Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrset=stmt.executeQuery("select*fromyourTableN...

weixin_39912580的博客 1192

特殊矩阵的压缩存储算法2

编写一个程序,实现对称矩阵、上(下)三角矩阵、三对角矩阵的压缩存储,要求具有如下功能: (1)输入:以行序为主序输入矩阵的全部元素,压缩存储于一维数组中。 (2)输出:顺序输出压缩存储于一维数组中的矩阵元素。 (3)简单算术运算:利用压缩存储的数据实现两个特殊矩阵(属于同一类特殊矩阵)的加法运算,并输出运算结果。

Java实现俄罗斯方块小游戏。(附完整源代码)

大家好,我是百思不得小赵。 创作时间:2022 年 5 月 12 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入优快云的第1167天。觉得有帮助麻烦👏点赞、🍀评论、❤️收藏 目录 一、游戏背景 二、功能实现 三、效果展示 四、总结 一、游戏背景 二、功能实现 三、效果展示 四、总结 Github链接地址:点击获取完整源代码,下载到本地即可运行 ...

我这么骄傲的一个人。 4万+

特殊矩阵和压缩存储

这是关于几种特殊矩阵的压缩存储,包括上、下三角矩阵、对称矩阵、正交矩阵

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

WebDriver高级应用实例(9)

  9.1封装操作表格的公用类   目的:能够使自己编写操作表格的公用类,并基于公用类进行表格中的元素的各类操作   被测网页的网址的HTML代码:    <html> <body> <table width="400" border="1" id="table"> <tr> ...

weixin_30439031的博客 139

AI视频生成成本优化实战:混合架构与硬件选型

AI视频生成技术正面临效果与成本的二元博弈,其核心挑战在于高昂的推理算力消耗与黑箱服务的不确定性。从技术原理看,视频生成依赖扩散模型等深度学习架构,通过多轮迭代实现像素级合成,这导致GPU显存占用和电力消耗呈指数级增长。在工程实践中,采用混合推理架构能有效平衡成本与质量,例如云端处理关键帧配合本地渲染过渡帧,实测可降低58%支出。硬件选型方面,消费级显卡魔改与边缘计算设备为中小企业提供了可行方案,如RTX 3090显存扩容或Jetson AGX边缘部署。当前AI视频应用已渗透电商直播、新闻制作等领域,但需警

weixin_29531177的博客 295

数据结构之三元组

三元组 三元组是什么? 三元组是用来存储稀疏矩阵的一种压缩方式。 那么为什么会用到三元组? 二维数组表示的稀疏矩阵有着大量0存在,而这些0造成了大量的内存浪费,是我们的忽略对象(实际应用加密解密中可以使用其他我们用不到的数来进行混淆)。 ...

qq_24312793的博客 1万+

YOLO11数据增强中的色彩空间变换:HSV、YUV等增强技术的原理、实现与参数调优全解析

摘要 本文介绍了色彩空间的基本概念及其在数据增强中的应用,重点分析了HSV色彩空间的原理与特性。色彩空间作为颜色表示的数学模型,在计算机视觉中具有重要作用,RGB、HSV、YUV等常用色彩空间各有特点。数据增强中的色彩变换能提升模型鲁棒性、缓解数据不平衡并防止过拟合。HSV色彩空间将颜色分为色调(H)、饱和度(S)和明度(V)三个独立分量,更符合人类视觉感知,便于针对性调整图像属性。文章详细阐述了HSV与RGB的转换公式,为YOLO11等目标检测框架的数据增强提供了理论基础。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 288

在 Fiori Elements Object Page 的表格中用 UI.Hidden 隐藏列:语义、边界与落地实践全解析

摘要: Fiori Elements的Object Page表格中,UI.Hidden注解支持静态和动态隐藏列。动态隐藏分为两种:基于父实体属性隐藏整列,或基于子实体属性按行隐藏单元格。关键约束包括:支持服务端操作的列禁止使用动态隐藏,否则会导致UX不一致。ABAP CDS不支持路径式UI.Hidden,需改用XML注解。该功能需与UI.Importance、个性化等机制明确区分,避免混淆。对于可能参与排序/过滤的列,建议仅使用静态隐藏。实际应用中需注意注解位置(整列或单元格级)和业务场景的匹配。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 205

特殊矩阵的压缩存储(数组下标从0开始存储)

www.shengrizhufuyu.cn 用一维数组压缩存储 对称矩阵 对称矩阵的特点: a[i][j] = a[j][i] a[i][j] 是 第 i+1 行、第 j+1列 的元素 如何压缩存储? 只存储下三角部分的元素 从a[0][0] 开始,把每行元素都依次存储进一维数组 存储时:a[i][j] 在一维数组 A[ ]中的下标就是该元素前面元素的个数:k= i×(......

beOkWithAnything 8736

Python经典编程习题100例:第32例:相反顺序输出列表

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 按相反的顺序输出列表的值。 解题思路: > 利用reverse函数逆序 代码: arr=['f','g','e','b'] print(arr) arr.reverse() print(arr) ...

优快云 精品推荐 1416

【数据结构】特殊矩阵的压缩存储

💯矩阵的压缩存储:特殊矩阵有对称矩阵,三角矩阵,三对角矩阵,稀疏矩阵,数组是由n个相同类型的数据元素所构成的有限序列数组是线性表的推广:一维数组可以看做是一个线性表,而对于二维数组而言,可以看成是有多个线性表组成的线性表也就是每一行列视都为一个线性表,总的线性表内每一个元素也是一个定长的线性表。

DAY I 的成长之路 4456

Mathematica 训练课(12)常用注释方法

Mathematica从入门到进阶

qq_25018077的博客 9075

【导航理论&实战篇】四足机器人弹簧倒立摆(SLIP)动力学模型

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对四足机器人动力学模型-VMC、SLIP和浮动机体模型做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章四足机器人弹簧加载倒立摆(SLIP)动力学模型是一种用于描述和分析四足机器人在运动过程中动态特性的理论模型。这种模型将四足机器人的腿部简化为弹簧,而机器人的身体则被视为一个倒立摆,这样的抽象使得研究者能够更容易地分析和控制机器人的运动。提示:以下是本篇文章正文内容。

qq_35635374的博客 806

特殊矩阵的压缩存储(公式详解)

在数据结构中需要考虑如何将矩阵更有效地存储在内存中,并能方便地提取矩阵中的元素。本文分析了如何将对称矩阵、三角矩阵以及三对角矩阵压缩至一维数组中,并对部分公式进行了分析和推导。

kusunoki的博客 4886

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 443

【数据结构】特殊矩阵的压缩存储|保姆级详解+图解

在线性代数这门学科中已经学习了矩阵。在高级计算机语言中,矩阵常用二维数组表示。所谓**“压缩存储”**,目的在于节省空间!体现在,为多个值相同的元素只分配一个存储空间,多元素值为0的元素不分配空间二维数组A[n][n]和的写法是等价的。如果数组写法为,则说明指定了下标是从1开始存储元素。二维数组元素写为a[i][j],注意数组元素下标i和j通常是从0开始的。矩阵元素通常写为a i,j或者a(i),(j),注意这时的i和j代表的行号和列号,都是从1开始的!这里我们讨论两种特殊矩阵。

Yaoyao2024的博客 9638

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【数据结构】特别篇:特殊矩阵的压缩存储

前面共存储有 1 + 2 + 3 + 4 + 5 + 6 + 1 = 22 个元素 ( 数组下标范围为0 ~ 21 ),注意数组下标从 0 开始,故。n(n+1)/2+1] 中,则存放到 B[k] 中的非零元素。+ (n - j + 2) = (j-1)(2n - j + 2) / 2 个元素,,矩阵 M 的第一行有 12 元素,第二行有 11 个,第三行有 10 个,第四行有 9 个,第五行有 8 个,所以。共有 1 + 2 + 3 + …n(n+1)/2+1] 中, 则存放到B[k] 中的非零元素。

关注:https://github.com/Suhan42 1747

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【数据结构】特殊矩阵的压缩存储——对称矩阵、三角矩阵、稀疏矩阵……

【数据结构】第三章——栈、队列与数组 详细介绍特殊矩阵在内存中的压缩存储……

蒙奇D索大的博客 1919

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 特殊矩阵的压缩存储(上)
下一篇: 有序链表的合并的一种实现
java_t_t
博客等级 码龄9年 171粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值