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

简介: 数据结构之特殊矩阵的压缩存储

前言


矩阵存储主要还是将线性代数矩阵性质存储到一维或是多维数组中,题目一般都是问在数组的下标是几和下标与矩阵系数的对应关系,对于这种题目画个图设置一个简单的参数代进选项中的公式验证就好了。


有不足之处或是不懂之处尽请评论区留言。

一、数组的存储方式

以一维数组A[0...n-1]为例,其存储结构关系式为:

gif.gif

其中L是每个数组元素所占的存储方式。

对于多维数组,有两种映射方法:按行优先和按列优先。


1.按行优先


设二维数组的行下标与列下标的范围分别为[0,h1]与[0,h2]。


gif.gif


1.按列优先

gif.gif


二、特殊矩阵的压缩存储


1.对称矩阵


76a3d761cede4b08b04b66c4af02e843.png


20180307142930261.png

很明显对于该矩阵a12与之对应相等的值是a21,也就是说可以二者同指向数组同一个下标便可压缩存储。那么我们只需要存储下三角的元素即可,上三角的元素只需要i,j互换就好了,因此元素下标之间的对应关系如下:

20150329215829182.png



2.三角矩阵


对于下三角矩阵:

494bbf6661a94af9963b1d70dda5fa59.png


根据等差数列前n行的元素为i*(i+1)/2,与下标我们需除去自身一行,既i=i-1.


78b0ae1e8d15423e8df7afc0da204cb5.png



对于上三角矩阵:


d506c4ebf9dd4fb2bc4489f208c2e5ea.png

与下三角矩阵相反,为n+n-1+...+1.

第i-1行有n-i+2个元素。

8278955ea35b41299a06672316acb8a4.png



3.三对角矩阵


在三对角矩阵中,所有非零元素都集中在主对角线为中心的3条对角线的区域,其他区域的元素都为零。


c0e6800db09542fcbe1172a8a2409d1b.png


由此可以计算矩阵A三条对角线的元素a_{i,j}在一维数组B中存放的下标为:


gif.gif

公式不推荐背,因为真的很好算,画个图思路痕清晰。


4.稀疏矩阵


矩阵中非零元素个数x,而整个矩阵中总元素个数为t,则当S=x/t\leq 0.05时称为稀疏矩阵。

稀疏矩阵的三元组既可以采用数组存储:

a027fa3c150f4f6d8941b3f866139b04.png

也可以采用十字链表法存储:



20200209210236475.jpg


目录
相关文章
|
12月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
183 4
|
10月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
293 10
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
883 9
|
12月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
12月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
243 59
|
5月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
79 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。

热门文章

最新文章

下一篇
开通oss服务