数据结构-上三角矩阵存储方式[0知识掌握]

目标:看完本文章你将会了解上三角矩阵的存储方式以及矩阵中数据的位置索引号如何求

难点:上三角矩阵的公式推导,上三角任意位置对应的存储位置。

一、准备知识

1.求和公式

前n项和:Sn = n(a1+an)/2 

公差:d=后项-前项

项次:有多少个数需要求和,能表示出项次即可,矩阵中可能n表示项次,也可能n-1,或i-1只是形式不同而已。项次是比较核心,注意结合后续矩阵理解它的定位。

an项如何求:an=a1+(n-1)d,    这是求n项实际对应具体的数据,使用该公式即可。

2.内存存储地址如何编号

内存地址以1个字节为单位,1个字节8位,对应一个地址。比如int a = 8; 实际占用4个字节,即有4个地址,如果取a地址,&a取到的只是首地址,知道首地址,那么结束在什么地方,即根据int计算,int占用4个字节,如果首地址是2001,那么2001-2004位该整型的存储空,实际可使用的地址只是2001,其它三个地址被int屏蔽为不可见,如果非要去取2002能取到吗,直接用指针+1是无法获取到的。因为+1,实际到2005, 感兴趣的可以思考,如何去取2002,此处不讨论这个。

二、上三角矩阵

        

对角线上半部分是不同的数据,对角线下半部分数据相同所以用一个存储空间存储即可。

(一)数据存储:使用顺序存储,将该矩阵数据存储一维数组中,可以用静态分配或动态分配。

静态分配:比如矩阵中都是int,  声明数组int S[m];  数组大小m=矩阵中的所有数据,

矩阵上半部分数据:n,n-1,n-2,n-3,.... 1,  使用求和公式 n(n+1)/2 得出总的数据量
矩阵下半部分:1个    
总数的数据:m=n(n+1)/2+1, 上半部分数据量+下半部分数据量。m=11

动态分配:实际上一样,即int *S = (int *)malloc(m*sizeof(int)).  m=11。

本例使用静态分配,分配完成后,这样即获得了内存的空间,以行序方式进行矩阵的存储。
分配后的对应关系如下

数据: a11 a12 a13 a14 a22 a23 a24 a33 a34 a44  C ....n
索引:   0     1     2     3     4     5    6      7     8     9   10....m
现在想知道a44的存储索引,如何计算。

1.要知道a44的位置,需要知道a44前面有多少数据,可以观察他们的关系是
n,n-1,n-2...  a44,  比如a44是i行,那么去除a44本身求和即求n,n-1,n-2,......i-1的和,
注意为什么是i-1,i-1表示的是矩阵中项次对应的数据,实际可以理解成是只知道项次而不知道具体对应的数值,是需要求出来的,如果求出了i-1项次对应的实际数据,那么a44前n项和就很简单了,可根据公式am=a1+(m-1)d求值,通过观察公差d是-1,a1是n,m=i-1项次, 得出ai-1=n+(i-1-1)*-1=n-i+2;
所以i-1项次的数据就是n-i+2;a1=n,知道首项、末项、项次,直接带入求和公式
(i-1)(n+n-i+2)/2 =(i-1)(2n-i+2)/2,此时项次i-1=a44的前n项和或者说前面有多少元素就算出来了。后面在加上j-i+1,即可算出当前a44所在的位置。

存储位置或即下标索引k=(i-1)(2n-i+2)/2+j-i+1 = 10,因为数组下标是从0开始所以在-1实际是k=9

      

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
上三角矩阵是指在矩阵中,下三角(包括对角线)的元素均为零。下面是一个基于C++的上三角矩阵的定义: ```cpp #include<iostream> using namespace std; class UpperTriangularMatrix { private: int *A; // 存储上三角矩阵元素的数组 int n; // 上三角矩阵的大小 public: UpperTriangularMatrix(int n) { this->n = n; A = new int[n*(n+1)/2]; } ~UpperTriangularMatrix() { delete []A; } void set(int i, int j, int x); int get(int i, int j); void display(); }; // 将上三角矩阵元素存储到数组中 void UpperTriangularMatrix::set(int i, int j, int x) { if(i <= j) { A[(i-1)*n - (i-2)*(i-1)/2 + j-i] = x; } } // 获取上三角矩阵元素 int UpperTriangularMatrix::get(int i, int j) { if(i <= j) { return A[(i-1)*n - (i-2)*(i-1)/2 + j-i]; } return 0; } // 显示上三角矩阵 void UpperTriangularMatrix::display() { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i <= j) { cout<<A[(i-1)*n - (i-2)*(i-1)/2 + j-i]<<" "; } else { cout<<"0 "; } } cout<<endl; } } int main() { UpperTriangularMatrix m(4); m.set(1,1,1); m.set(1,2,2); m.set(1,3,3); m.set(1,4,4); m.set(2,2,5); m.set(2,3,6); m.set(2,4,7); m.set(3,3,8); m.set(3,4,9); m.set(4,4,10); m.display(); return 0; } ``` 上面的代码定义了一个 `UpperTriangularMatrix` 类,通过数组来存储上三角矩阵元素。其中,`set` 方法用于设置上三角矩阵中的元素,`get` 方法用于获取上三角矩阵中的元素,`display` 方法用于在终端上打印出上三角矩阵。你可以根据需要修改这些方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43585822

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值