一、一维数组寻找第[i]位元素的地址
- 已知【起始地址】、【数组每个元素的空间大小:sizeof(ElemType)】,问【第i个元素】在哪个位置
- 那不就是简单加减乘除:【起始位置】+【第 i 个元素空间地址】×【每1个占多少空间】
- 只不过要注意数组下标索引开始是0?还是1?
二、二维数组寻找第[i]位元素的地址
1、按【行优先】存储
如图所示,那么公式很简单:
- 等于:【起始位】+(【第 0 ~ i 行,这些行的所有元素】+【第 j 个元素】)× 【每个空间占多大】
- 等于:【起始位】+(【第 i 行】×【每1行有多少个元素】+【第 j 列】)× 【每个空间占多大】
- 注意:
- 为什么**【** 第 0 ~ i 行的所有元素**】不是** 【第 i-1 行】×【每1行有多少个元素】?
- 因为数组一般从0开始,所以 i 相当于就是第 "n-1" 行了
- 为什么**【第 j 个元素】是** 加【第 j 列】,而不是 加【第 j 列】?
- 因为 j 也是从0开始的,而且求得起始地址是指这个元素 "头" 而不是 "尾",正如图中蓝色箭头
2、按【列优先】
反过来就行了:
- 等于:【起始位】+(【第 0 ~ j 列,这些列的所有元素】+【第 i 个元素】)× 【每个空间占多大】
- 等于:【起始位】+(【第 j 列】×【每1列有多少个元素】+【第 i 行】)× 【每个空间占多大】
【例题】
三、特殊矩阵 和 数组 之间关系
学过线性代数的应该知道,一个矩阵其实就是一个二维数组,型状结构是刚好可以一一对应存储的。然后有些特殊矩阵因为可以取一半的数据来推算另一半,所以可以用于压缩文件,只存一半就行了。
1、对称矩阵
特性:
- 1、必须是【n × n】的方阵
- 2、关于主对角线,上三角区的每个元素的标号【i>j】,下三角区的每个元素标号【i<j】
- 3、关于主对角线,斜着对称的两个元素【aij】=【aji】
- 所以就只用存放【下三角 + 主对角线】元素、或者只存【上三角 + 主对角线】元素,这就成功压缩了数据;然后解压的时候,根据【aij】=【aji】来推算另一半数据就行了
1)对称矩阵至少要存多少个元素?(可记公式)
记住图中的等差数列求和公式即可,也不用管下标起始0还是1,因为求得是总个数
2)矩阵元素aij ------> 对应的数组的下标位置(前提:存放按【行】优先)
若只存【下三角 + 主对角线】(【i >= j】)
注意:这里矩阵下标是从1开始,数组是从0开始
公式意思是:
- 前【0 ~ (i-1)】行所有元素之和**+ 第 i 行的第 j 个元素**
- 记得上面公式求得是【是数组里第几个元素空间】,如果【求下标】还得【-1】
- 千万别背公式,只用看懂推算逻辑,考试做题时自己画图推算
存【上三角 + 主对角线】(【i <= j】)注意:这里矩阵下标是从1开始,数组是从0开始
公式意思是:
- 既然 aij = aji
- 那么让直接换成【aji】机算,此时 i<=j 情况下,又变回了【下三角】
- 然后注意!!!!!
- 换成下三角计算的时候,不能因为【i】和【j】颠倒了,所以****不能再用【行优先】
- 【牢记】:【上三角按 "行" 优先】=【下三角按 "列" 优先】
- 具体【按 "列" 优先】怎么算看下面!!!
- 千万别背公式,只用看懂推算逻辑,考试做题时自己画图推算
3)如果按【列】优先,aij 和 数组 映射关系又怎么算?
有点抽象,先看图理解,究竟是怎么存放的
注意:这里矩阵下标是从1开始,数组是从0开始
- 然后看【下三角每一列 有几个元素】怎么算:
- 【这列尾元素】-【这列首元素】+【1】
- 然后看【下三角第 j 列中,aᵢⱼ 前面有几个元素】:
- 其实依旧是和上面一样,【这列第 i 个元素】-【这列首元素】+【1】
- 最后结合一下,【前 j-1 列的总数】+【第 j 列 aᵢⱼ 前面有几个元素】
- 【前 j-1 列的总数】把等差数列求和:(j-1)(2n - j + 2) / 2
- 【第 j 列 aᵢⱼ 前面有几个元素】:i - j + 1
- 合起来共有这么多个元素:【(j-1)(2n - j + 2) / 2】****+【i - j + 1】
- 换成数组下标的话就-1:【(j-1)(2n - j + 2) / 2】+【i - j 】
![]()
- 千万别背公式,只用看懂推算逻辑,考试做题时自己画图推算
【例题】
例题1:注意这个矩阵的下标也是从0开始的!!!!
例题2:上一题的变式,如果换成【按列优先】存储的话
例题3:
例题4:变条件换成【对称压缩矩阵】,存下三角(i >= j)
例题5
例题6:上题变一下条件?没那么简单的差值可以直接加减了怎么算?
例题7:上三角计算!!!!很容易错!!!!
例题8:一定要做多几次!!!!!!超级超级超级容易错!!!!!!!!!!!!!!!!!!
2、三角矩阵
特征:
- 就是除了【上三角 + 主对角】或【下三角 + 主对角】,其他位置都是一样的数
- 那么这些一样的数,就单独在数组最后面【开辟1个空间存】就够了
对应的【元素个数】、【映射关系】
- 这还不简单,在上面对称矩阵的基础上:
- 【上或下三角总数 + 尾部1个元素存其他值】
- 映射关系也是一样的,其他一样的值的区域值存最后一位就行了。。。不多说了
【例题】
3、三对角矩阵(带状矩阵)
特征:
- 1、标准表述就是:看下标那,若 | i - j | > 1 时,aij=0;
- 2、直观人话就是 "主对角那附近三条斜线" 非零,其他地方元素都是0
- 那不是只用存 "主对角那附近三条斜线" 那一坨非零元素就行了吗
对应的【元素个数】、【映射关系】
【元素个数】:
- 很简单,如图所示
【映射关系】
- 不好用简单的话解释。。。真没招了自己看图理解吧,我也不知道为啥这么巧妙
- 反正你就记住:
- 【(不止1行的)前 i-1 行元素总数】+【(中间行)aij 是 第i行第几个元素】
- 下标是在这个基础上-1
- 【另外】!!!如果实在不理解【j - i + 2】我们也可以猜【aij 是 第i行第几个元素】
- 我问你,下标从1开始的,A[23][24]是【这行里:3个要存的非零数】里的【第几个】?------------>A[23][23]是主对角元素,第23行第2个,so........
- A[999][998]是【这行里:3个要存的非零数】里的【第几个】?------------>A[999][999]是主对角元素,第999行第2个,so........
【例题】
4、稀疏矩阵
特征:如图所示
稀疏矩阵的考点:【怎么存储的2种形式(很简单)】
第一种:【三元组】
- 存3个值:【行】、【列】、【值】
- 然后记住:他不能【随机存取】
第二种:【十字链表法】
- 一个元素节点会连【它这一行的下一非零元素】和【它这一列下一非零元素】





































