第 1 章之:下三角矩阵元素存储位置计算

声明:文章为博主原创,转载请联系博主。文章若有错误和疏漏之处,还望大家不吝赐教!
                                               第一章:数据结构与算法基础

===========================================================
本章重点内容为:
1.数据结构基础与线性表:下三角矩阵元素存储位置计算、队列的特性应用、栈的特性应用
2.广义表:无
3.树:二叉树的特性、二叉树的遍历、哈夫曼树
4.图:边与顶点的关系
5.查找与排序:折半查找、基数排序算法以及这些算法的性能分析
6.算法基础知识:时间复杂度分析
===========================================================
本篇文章主要介绍下三角矩阵元素存储位置计算

一. 概念介绍
首先,我们应该明确一点:为什么要计算下三角矩阵的元素存储位置?答案是,这一切都是为了矩阵
的压缩存储。在我们存储矩阵数据时,为了节省存储空间,我们会对下面两种矩阵进行压缩存储:
1.对称矩阵:即以主(副)对角线为界,两边三角区域中元素严格对称的矩阵。
2.三角矩阵:即以主(副)对角线为界,两边三角区域一边为单一元素的矩阵。
例如:
     

二. 压缩算法
大致思路:
1. 对于对称矩阵,我们可以只存储下三角矩阵的元素和对角线上的元素,然后交换下三角矩阵的横纵
    坐标便可以得到下三角矩阵对称区域的元素。
2. 对于三角矩阵,由于上三角区域的元素值都是相同的,我们只存储下三角区域和对角线上的元素即
    可,上三角矩阵的元素用一个数值存储就可以。

由上可知,无论是对称矩阵,还是三角矩阵,对它们进行压缩的基础都是如何对下三角区域的矩阵进
行存储
(上三角矩阵存储和下三角矩阵相反,故只介绍下三角矩阵存储 )。了解了算法思路以后,我们
来看下三角矩阵到底是如何进行存储的。

三. 下三角矩阵的存储
由于存储单元为线性结构,所以我们将矩阵中的元素以一维数组的形式存储起来。我们以上面的对称
矩阵为例,我们要存储的数据实际上是下面左图中的部分,我们的目的是将左边这部分数据转化成右
边一维数组的形式存储起来:
 
也就是说,我们要将左边矩阵元素的坐标 [i,j] 转换为右边一维数组元素的坐标[k],如何转换?通过观
察我们发现:k实际上等于元素(i,j)前面的元素个数,即:
k = (i,j)前面元素的数目
(i,j)前面元素的数目可以分为两部分来计算:
(1) 元素(i,j)所在行前面所有行元素的数目;
(2) 元素(i,j)所在行中,它前面元素的个数。

下面我们将这两部分分开来计算:
(1) 元素(i,j)所在行前面所有元素的数目:
     这部分可以用等差数列来计算:个数 = [(首项+尾项)*项数]/2 = [(1+(i-1))*(i-1)]/2 = i(i-1)/2
     解释:首项:显然,首项只有一个元素;尾项:尾项为第(i-1)行元素的个数,由于是n阶矩阵,所
                以第(i-1)行元素个数为(i-1)个;项数:一共要把从1到第(i-1)行的元素相加,故项数为(i-1)
(2) 元素(i,j)所在行中,它前面元素的个数:
      这个很容易计算,用该元素列坐标减1即可,即: 个数 = (j-1)

将上面两部分相加,便可以得到下三角矩阵元素存储位置k = i(i-1)/2+j-1, 其中( i >= j )
另外:上三角部分计算方式与下三角部分一致,由于元素对称 ,直接交换 i ,j 顺序即可。但是要注意
交换的范围:即只有在(i<j)时才需要交换。

总结:
下三角矩阵元素存储位置:
k = i(i-1)/2+j-1,( i >= j )
对称矩阵元素存储位置:
下三角部分:k = i(i-1)/2+j-1,( i >= j )
上三角部分:k = j(j-1)/2+i-1,( i < j )

三角矩阵元素存储位置:
下三角部分:k = i(i-1)/2+j-1,( i >= j )
上三角部分:k = n(1+n)/2,( i < j )

解释:在三角矩阵中,上三角部分元素的值都是相同的,所以只用一个存储位置将其存放在下三角所
有元素之后即可。下三角元素共有 S = (1+n)n/2 个,所以上三角元素占据第 (S+1) 个位置,而一维
数组计数从0开始,所以上三角部分元素的位置为 S = (1+n)n/2

其他类型如上三角矩阵的元素位置计算与下三角矩阵类似,不再赘述,详细可参考下面这篇文章:
数据结构----三角矩阵压缩存储中下标的计算_SWEENEY_HE的博客-CSDN博客_数据结构三角矩阵

  • 26
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值